单元测试具有特定语法

时间:2016-03-10 12:34:59

标签: javascript angularjs unit-testing jasmine karma-jasmine

无论何时,我正在测试一个控制器,并在其中有类似的东西。

$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不是对象错误

3 个答案:

答案 0 :(得分:2)

参考angular unit testing docs

作为服务的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

之前检查undefinedItem.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);
};