【问题标题】:How to test code inside an rxjs subscribe method call如何在 rxjs 订阅方法调用中测试代码
【发布时间】:2018-09-03 22:03:00
【问题描述】:

所以我有一些这样的代码:

ngOnInit() {
  this.openDialogWhenUploading();
}

openDialogWhenUploading() {
    this.store.select(getFileIsUploading).pipe(
        takeUntil(this.onDestory$),
        delay(1000)
    ).subscribe(uploading => {
        if(uploading === true) {
            this.dialog.open()
        }
    })
}

为了更容易测试,我所做的是从 openDialogWhenUploading 方法返回一个 observable,然后在我的测试中订阅它,如下所示:

ngOnInit() {
  this.openDialogWhenUploading().subscribe();
}

openDialogWhenUploading() {
    return this.store.select(getFileIsUploading).pipe(
        takeUntil(this.onDestory$),
        delay(1000),
        tap(uploading => {
            if (uploading === true) {
                this.dialog.open()
            }
        })
    )
}

在我的测试中:

describe('openDialogWhenUploading', () => {
  it('should open dialog when uploading', () => {
    openDialogWhenUploading().subscribe(() => {
      expect(dialg.open).toHaveBeenCalled();
    })
  })
})

有更好的解决方案吗?

【问题讨论】:

    标签: angular jasmine rxjs


    【解决方案1】:

    我认为拥有filter 会更好吗?由于您的函数名称已经暗示只有当且仅当操作正在上传时才能打开对话框:

    openDialogWhenUploading() {
        this.store.select(getFileIsUploading)
            .pipe(
                takeUntil(this.onDestory$),
                delay(1000),
                filter(uploading=>uploading)
            );
    }
    

    您的测试非常好,应该保留。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-08-19
      • 2021-01-28
      • 2017-10-08
      • 2022-06-27
      • 2023-02-06
      • 2021-08-13
      • 1970-01-01
      相关资源
      最近更新 更多