Как написать jasmine.createSpyObject (...) для router.events.forEach - PullRequest
1 голос
/ 09 июля 2020

Я пытаюсь написать тестовый пример для одного из компонентов в приложении, конструктор выглядит следующим образом.

  constructor(private router: Router,
              public dialog: MatDialog,
              private tlsApiService: TlsApiService,
              private ncCutterSheetApiService: NcCutterSheetApiService,
              ) {
                this.outEvent = new EventEmitter<number>();

                router.events.forEach((event) => {
                  if(event instanceof NavigationStart) {
                    if(this.dialogRef){
                      this.dialogRef.close()
                    }
                  }
                  
                  // NavigationEnd
                  // NavigationCancel
                  // NavigationError
                  // RoutesRecognized
                });
              }

когда я пытаюсь написать имитацию маршрутизатора с помощью jasmine.createSpyObj Я получение этого сообщения.

TypeError: router.events.forEach не является функцией

Я пробовал следующие способы создания spyObject

    mockRouter = jasmine.createSpyObj(['events',['forEach']]);

    mockRouter = jasmine.createSpyObj('events',['forEach']);

    mockRouter = jasmine.createSpyObj(['events','forEach']);

У меня все та же ошибка. Я выполнил поиск в Google, пытаясь найти то, что мне нужно, и пока я не нашел то, что ищу, чтобы это работало. Любые предложения будут приветствоваться.

Ответы [ 2 ]

1 голос
/ 09 июля 2020

Чтобы создать шпиона для объекта событий на маршрутизаторе, вам нужно сначала создать объект, а затем создать своего шпиона на этом объекте:

const mockRouter = { events: jasmine.createSpyObj('events', ['forEach']) };

Как бы то ни было, лучше всего было бы переписать свой код как это:

router.events.pipe(
  filter((event): event is NavigationStart => event instanceof NavigationStart)
).subscribe((start) => {
  this.dialogRef?.close()
});

, которое вы затем можете прослушать pipe:

const mockRouter = { events: jasmine.createSpyObj('events', ['pipe']) };

Однако, возможно, лучше прослушать подписку :) но это зависит от вас

0 голосов
/ 09 июля 2020

Прежде всего, я бы предложил переписать ваш код в TS с router.events.subsribe() вместо router.events.forEach().

Подробную причину можно найти здесь

Если вы хотите переписать, пожалуйста, go вперед и измените свой TS, например ::

router.events.subscribe(event => {
 if(event instanceof NavigationStart) {
 ...
 }

 if(event instanceof NavigationEnd) {
 ...
 }

);

, а в вашем spe c .ts ::

class MockRouter {
  public ne = new NavigationEnd(0, '_url', '_url_after_redirects');

  public ns = new NavigationStart(0, 'url');

  public events = new Observable(observer => {
    observer.next(this.ne);
    observer.next(this.ns);
    observer.complete();
  });
}

Наконец,

providers: [{provide: Router, useClass: MockRouter]
...