Тестирование излучения, которое было вызвано в карме, не работает

У меня есть этот метод, в котором всегда должно вызываться событие 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();

});

Я получаю ожидаемое шпионское излучение, и мне интересно, что не так.

Во-первых, вы шпионите после совершения действия. Но если вы говорите о @Output, есть гораздо лучшие способы проверить его, чем проверка вызова метода emit, см., например. stackoverflow.com/a/62871934/3001761

jonrsharpe 14.12.2020 09:25

@jonrsharpe это не выход, но да, я не звонил шпиону перед функцией ... Я ненавижу понедельники. Спасибо!

monxas 14.12.2020 09:37

Тем не менее, слежка за частью того, что вы должны тестировать, — это запах, подумайте, как еще вы могли бы утверждать результат.

jonrsharpe 14.12.2020 09:38

@jonrsharpe Я понимаю, откуда вы, приведенный выше код представляет собой упрощенную версию всего метода, который имел отношение к проблеме, с которой я столкнулся. Спасибо за беспокойство!

monxas 14.12.2020 09:42
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Angular и React для вашего проекта веб-разработки?
Angular и React для вашего проекта веб-разработки?
Когда дело доходит до веб-разработки, выбор правильного front-end фреймворка имеет решающее значение. Angular и React - два самых популярных...
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Мы провели Twitter Space, обсудив несколько проблем, связанных с последними дополнениями в Angular. Также прошла Angular Tiny Conf с 25 докладами.
Угловой продивер
Угловой продивер
Оригинал этой статьи на турецком языке. ChatGPT используется только для перевода на английский язык.
Мое недавнее углубление в Angular
Мое недавнее углубление в Angular
Недавно я провел некоторое время, изучая фреймворк Angular, и я хотел поделиться своим опытом со всеми вами. Как человек, который любит глубоко...
Освоение Observables и Subjects в Rxjs:
Освоение Observables и Subjects в Rxjs:
Давайте начнем с основ и постепенно перейдем к более продвинутым концепциям в RxJS в Angular
0
4
585
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вместо этого попробуйте подписаться на вывод:

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();
});

Таким образом вы не только проверяете, был ли вызван вывод, но и что данные верны.

Другие вопросы по теме