无论何时,我正在测试一个控制器,并在其中有类似的东西。
$scope.isSomething = function (Item) {
return ItemCollection.someItem(Item.attachedItem);
};
在业力控制台上给出错误:
TypeError:undefined不是对象(评估'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;
});
});
另外,这也是更广泛视图的代码的一部分,它给出了Item.pageUrl不是对象错误
答案 0 :(得分:2)
作为服务的ItemCollection
,您可以在使用
var ItemCollection, ItemCrtl;
beforeEach(inject(function($controller, $rootScope) {
$scope = $rootScope.$new();
ItemCollection = jasmine.createSpyObj('ItemCollection', ['someItem']);
ItemCrtl = $controller('ItemCtrl', {
$scope: scope,
ItemCollection: ItemCollection
});
});
对于Item
,方法isSomething
应该在执行Item
undefined
是Item.attachedItem
是否someItem
测试aync块很棘手。 $q
返回一个承诺。 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');
});
可以使用的角度服务在测试时创建异步函数。
我们需要解析延迟对象来测试异步任务。
var A = [1,2,3];
function calculatePartialSum(A, i) {
A.splice(0,i);
console.log('calculating sum for ', A);
return A.reduce(add, 0);
}
var add = function(a, b) {
return a + b;
}
var test = function(A) {
var sums = [];
for ( var i=0; i < A.length ; i++ ) {
console.log('calling calculate sum for i = ', i, A);
sums.push(calculatePartialSum(A, i));
}
return sums;
}
console.log( test(A));
答案 1 :(得分:0)
你必须在测试中使用模拟项数据(假设attachedItem
值是布尔值)
var item={attachedItem:true}
scope.isSomething(item)
答案 2 :(得分:0)
$scope.isSomething = function (Item) {
if(!Item.attachedItem){
Item.attachedItem=YOUR_MOCK_VALUE;
}
return ItemCollection.someItem(Item.attachedItem);
};