测试依赖注入

通过TestBed解析

TestBed 扮演一个Angular 模块,与实际模块一样配置providers:

1
2
3
TestBed.configureTestingModule({
  providers: [AuthService]
});

通过TestBed的get方法可以获得注入对象

testBedService = TestBed.get(AuthService);

如果测试套件中多个测试用例都需要依赖同一个服务,可以在beforeEach中mock。

通过inject方法解析

1
2
3
4
5
it('Service injected via inject(...) and TestBed.get(...) should be the same instance',
    inject([AuthService], (injectService: AuthService) => {
      expect(injectService).toBe(testBedService);
    })
);

inject方法将spec方法包裹在内,多个依赖可以这样写:

1
2
3
4
inject(
  [token1, token2, token2],
  (dep1, dep2, dep3) => { }
)
  • 第一个数组参数是服务的Token, 第二个参数是一个方法,其参数为已解析的依赖对象。

使用 inject 方法的好处:

  • 每个spec使用说明依赖对象清晰明了.
  • 同一个测试套件中,不同的测试用例需要使用不同的mock或spy时,这种方法比在整个套件中一次性mock要灵活得多。

覆盖组件的providers属性

在实例化一个组件时,可以通过TestBed来覆盖它的providers属性。

1
2
3
4
5
class MockAuthService extends AuthService {
  isAuthenticated() {
    return 'Mocked';
  }
}

使用TestBed来覆盖属性:

1
2
3
4
TestBed.overrideComponent(
    LoginComponent,
    {set: {providers: [{provide: AuthService, useClass: MockAuthService}]}}
);

通过组件的injector解析

当组件配置了providers之后就拥有了自己的injector,当组件实例化时,它自己可以解析依赖服务而不会在请求上层TestBed的injector。

如果我们想要获取组件自己解析的服务的相同对象,可以通过fixture获取:

componentService = fixture.debugElement.injector.get(AuthService);