Почему утверждения Jasmine expect().tohavebeencall завершаются неудачей без функции-оболочки

#angular #jasmine

#angular #jasmine

Вопрос:

Если у меня есть такая подписка

 this.submit$.subscribe(this.handleSubmit);
  

И я тестирую это так

 it('should set up a subscription on submit$', () => {
  spyOn(component, 'handleSubmit');
  component.submits$.next(data);
  expect(component.handleSubmit).toHaveBeenCalledTimes(1);
  expect(component.handleSubmit).toHaveBeenCalledWith(data);
});
  

Я получаю эту ошибку:

Error: Expected spy handleSubmit to have been called once. It was called 0 times.

Если я вместо этого создам новую анонимную функцию для обратного вызова subscribe, все будет работать правильно:

 this.submit$.subscribe(data => this.handleSubmit(data));
  

Зачем мне нужно создавать эту дополнительную функцию для прохождения тестов?

Комментарии:

1. Это потому, что подписка уже привязана к true component.handleSubmit к моменту создания шпиона?

Ответ №1:

this.submit$.subscribe(this.handleSubmit) было в конструкторе. К тому времени, когда я вызвал spyOn(component, 'handleSubmit') в тесте, конструктор уже был вызван, и подписка уже была создана. Несмотря на то, что у меня теперь был шпион handleSubmit , подписка всегда будет вызывать оригинал handleSubmit .

При использовании анонимной функции в качестве обратного вызова subscribe this.submit$.subscribe(data => this.handleSubmit(data)) подписка привязана к этой анонимной функции. Это дает мне возможность следить за handleSubmit перед его вызовом, поскольку анонимная функция не будет вызвана до отправки $ emits.

Я решил это, перейдя this.submit$.subscribe(this.handleSubmit); к ngOnInit, чтобы я мог контролировать, когда создается подписка.