2015-05-21 143 views
4

我有一个session.factory.js工厂:AngularJS:如何测试工厂

(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一些原因。我错过了什么?

回答

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); 

[]很重要,因为它标志着这是模块(或应用)。没有这个,模块将被视为一个依赖模块,而不是被正确创建。

+0

还未定义=/ –

+0

我做了另一次编辑。 'inject'是一样的。它返回一个函数。因此,不需要在'beforeEach'内部的另一个函数中进行换行。 –

+0

好了,现在它的工作,只是一个编辑: '''beforeEach(注(函数(_session _){ 会话= _Session_; }));''' –