Heather Roberts
Heather Roberts

Reputation: 2138

Mock service injected into Angular module run block

In my module.run block it is calling a method on a service I have made. When running my tests I want it to reference a mock service instead of the real one which is making http requests. I am currently trying to test a controller, not the actual run block itself - how can I inject the mock service into the run function? I have tried using $provide.factory but it doesn't seem to do anything and is still loading the service as normal.

I am using Jasmine to write my tests.

app.js

angular.module("app")
    .run(function(MyService) {
        MyService.log("starting app");
    });

test.js

describe("MyController", function() {

    beforeEach(function() {
        module(function ($provide) {
            $provide.factory("MyService", { log: function(){} });
        });
    });

    // I want module 'app' to execute its run function using injected value for MyService
    beforeEach(module("app"));

    beforeEach(inject(function($controller, $rootScope) {
        MyController = $controller("MyController", { $scope: $rootScope.$new() });
    }));

    ...........

});

Upvotes: 3

Views: 3266

Answers (1)

milanlempera
milanlempera

Reputation: 2263

In this case is important order.

You need load your app first

beforeEach(module("app"));

and then overwrite MyService definition.

beforeEach(
  module({
    "MyService": {
      log: function(message) {
        console.log("MyFakeService called: " + message);
      }
    }
  })
);

Otherwise app service implementation is last registred and used.

working example is here - look to the console http://plnkr.co/edit/BYQpbY?p=preview

Upvotes: 5

Related Questions