angular - 如何在包含异步逻辑的Angular Component中测试Observable不会发出

标签 angular jasmine rxjs angular-test angular-testing

假设我有一个Angular Component,它定义了Observable myObs$作为其属性之一。

在一个测试中,考虑到某些条件,我想测试myObs$是否没有通知。在逻辑上涉及一些延迟,因此测试必须是异步的。

我正在使用 Jasmine

到目前为止,我已经能够制定此解决方案:

it('async test', done => {
    let dataEmitted;
    myObs$
    .pipe(
      tap(data => dataEmitted = data),
    )
    .subscribe();
    setTimeout(() => {
      if (dataEmitted) {
        done.fail('should not emit');
      } else {
        done();
      }
    }, 1000);
  });

但是我对此并不满意。我必须依靠setTimeout进行检查并调用done函数。

关于如何正确执行此类测试的任何建议?同步解决方案不起作用,因为逻辑中存在固有的异步性。

最佳答案

如果是基于 setTimeout/debounceTime等的异步逻辑,则可以使用 fakeAsync()函数对其进行测试,则该函数将同步替换所有这些异​​步操作,从而将替换为,从而将同步由于它是同步的,因此可以测试您的逻辑。您也可以使用 tick()跳过虚拟机翻转(它也同步发生!)。使用此解决方案,您将获得美观,干净,快速而可靠的单元测试。
代码示例

it('asynch test', fakeAsync(() => {
    let dataEmitted;
    myObs$.subscribe(data => dataEmitted = data);

    tick(1000);
    
    expect(dataEmitted).toBeUndefined();
}));
我建议您还检查负面的情况,例如 tick(2000)并检查它是否有值(value)。希望能有所帮助。

关于angular - 如何在包含异步逻辑的Angular Component中测试Observable不会发出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54447012/

相关文章:

javascript - Angular2 嵌套 formGroups - formArrays 和模板绑定(bind)

javascript - Jasmine spy 未被召唤

angular - 在 Angular 6 中初始化应用程序之前获取所需数据

rxjs - 在恢复之前等待 RxJs.Subscription

ajax - Jasmine Ajax request.respondWith 不工作

angular - 如何仅在满足条件时执行 rxjs 转换运算符

angular - 在 Wildfly 中刷新 Angular 应用程序时出现错误 403

angular - 为什么 Angular HttpRequest 添加私有(private)属性到 url?

html - 如何将 contentchildren 的每个 child 包装在 Angular 中自己的元素中

unit-testing - Angular 2 : How to mock ChangeDetectorRef while unit testing