Я тестирую службу (myService
) в Angular 2, которая зависит от Router
. Поскольку я использую один из компонентов Angular, я буду использовать класс TestBed
Angular. Итак, я настроил свой 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
извлечет тот же экземпляр Router
из TestBed
. Что я не понимаю?
RouterModule.forRoot()
в своемTestBed
? Служба маршрутизатора не будет внедрена, если вы не вызоветеforRoot()
. Но это просто долгая съемка. - person dlcardozo   schedule 05.03.2017