2014-04-30 4 views
8

Ich bin brandneu zu Jasmine und versuche herauszufinden, wie man das Objekt $ window.sessionStorage verspottet, wenn man ein angularjs SPA mit Jasmine testet.

(function() {        
    'use strict';       

    var serviceId = 'session';             

    // Define the service on the module. 
    // Inject the dependencies.   
    // Point to the service definition function. 
    angular.module('app').service(serviceId, ['$window', session]); 

    function session($window) {             

     var token = null;              

     var service = {     
      create: create,    
      destroy: destroy,    
      getToken: getToken,   
      read: read     
     };        

     return service;     

     ... 

     /** 
     * Get the session token 
     */ 
     function getToken() { 
      return this.token; 
     } 

     /**        
     * Read session variables from local session storage 
     */                  
     function read() {     
      this.token = $window.sessionStorage.getItem('token'); 
     }                  
    }                   
})(); 

Ein einfacher Test, den ich gerade zu tun, ich versuche, um die session Stub und meine Stub für meinen Test zu injizieren.

'use strict'; 

describe("session", function() { 
    var session; 
    var $window; 
    beforeEach(module("app")); 
/* 
    beforeEach(function() { 
     $window = {sessionStorage: {replace: jasmine.createSpy()}}; 

     module(function($provide) { 
      $provide.value('$window', $window); 
     }); 
    }); 
*/ 
    beforeEach(inject(function (_session_) { 
     session = _session_; 
    })); 

    describe("read", function() { 
     it("should read session data from the window", function() { 
      $window.sessionStorage.token = 'token';   
      session.read();       

      expect(session.getToken()).toBe('token'); 
     });           
    }); 
}); 

Antwort

10

Sie können einfach ein normales Objekt erstellen zu erreichen, was Sie benötigen, wie folgt aus:

describe("session", function() { 

    ... 

    beforeEach(inject(function (_session_, _$window_) { 
     session = _session_; 
     $window = _$window_; 

     $window.sessionStorage = { // mocking sessionStorage 
      getItem: function(key) { 
       return this[key]; 
      } 
     }; 
    })); 

    ... 
}); 
+0

im Strict-Modus funktioniert nicht: „Reference: Strenge Modus implizite Schaffung der globalen Eigenschaft‚$ verbietet Fenster '" –

+0

@StefanMasztalerz Hast du das' var $ window' über 'beforeEach' wie es in der Frage steht? –

Verwandte Themen