一尘不染

在单元测试AngularJS服务时注入依赖服务

angularjs

我正在测试服务A,但是服务A取决于服务B(即服务B已注入服务A)。

我已经看到了这个问题,但是我的情况有所不同,因为我认为_模拟_ 服务B而不是注入服务B的实际实例更有意义。我将用茉莉间谍对其进行模拟。

这是一个示例测试:

describe("Sample Test Suite", function() {

  beforeEach(function() {

    module('moduleThatContainsServiceA');

    inject([
      'serviceA', function(service) {
        this.service = service;
      }
    ]);

  });

  it('can create an instance of the service', function() {
    expect(this.service).toBeDefined();
  });
});

我得到的错误是:

错误:未知提供程序:serviceBProvider

我该怎么做?


阅读 278

收藏
2020-07-04

共1个答案

一尘不染

实际上,在AngularJS中,依赖注入使用“最后获胜”规则。因此,您可以在包含模块和依赖项之后在测试中定义服务,然后当您要测试的服务A将使用DI请求服务B时,​​AngularJS将提供服务B的模拟版本。

通常,这是通过定义新模块(例如MyAppMocks),在其中放置模拟服务/值然后仅将该模块添加为依赖项来完成的。

(示意上)的种类:

beforeEach(function() {
  angular.module('MyAppMocks',[]).service('B', ...));
  angular.module('Test',['MyApp','MyAppMocks']);
  ...
2020-07-04