AngularJS: 如何测试工厂

AngularJS: How to test Factories

我有一个 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。我缺少什么?

你只需要像这样加载你的模块:

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

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

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

module('app') returns 然后在每个函数之前调用的函数。按照您在 OP 中的方式,该函数是通过从未调用创建的。

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

编辑:

上面的代码是通常的做法,但原来你也可以定义moduleinject函数OP 正在做。

building a plunker for this question之后,我可以看出问题不在测试的定义中。其实是模块定义方式的问题

这一行:

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

应该是这样的:

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

[] 很重要,因为它表示这是 root 模块(或应用程序)。如果没有这个,该模块将被视为依赖模块并且无法正确创建。