Jasmine route spy - undefined не является объектом (оценка 'navigate.calls.mostRecent().args')

Я пытаюсь выполнить модульное тестирование компонента angular2, который использует маршрутизацию. У меня есть:

class MockRouter {
}

class MockAuth {
  isLoggedIn(){
    return false;
  }
}

describe('Home', () => {
  beforeEach(() => TestBed.configureTestingModule({
    providers: [
      BaseRequestOptions,
      { provide: Router, useClass: MockRouter },
      HomeComponent,
      { provide: AuthenticationService, useClass: MockAuth }
    ]
  }));

  it('should navigate to login', inject([HomeComponent], (home: HomeComponent) => {
    let navigate = jasmine.createSpy('navigate');
    expect(navigate.calls.mostRecent().args[0]).toEqual(['/login']);
  }));
});

но я получаю сообщение об ошибке:

TypeError: undefined не является объектом (оценка 'navigate.calls.mostRecent().args') в config/spec-bundle.js (строка 41757)

Я думаю, что жасминовый шпион - правильный подход, но я что-то упустил - что я делаю не так?


person George Edwards    schedule 25.10.2016    source источник


Ответы (1)


Вы должны добавить шпиона в класс MockRouter. Так что шпион подсматривает за navigate звонками в Router

class MockRouter {
  navigate = jasmine.createSpy('navigate');
}

describe('Home', () => {
  let mockRouter;
  let fixture;
  let component: HomeComponent;

  beforeEach(() => {
     mockRouter = new MockRouter();
     TestBed.configureTestingModule({
        declarations: [ HomeComponent ]
        providers: [
          BaseRequestOptions,
          { provide: Router, useValue: mockRouter },
          { provide: AuthenticationService, useClass: MockAuth }
        ]
      });
      fixture = TestBed.createComponent(HomeComponent);
      component = fixture.createComponent;
  });

  it('should navigate to login', () => {
    // calls component.ngOnInit
    fixture.detectChanges();

    // assuming some navigation has been done
    expect(mockRouter.navigate).toHaveBeenCalledWith(['/login']);
  });
});

Уведомление:

  • HomeComponent находится в declarations, а не в providers
  • Мы храним ссылку на макет в тесте и используем useValue вместо useClass при его настройке.
person Paul Samsotha    schedule 25.10.2016