【问题标题】:testing emit to have been called in karma not working测试 emit 已在 karma 中调用不工作
【发布时间】:2021-03-24 21:24:50
【问题描述】:

我有这个方法应该总是调用发出事件:

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

});

我预期 spy emit 已被调用,我想知道出了什么问题。

【问题讨论】:

  • 一方面,您在采取行动之后 进行间谍活动。但是假设您正在谈论一个 @Output ,那么测试它的方法比检查调用的发出方法要好得多,请参见例如stackoverflow.com/a/62871934/3001761
  • @jonrsharpe 这不是一个输出,但是是的,我没有在函数之前调用间谍......我讨厌星期一。谢谢!
  • 不过,窥探你应该测试的部分东西是一种气味,想想你还能如何断言结果。
  • @jonrsharpe 我知道您来自哪里,上面的代码是与我面临的问题相关的整个方法的简化版本。感谢您的关注!

标签: angular unit-testing karma-jasmine


【解决方案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();
});

这样您不仅测试输出已被调用,而且数据是否正确。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-01
    • 2017-09-21
    • 1970-01-01
    相关资源
    最近更新 更多