router.navigate test TypeError: Невозможно прочитать свойство 'root' из неопределенного - PullRequest
0 голосов
/ 21 февраля 2019

Я пытаюсь создать простой тест для метода, который содержит router.navigate внутри, к сожалению, я думаю, что в моих импортах должен быть RouterTestingModule.Из-за этого я импортирую RouterTestingModule, и у провайдеров у меня также есть Router, чтобы шпионить за навигацией.При этом я получил эту ошибку, которая может быть из-за переопределения маршрутизаторов.

Метод в компоненте

onUserInfo() {
    this.router.navigate(['student/info']);
  }

и файл спецификации:

fdescribe('NavbarComponent', () => {
    let component: NavbarComponent;
    let fixture: ComponentFixture<NavbarComponent>;
    let appStore: Store<fromApp.State>
    const fakeUser = { username: '', password: '', role: 'PARENT' }
    let mockRouter;

    beforeEach(async(() => {
        mockRouter = {
            navigate: jasmine.createSpy('navigate')
          }

        TestBed.configureTestingModule({
            imports: [
                RouterTestingModule,
                SharedModule,
                AuthModule,
                MaterialModule,
                StoreModule.forRoot(reducers),
                EffectsModule.forRoot([AuthEffects, UserEffects])
            ],
            declarations: [
                AppComponent,
                WelcomeComponent,
                NavbarComponent,
                ProjectInfoComponent
            ],
            providers: [
                { provide: Router, useValue: mockRouter},

            ]
        }).compileComponents();

        appStore = TestBed.get(Store);
    }));

    beforeEach(() => {
        fixture = TestBed.createComponent(NavbarComponent);
        component = fixture.componentInstance;
        fixture.detectChanges();
    });
 it('test', fakeAsync(()=> {
        fixture.detectChanges();

        component.onUserInfo();
          expect(mockRouter.navigate).toHaveBeenCalledWith(['student/info']);

    }))

Может кто-нибудь дать мне подсказку по этому вопросу?Когда я удаляю RouterTestingModule, я получаю

'router-outlet' is not a known element:

, когда удаляю {предоставляем: Router, useValue: mockRouter} Я получу

Expected spy navigate to have been called with [ [ 'student/info' ] ] but it was never called.

Есть ли обходной путь?Заранее спасибо.

РЕДАКТИРОВАТЬ (РЕШЕНИЕ)

fdescribe('NavbarComponent', () => {
    let component: NavbarComponent;
    let fixture: ComponentFixture<NavbarComponent>;
    let appStore: Store<fromApp.State>
    const fakeUser = { username: '', password: '', role: 'PARENT' }
    let router: Router

    beforeEach(async(() => {
        TestBed.configureTestingModule({
            imports: [
                RouterTestingModule.withRoutes(routes),
                SharedModule,
                AuthModule,
                MaterialModule,
                StoreModule.forRoot(reducers),
                EffectsModule.forRoot([AuthEffects, UserEffects])
            ],
            declarations: [
                AppComponent,
                WelcomeComponent,
                NavbarComponent,
                ProjectInfoComponent
            ],
            providers: [
            ]
        }).compileComponents();

        appStore = TestBed.get(Store);
        router = TestBed.get(Router)

    }));

    beforeEach(() => {
        fixture = TestBed.createComponent(NavbarComponent);
        component = fixture.componentInstance;
        fixture.detectChanges();
    });


    it('asd', fakeAsync(()=> {
        fixture.detectChanges();

        let navigateSpy = spyOn(router, 'navigate');
        component.onUserInfo();
        expect(navigateSpy).toHaveBeenCalledWith(['student/info']);

    }))
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...