AngularJS:如何测试工厂

时间:2015-05-21 15:48:30

标签: javascript angularjs jasmine factory

我有一个session.factory.js工厂:

(function() {
    'use strict';

    angular
        .module('app')
        .factory('Session', Session);

    function Session() {
        var sessionId;

        return {
            create: create,
            destroy: destroy,
            isAuthenticated: isAuthenticated
        };

        function create(id) {
            sessionId = id
        }

        function destroy() {
            sessionId = null;
        }

        function isAuthenticated() {
            return !!sessionId;
        }
    }
})();

我想测试它,所以我做了session.factory.spec.js

describe('Session', function() {
    var Session;

    beforeEach(function(){
        module('app');

        inject(function(_Session_){
            Session = _Session_;
        });
    });
});

但由于某种原因,Sessionundefined。我缺少什么?

1 个答案:

答案 0 :(得分:3)

您只需要像这样加载模块:

describe('Session', function() {
    var Session;

    beforeEach(module('app'));  //added

    beforeEach(inject(function(_Session_){
            Session = _Session_;
    });
});

module('app')返回一个函数,然后在每个函数之前调用该函数。你在OP中拥有它的方式,该函数是从未被调用过的。

inject是一样的。它应该直接位于beforeEach内。

修改

以上代码是通常的方式,但事实证明,您也可以按照OP的方式定义moduleinject函数。

building a plunker for this question之后,我可以看到问题不在于测试的定义。这实际上是模块定义方式的一个问题。

这一行:

angular
        .module('app')
        .factory('Session', Session);

应该是这样的:

angular
        .module('app', [])
        .factory('Session', Session);

[]非常重要,因为它表示这是 root 模块(或应用)。如果没有这个,模块将被视为依赖模块,而不是正确创建。