【问题标题】:Mock service injected into Angular module run block模拟服务注入 Angular 模块运行块
【发布时间】:2015-12-02 15:12:03
【问题描述】:

在我的 module.run 块中,它正在调用我创建的服务的方法。在运行我的测试时,我希望它引用一个模拟服务,而不是发出 http 请求的真实服务。我目前正在尝试测试控制器,而不是实际的运行块本身 - 如何将模拟服务注入运行功能?我曾尝试使用 $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() });
    }));

    ...........

});

【问题讨论】:

  • 测试模块的运行块对您的单元测试是否必不可少? Angular 的建议是在隔离模块中声明 run 块,以便在单元测试中很容易忽略它,请参阅docs.angularjs.org/guide/module#run-blocks
  • 我不想测试运行块,但是当我在测试中加载模块时它会自动执行,然后调用我不希望它执行的此服务

标签: angularjs unit-testing mocking jasmine inject


【解决方案1】:

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

你需要先加载你的应用

beforeEach(module("app"));

然后覆盖 MyService 定义。

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

否则应用服务实现是最后一次注册和使用的。

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

【讨论】:

  • 我也在这样做,但仍然没有得到 fakeService。有没有其他方法可以做到这一点?
猜你喜欢
  • 2016-07-14
  • 2020-12-21
  • 2019-12-13
  • 1970-01-01
  • 2020-06-13
  • 2019-12-26
  • 2015-09-11
  • 2019-01-22
  • 2023-03-15
相关资源
最近更新 更多