Angular2 TestBed Inject

Я тестирую службу (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. Что я не понимаю?


person James B    schedule 05.03.2017    source источник
comment
Пробовали ли вы использовать RouterModule.forRoot() в своем TestBed? Служба маршрутизатора не будет внедрена, если вы не вызовете forRoot(). Но это просто долгая съемка.   -  person dlcardozo    schedule 05.03.2017
comment
@camaron Хорошая мысль, но, к сожалению, это не исправляет. Это кажется странным, и я могу только предположить, что я что-то упускаю.   -  person James B    schedule 05.03.2017


Ответы (1)


Приятель, вы должны использовать getTestBed из @angular/core/testing и ввести его, например,

  getTestBed().get(YourService)
person Umar Younis    schedule 05.03.2017
comment
Но разве это не то, что я делаю в первом пройденном тесте? Да, это работает, и это то, что я сейчас использую, но вопрос больше в понимании функции inject. - person James B; 05.03.2017