#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, чтобы я мог контролировать, когда создается подписка.