javascript - AngularJS:如何测试工厂

标签 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_;
        });
    });
});

但是 Session 由于某种原因 undefined。我缺少什么?

最佳答案

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

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

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

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

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

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

编辑:

上面的代码是通常的做法,但事实证明你也可以在OP 的工作方式。

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

这一行:

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

应该是这样的:

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

[] 很重要,因为它表示这是 模块(或应用程序)。否则,该模块将被视为依赖模块,无法正确创建。

关于javascript - AngularJS:如何测试工厂,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30378573/

相关文章:

javascript - 取消特定元素上的事件冒泡 - javascript

javascript - Backbone.js View 未渲染

javascript - 在指令中使用 window.open

javascript - 用于抛出 someObject 的 Jasmine 测试匹配器

javascript - 使用数据表进行非表布局

javascript - knockout validation 不显示选择多个的错误消息

javascript - 自定义 Angular Directive(指令)以在间隔中添加/删除类

javascript - 我可以将 Angular Controller 和指令放在单独的 JS 文件中吗?

javascript - 我如何使用带有 promise 和延迟的 TestScheduler?

javascript - Jasmine 单元测试具有两个依赖项的 AngularJS 工厂($http 和另一个返回 promise 的工厂)