【问题标题】:AngularJS: How to test FactoriesAngularJS:如何测试工厂
【发布时间】:2015-05-21 15:48:29
【问题描述】:

我有一个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。我错过了什么?

【问题讨论】:

    标签: javascript angularjs jasmine factory


    【解决方案1】:

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

    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 模块(或应用程序)。没有这个,模块将被视为依赖模块,无法正确创建。

    【讨论】:

    • 我做了另一个编辑。 inject 是一样的。它返回一个函数。因此,没有必要在 beforeEach 中包含另一个函数。
    • 好的,现在它正在工作,只是一个编辑:beforeEach(inject(function(_Session_){ Session = _Session_; }));
    • 你不需要那些() 调用
    • @PSL 我认为你这样做是因为moduleinject 都是返回函数的工厂。还是我错了?
    • @PSL 创建 plunker 后,我确实看到了一个错误。所以,我的错。 :) 我已经进行了编辑。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-20
    • 1970-01-01
    • 2017-10-07
    • 1970-01-01
    • 1970-01-01
    • 2016-10-22
    相关资源
    最近更新 更多