How to mock angularjs $window.sessionStorage with Jasmine and Karma

14,698

You can simply create an normal object to achieve what you need, like this:

describe("session", function() {

    ...

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

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

    ...
});
Share:
14,698
veilig
Author by

veilig

Code Monkey __ w c(..)o ( \__(-) __) /\ ( /(_)___) w /| | \ m m

Updated on July 25, 2022

Comments

  • veilig
    veilig almost 2 years

    I'm brand new to Jasmine and trying to figure out how to mock the $window.sessionStorage object when testing an angularjs SPA using Jasmine.

    (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');
            }                                                                       
        }                                                                           
    })(); 
    

    A simple test I'm trying to do is just stub out the sessionStorage and inject my stub for my test.

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