2015-05-21 194 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_; }));''' –