Невозможно прочитать свойство 'перейти' неопределенной ошибки при модульном тестировании в angular

Почему я вижу эту ошибку при выполнении модульного теста функции, которую необходимо вызвать: вот мой код, сначала код .spec.ts:

it(' doit appeller le serveur quand le boutton ok est cliqué, pour envoyer l option du choix du code', () => {
  let spy = spyOn(authService, 'choixReceptionCode').and.callFake(t => {
  // on est pas besoin de se qui retourner du serveur l essentiel la fonction a ete appelle 
  return Observable.empty();
});

component.choix('mail');
  // comme ça on a testé si la fonction 'connexion' a été appelle ou nn
  expect(spy).toHaveBeenCalled();
});

А вот функция в component.ts:

choix(choice:string)
{
  console.log("ggggggggg"+choice);
  this.router.navigate(['saisirCode']);
  this.choiceReceptionCode.choix=choice;
  this.choiceReceptionCode.user=this.serviceAuthentification.getUserId();
  this.serviceAuthentification.choixReceptionCode(this.choiceReceptionCode).subscribe(
  (data)=>{
      console.log("the response in choixReceptionCode");
      console.log(data);     


  },
  (error)=>{
      console.log("Error in choixReceptionCode ");
      console.log(error);
  });
}

при выполнении теста ng я обнаружил эту ошибку,
изображение, показывающее ошибку

Я знаю, что проблема в этой строке:

this.router.navigate(['saisirCode']);

в файле component.ts, потому что, когда я комментирую его, тест проходит, так как я могу его решить.

Большое спасибо


person Yassin Mohamadi    schedule 06.05.2018    source источник


Ответы (1)


Вы можете попробовать предоставить имитацию для роутера.

что-то вроде:

let router = jasmine.createSpyObj("Router", ["navigate"]);

а потом:

router.navigate.and.callFake(()=>Observable.of(your stubbed data to return here));

Затем создайте экземпляр своего компонента, внедрив макет маршрутизатора.

let component = new MyComponent(router);

На этом этапе вы можете вызвать this.router.navigate, находясь внутри метода choix, потому что this.router будет относиться к внедренной службе, которую вы уже высмеяли и предоставили.

person HDJEMAI    schedule 06.05.2018
comment
большое спасибо; Я нашел решение, я изменил место этой инструкции: this.router.navigate (['saisirCode']); в служебную функцию, потому что в любом случае мне нужно маршрутизировать пользователя, поэтому при вызове сервера я маршрутизирую его и делаю свой http.post просто, а функция сервера - callFake. - person Yassin Mohamadi; 07.05.2018