У меня есть этот метод, в котором всегда должно вызываться событие emit:
changeDate() {
let dateFrom = moment(this.dateFromControl.value, 'YYYY-MM-DD');
let dateTo = moment(this.dateToControl.value, 'YYYY-MM-DD');
const formDate = {
dateFrom: moment(dateFrom).isValid() ? moment(dateFrom).format('YYYY-MM-DD') : '',
dateTo: moment(dateTo).isValid() ? moment(dateTo).format('YYYY-MM-DD') : ''
}
this.dateForm.emit(formDate);
}
и это тест для него:
it('should validate changeDate', (done) => {
component.dateFromControl.patchValue('01-01-2020');
component.dateToControl.patchValue('11-11-2020');
component.changeDate();
spyOn(component.dateForm, 'emit');
expect(component.dateForm.emit).toHaveBeenCalled();
done();
});
Я получаю ожидаемое шпионское излучение, и мне интересно, что не так.
@jonrsharpe это не выход, но да, я не звонил шпиону перед функцией ... Я ненавижу понедельники. Спасибо!
Тем не менее, слежка за частью того, что вы должны тестировать, — это запах, подумайте, как еще вы могли бы утверждать результат.
@jonrsharpe Я понимаю, откуда вы, приведенный выше код представляет собой упрощенную версию всего метода, который имел отношение к проблеме, с которой я столкнулся. Спасибо за беспокойство!
Вместо этого попробуйте подписаться на вывод:
it('should validate changeDate', (done) => {
component.dateForm.subscribe(data => {
expect(data.dateFrom).toBe('2020-01-01');
expect(data.dateTo).toBe('2020-11-11');
done();
});
component.dateFromControl.patchValue('01-01-2020');
component.dateToControl.patchValue('11-11-2020');
component.changeDate();
});
Таким образом вы не только проверяете, был ли вызван вывод, но и что данные верны.
Во-первых, вы шпионите после совершения действия. Но если вы говорите о @Output, есть гораздо лучшие способы проверить его, чем проверка вызова метода emit, см., например. stackoverflow.com/a/62871934/3001761