测试依赖注入¶
通过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);