Почему шпионская функция Жасмин в Angular не вызывается обратным вызовом? - PullRequest
0 голосов
/ 22 ноября 2018

Я хочу проверить this.communication.subscribe() вызов, который имеет обратный вызов в аргументе:

constructor (private communication: CommunicationProvider)

ngOnInit() {
    this.communication.subscribe(() => {
      this.router.navigate(["/success"]);
    });
  }

Я использовал callFake , чтобы смоделировать реализацию для вызова callback ()

beforeEach(async(() => {
    communicationSpy = jasmine.createSpyObj("CommunicationProvider", ["subscribe"]);
    routerSpy = jasmine.createSpyObj<Router>("Router", ["navigate"]);

    communicationSpy.subscribe.and.callFake((callback: any) => {
        callback();
    });
}));

it("should route on callback", (done: DoneFn) => {
    setTimeout(() => {
        expect(routerSpy.navigate).toHaveBeenCalledWith(["/success"]);
        done();
    }, 3000);
});

Согласно результатам покрытия кода, this.router.navigate(["/success"]); покрывается callback().Но "should route on callback" проверка не пройдена, поскольку routerSpy.navigate никогда не вызывается.

Почему?

1 Ответ

0 голосов
/ 22 ноября 2018

Потому что вы никогда не запускаете подписку.

Я не знаю, какой у вас сервис, но мы воспользуемся тем, что вы не используете операторы ограничения, такие как take или takeUntil.

Начните с насмешки вашего наблюдаемого как горячего потока с Subject:

component['communication'] = new Subject() as any;

Теперь у вас должен быть новый экземпляр вашего компонента в каждом тесте благодаря приспособлению createComponentInstance звонил перед каждым.Это означает, что вы уже позвонили ngOnInit и создали подписку.

Поскольку поток горячий, вы можете подписаться на него в своем тесте:

it('should navigate', done => {
  component['communication'].subscribe(() => {
    expect(routerSpy.navigate).toHaveBeenCalledWith(["/success"]);
    done();
  });

  (component['communication'] as Subject).next(true);
});

При вызове next вы запускаете подписки, запускаете маршрутизатор и ожидаете, что он будет иметьбыл вызван.

(PS: я использовал синтаксис массива и Subject, чтобы изобразить проблему, не стесняйтесь использовать все, что вы хотите, чтобы инициировать подписку и высмеивать ваши зависимости)

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