【发布时间】: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