【问题标题】:Should I write a unit test for a simple interaction with RxJS我应该为与 RxJS 的简单交互编写一个单元测试吗
【发布时间】:2019-03-28 15:59:29
【问题描述】:

假设我们有一个简单的类,它在 window.resize 事件上向 RxJS 主题发出一个新事件。不要注意它可能太复杂了。关键是这个类会发出一些事件。

        export class ResizeService {
          private resizeSubject = new Subject();

          public onResize(): Observable<Window> {
            return this.resizeSubject.asObservable();
          }

          constructor(private eventManager: EventManager) {
            this.eventManager.addGlobalEventListener('window', 'resize', (e) => {
              this.resizeObject.next(<Window>event.target)   
            })
          }

          private onResize(event: UIEvent) {
            this.resizeObject.next(<Window>event.target);
          }
        }

问题是,说到这个类的单元测试,我们是否应该检查我们发送给 RxJS 主题的新事件是否真的会被客户端接收,称为方法onResize。像这样的:

it('should emit a value', fakeAsync(() => {
     let subscriptionWorks = false;
     fireWindowResizeEvent(new Event({width: 600; height: 400});
     resizeService.onResize().subscribe(() => subscriptionWorks = true);
     expect(subscriptionWorks).toBeTruthy();
  })
)

如果某些开发人员将 onResizeMethod 更改为此,测试将失败:

public onResize(): Observable<Window> {
  return this.resizeSubject.asObservable().skip(10);
}

【问题讨论】:

  • 不,单元测试意味着您只关心检查您的功能,重点应该是测试是否发出事件。如果可用,您的接收客户端可以有另一组测试用例来检查这些事件(可能在客户端模拟)。
  • @nircraft,如果我不能影响我的主题,我应该如何测试它,因为它是 private?我的建议是从外部的某个地方,模仿一些客户的行为。

标签: angular typescript unit-testing rxjs


【解决方案1】:

我认为您所描述的实际上是您的 ResizeService 和您的客户端之间的集成测试。所以不,你没有。无需对其进行单元测试。

【讨论】:

  • 你的意思是“不需要单元测试”,我猜。无论如何,它应该被测试(也许不是单元测试,而是集成测试),我们不应该忽略这段代码。对吗?
猜你喜欢
  • 2010-10-05
  • 2014-10-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-08
  • 2011-02-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多