角度 2 - 何时使用注入功能,何时不使用它



我在 Angular2 中创建规范/单元测试时有一个问题。每当您注入模拟服务时,何时使用注入函数如下

it('function that the component calls',
  inject([MyService], (service: MyService) => { // ...
}));

或者你什么时候使用它作为下面的那个

beforeEach(() => {
  let myMockService = new MyMockService();
  TestBed.configureTestingModule({
    providers: [
      { provide: MyService, useValue: myMockService }
    ]
  });
  TestBed.overrideComponent(MyComponent, {
    set: {
      providers: [
        { provide: MyService, useValue: myMockService }
      ]
    }
  });
})

有人可以启发我这件事吗?

使用它的主要原因是在 Angular 创建服务时访问测试中的服务。例如

providers: [ MyService ]

在这里,Angular正在创建它,你只能通过Angular的注入器访问它。

但是您正在将服务作为价值提供,那么无需使用inject,因为您已经可以访问它

let serviceInstance = new Service();
provider: [ { provide: MyService, useValue: serviceInstance } ]

在这里,您已经可以访问serviceInstance因此无需从注射器获取它。

此外,如果您不需要访问测试中的服务,那么甚至不需要尝试访问它。但有时你的模拟会在测试中有一些你想做的事情。

除了inject,只有访问服务的方法

你可以...

对于您的特定示例,您根本不需要inject。您只需要将模拟移动到beforeEach范围之外,以便it可以使用它

let myMockService = new MyMockService();
beforeEach(() => {
})
it('function that the component calls', () => {
  myMockService.doSomething();
}));

你可以...

与其使用inject,你可以从TestBed得到它,它就像一个喷油器。也许这是首选,因为您可以将其添加到您的beforeEach

let service;
beforeEach(() => {
  TestBed.configureTestingModule({
    providers: [ MyService ]
  });
  service = TestBed.get(MyService);
})
it('function that the component calls', () => {
  service.doSomething();
}));

你可以...

从也像喷油器一样的DebugElement中获取它

it('function that the component calls', () => {
  let fixture = TestBed.createComponent(TestComponent);
  let service = fixture.debugElement.get(MyService);
}));

所以这真的是一个偏好问题。我个人尝试停止使用 inject ,因为还有其他不那么冗长的选项。

当您想要从提供中获取传递到测试代码(例如 HTTP MockBackend(或您希望直接在测试代码中与之通信的任何其他服务的实例时,可以使用 inject()

TestBed.configureXxx仅为测试组件设置提供程序。

最新更新