Jasmine和AngularJS - 当函数用作依赖项时如何测试工厂函数

时间:2016-08-01 22:32:39

标签: javascript angularjs unit-testing jasmine

我有以下简单的工厂,我想写一个单元测试。

    (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函数,但不确定我将如何去做。我可能错过了一些非常明显的东西,所以非常感谢任何帮助。

1 个答案:

答案 0 :(得分: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);
});});