【问题标题】:Observable<void> doesn't invoke the subscriberObservable<void> 不调用订阅者
【发布时间】:2020-08-10 05:57:59
【问题描述】:

我正在努力围绕 Observable 进行单元测试,以按照我期望的方式运行。我使用 Observable 基本上只是为了通知一个过程已经完成。 loggout 函数中还没有异步代码,但是当我实现所有逻辑时会有。我不需要 observable 返回任何数据,我只希望它调用订阅者作为注销完成的信号。

问题是我的单元测试显示订阅者从未真正被调用过。我通常使用 async/await,具有讽刺意味的是,因为 Observables 做这样的事情往往让我头疼,但我试图在前端变得更好,这似乎更喜欢 Observables。

这是我正在搭建的一个新的 Angular 9 应用程序。单元测试在 Jest 中运行,我正在通过 Wallaby 运行它们。

这是我的故障排除:

我故意破坏了这个函数来验证我的单元测试是否有效。

我的测试第 63 行的灰色框是 Wallaby,表示该测试从未执行过该行。所以很自然地测试通过了,因为断言从未被检查过。

如果我更改 observable 以返回一个值,我至少可以让该行执行......有点。

但我没有从我的模拟中得到预期的失败消息。它应该报告“预期 clearSession() 被调用 1 次,为 0”

所以我运行 Jest 只是为了看看发生了什么,然后我得到了:

FAIL  src/app/auth/auth.service.spec.ts
● AuthService › logout › should destroy the session

1 timer(s) still in the queue.

  at node_modules/zone.js/dist/fake-async-test.js:621:31
  at ZoneDelegate.Object.<anonymous>.ZoneDelegate.invoke (node_modules/zone.js/dist/zone.js:386:30)
  at ProxyZoneSpec.Object.<anonymous>.ProxyZoneSpec.onInvoke (node_modules/zone.js/dist/proxy.js:117:43)
  at ZoneDelegate.Object.<anonymous>.ZoneDelegate.invoke (node_modules/zone.js/dist/zone.js:385:36)
  at Zone.Object.<anonymous>.Zone.run (node_modules/zone.js/dist/zone.js:143:47)

让事情变得非常奇怪......如果我修复了这个功能,一切都会很开心!但只要 Observable 返回一个值,即使我只使用 Observable 来通知该过程何时完成。但我无法让我的实际断言失败,它失败是因为一些看似无关的事情(队列中的计时器?不管那是什么意思)。

verify 函数来自 ts-mockito,其工作原理与 expect(someSpy).toHaveBeenCalledTimes() 函数基本相同。

我缺少关于 Observables 的一些怪癖吗?

【问题讨论】:

    标签: javascript angular typescript unit-testing observable


    【解决方案1】:

    我昨晚在 Reddit 上发布了这个问题。刚刚在那里得到了解决这个问题的答案,所以在这里发布给任何试图解决这个问题的人。

    of() 更改为of(undefined)

    【讨论】:

    • 这拯救了一天!
    【解决方案2】:

    将 of() 更改为 of(undefined) 为我工作

    it('should call myCall', fakeAsync(() => {
        myService = TestBed.inject(MyService);
        const fakeRes: Observable<void> = of(undefined);
        spyOn(myService , 'myCall').and.callFake(() => fakeRes);
        tick();
        fixture.detectChanges();
        component.myMethod();
        expect(myService.myCall).toHaveBeenCalled();
    }));
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-12-03
      • 1970-01-01
      • 2017-03-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多