2016-08-01 58 views
0

我有以下简单的工厂,我想写一个单元测试。Jasmine和AngularJS - 当函数被用作依赖时如何测试工厂函数

(function() { 
    "use strict"; 

    angular 
     .module("math") 
     .factory("addservice", [addTwoNumbers]); 

    function addTwoNumbers(a, b) { 
     return a + b; 
    } 
    return { add: addTwoNumbers }; 
})(); 

这是我迄今在我的测试规范。

describe('adding two numbers', function() { 
    var addService; 

    beforeEach(function() { 
     module('math'); 
     inject(function ($injector) { 
      addService = $injector.get('addservice'); 
     }); 
    }); 
    it('should add two numbers and get 2', function() { 
     var result = addService.add(1, 1); 
     expect(result).toBe(2); 
    }); 
}); 

当试图运行这个单元测试我得到TypeError:addService.add不是一个函数。我会注意到,如果我将工厂声明更改为下面的代码,我可以得到这个工作,但是我们遇到了一个问题,那就是缩小了参数名称并将其更改为a,b,c等。 (当传递$ q,$ http和许多其他依赖项时)并破坏代码,所以我们转向了上面所看到的。这显然是一个非常基本的例子,这就是为什么我无法得到这个工作是如此令人沮丧。

(function() { 
    "use strict"; 

    angular 
     .module("math") 
     .factory('addservice', [function() { 
     function addTwoNumbers(a, b) { 
      return a + b; 
     } 
     return { add: addTwoNumbers }; 
    } 
     ]); 
})(); 

看来我需要引用addTwoNumbers函数,但不知道该怎么去做。我可能错过了一些非常明显的东西,所以不胜感激。

回答

0

好吧,我想通了这个例子有什么问题。它结束了,如果我重构我的工厂有点我可以简单地打个电话在我的单元测试属性twoNumbersAddedTogether后,我得到了工厂本身的参考。我在下面提供了新的单元测试和工厂代码。

工厂代码

(function() { 
    "use strict"; 

    angular 
    .module("math") 
    .factory("addservice", [addTwoNumbers]); 

    function addTwoNumbers() { 

     return {twoNumbersAddedTogether: dotheMath} 

     function dotheMath(a,b) { 
      return a + b; 
     } 
    } 
})(); 

单元测试代码

describe('adding two numbers', function() { 
var addService; 

beforeEach(function() { 
    module('math'); 
}); 

beforeEach(inject(function (_addservice_) { 
    addService = _addservice_; 

})); 

it('should add two numbers', function() { 
    var result = addService.twoNumbersAddedTogether(1, 1); 
    expect(result).toBe(2); 
});});