javascript - 测试 eventEmiters 的最佳方式?

标签 javascript angular unit-testing jasmine

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

@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'});
}

或者像这样的 spy :

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

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

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

感谢您的宝贵时间。

最佳答案

他们以不同的方式测试同一件事。

我同意你的第二种形式更容易阅读,因为

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

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

关于javascript - 测试 eventEmiters 的最佳方式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49095895/

相关文章:

javascript - 将用户输入的数据推送到 JavaScript 内的 JSON 中

javascript - 如何将 Kotlin 编译成 TypeScript?

javascript - Angular 2,从主题可观察到的节流时间

angular - Angular2 中的响应式(Reactive)表单模块

javascript - 开始使用 Enzyme 和 Jest 测试 React 组件

原始变量更改后的javascript变量更改值

javascript - 监控对象属性的变化

javascript - Angular 2 |无法分配给数组,因为它是常量或只读属性

java - 如何在 Gradle 中为单个测试类并行执行 JUnit 测试

node.js - 使用 jasmine 和 grunt 测试多个版本的 jquery