【问题标题】:Best way to test eventEmiters?测试 eventEmiters 的最佳方法?
【发布时间】:2018-08-12 05:57:52
【问题描述】:

假设我有一个像这样的简单组件:

@Component({
  selector: 'my-test',
  template: '<div></div>'
})

export class test {

  @Output selected: EventEmitter<string> = new EventEmitter<string>();

  public onSelect(event: any) {
    this.selected.emit(event.data);
  }
}

测试它的最佳方法是什么?我见过这样的订阅:

it('should emit the selected item', (done) => {

  myTest.selected.subscribe((result) => {

    expect(result).toBe('123');
    done();
  }
  //Act
  myTest.onSelect({data:'123'});
}

或者像这样的间谍:

it('should emit the selected item', () => {

  spyOn(myTest.selected, 'emit');
  //Act
  myTest.onSelect({data:'123'});
  //Assert
  expect(myTest.selected.emit).toHaveBeenCalledWith('123');
}

这两个构造通过了测试。我认为第二个更简单,所以我的问题是:这两个构造是否等效?是否有理由更好地使用第一个测试而不是第二个测试?为什么?

感谢您的宝贵时间。

【问题讨论】:

    标签: javascript angular unit-testing jasmine


    【解决方案1】:

    他们以不同的方式测试相同的东西。

    我同意你的第二个表格更容易阅读,因为

    1. AAA 语法从上到下流动,而不是在回调内部流动
    2. 您正在测试直接效果(emit 被调用)

    这与测试代码中不可见的间接效果(调用subscribe)形成对比。

    【讨论】:

      猜你喜欢
      • 2015-10-01
      • 1970-01-01
      • 2012-05-03
      • 2019-08-06
      • 2016-06-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-22
      相关资源
      最近更新 更多