我正在Angular 2中测试一个对Router
的依赖性的服务(myService
)。由于我使用了Angular的一个组件之一,因此我将使用Angular的TestBed
类。因此,我设置了beforeEach
如下:
let router: Router;
beforeEach(async(() => {
TestBed.configureTestingModule({
providers: [
{provide: Router, useClass: RouterStub}
]
});
router = TestBed.get(Router);
myService = new MyService(router);
}));
其中RouterStub
定义为
@Injectable()
export class RouterStub {
navigate() {};
}
现在,我将测试写为失败(红色,绿色,重构...)
it('on myServiceMethod calls router', () => {
let spy = spyOn(router, 'navigate');
// myService.myServiceMethod(); // commented out so test fails
expect(spy).toHaveBeenCalledTimes(1);
})
和测试均按预期失败。但是,我现在尝试使用TestBed
Inject
功能编写相同的测试,即
it('on myServiceMethod calls router', () => {
inject([Router], (router: Router) => {
let spy = spyOn(router, 'navigate');
// myService.myServiceMethod(); // commented out so test fails
expect(spy).toHaveBeenCalledTimes(1);
})
})
,即使我认为Inject
功能将从TestBed
检索Router
的同一实例,该测试也通过。我不理解什么?
搭配它应该使用 @angular/core/testing
中的 getTestBed
,然后将其注入
getTestBed().get(YourService)