Injecting mock service

Using $provide

by eitanp461

HTML

<script src="http://pivotal.github.io/jasmine/lib/jasmine-1.3.1/jasmine.js"></script>
<script src="http://pivotal.github.io/jasmine/lib/jasmine-1.3.1/jasmine-html.js"></script>
<link rel="stylesheet" href="http://pivotal.github.io/jasmine/lib/jasmine-1.3.1/jasmine.css">
<script src="http://code.angularjs.org/1.0.5/angular.js"></script>
<script src="http://code.angularjs.org/1.0.5/angular-mocks.js"></script>

JavaScript

//--- CODE --------------------------
var myApp = angular.module('myApp', []);

// Create a map-based configuration service 
myApp.service('ConfigurationService', function () {
    var map = { 'key' : 'real value'};
    this.get = function (key) {
        return map[key];
    }
});

// Create a service with dependencies
myApp.provider('MyService', function () {
    this.$get = ['ConfigurationService',

    function (ConfigurationService) {
        return {
            foo: function (key) {
                // Get value from configuration service dependency
                return ConfigurationService.get(key);
            }
        };
    }];
});

// --- SPECS -------------------------

describe('myApp', function () {

    beforeEach(function () {
        // Initialize myApp injector
        module('myApp');
    });
    
    describe('MyService', function() {
        beforeEach(function () {
            // Replace ConfigurationService injector with mock implementation
            ConfigurationServiceMock = jasmine.createSpyObj('ConfigurationService', ['get']);
            module(function ($provide) {
                $provide.value('ConfigurationService', ConfigurationServiceMock);
            });
        });
        
        it('uses the mock configuration service', inject(function (MyService) {
            ConfigurationServiceMock.get.andReturn('mock data1');
            expect(MyService.foo('key')).toEqual('mock data1');
        }));
    
        it('injects the mock configuration service anywhere', inject(function (ConfigurationService) {
            ConfigurationServiceMock.get.andReturn('mock data2');
            expect(ConfigurationService.get('key')).toEqual('mock data2');
        }));
    });

    describe('ConfigurationService', function() {
        it('uses the real configuration service', inject(function (ConfigurationService) {
            expect(ConfigurationService.get('key')).toEqual('real value');
        }));
    });
});


// --- Runner...