gpt4 book ai didi

javascript - 使用特定语法对 Controller 进行单元测试

转载 作者:行者123 更新时间:2023-11-30 16:13:15 26 4
gpt4 key购买 nike

无论何时,我都在测试一个 Controller 并且里面有这样的东西。

$scope.isSomething = function (Item) {
return ItemCollection.someItem(Item.attachedItem);
};

在 karma 控制台上给出错误:

TypeError: undefined is not an object (evaluating 'Item.attachedItem')

我只是像这样从测试文件中调用函数:

scope.isSomething();

我需要模拟 Item.attachedItem 或我在这里遗漏了一些东西。请详细解释,因为这发生在多个文件中。提前致谢

另外,对于这种类型的代码

   .controller('itemCtrl', function (itemCollection) {
var vm = this;
this.itemCollection= itemCollection;
itemCollection.someItem().then(function (Item) {
vm.pageUrl = Item.pageUrl;
vm.Item= Item.someItems;
});
});

此外,这也是更广泛的 View 代码的一部分,它给出了 Item.pageUrl is not a object 错误

最佳答案

引用angular unit testing docs

ItemCollection 是一项服务,您可以在使用

初始化 Controller 时注入(inject)模拟
    var ItemCollection, ItemCrtl;
beforeEach(inject(function($controller, $rootScope) {
$scope = $rootScope.$new();
ItemCollection = jasmine.createSpyObj('ItemCollection', ['someItem']);

ItemCrtl = $controller('ItemCtrl', {
$scope: scope,
ItemCollection: ItemCollection
});
});

对于 ItemisSomething 方法应该在执行 之前检查 Item 是否为 undefined >Item.attachedItem

测试 ync block 很棘手。 someItem 返回一个 promise 。 $q 可用于在测试时创建异步函数的 Angular 服务。我们需要解析延迟对象来测试异步任务。

    var ItemCollection, ItemCrtl, deferedObj;
beforeEach(inject(function($controller, $rootScope, $q) {
$scope = $rootScope.$new();
deferedObj = $q.defer();
ItemCollection = jasmine.createSpyObj('ItemCollection', ['someItem']);
ItemCollection.someItem.andReturn(deferedObj.promise);

ItemCtrl = $controller('ItemCtrl', {
$scope: scope,
ItemCollection: ItemCollection
});
});

it('sets page url', function() {
deferedObj.resolve({ pageUrl: 'http://url', someItems: [1,2,3] });
scope.$apply();
expect(ItemCtrl.pageUrl).toEqual('http://url');
});

关于javascript - 使用特定语法对 Controller 进行单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35916656/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com