模拟服务注入Angular模块运行块

时间:2015-09-07 06:24:50

标签: angularjs unit-testing mocking jasmine inject

在我的module.run块中,它正在调用我所做的服务上的方法。在运行我的测试时,我希望它引用模拟服务而不是正在发出http请求的模拟服务。我目前正在尝试测试一个控制器,而不是实际的运行块本身 - 如何将模拟服务注入到run函数中?我尝试过使用$ provide.factory,但它似乎没有做任何事情,仍然正常加载服务。

我正在使用Jasmine编写测试。

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

    ...........

});

1 个答案:

答案 0 :(得分:5)

在这种情况下是重要的顺序。

您需要先加载您的应用

beforeEach(module("app"));

然后覆盖MyService定义。

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

否则,最后会注册并使用应用服务实施。

工作示例在这里 - 查看控制台http://plnkr.co/edit/BYQpbY?p=preview