javascript - 在 Jest 中等待 Observer 完成

标签 javascript rxjs jestjs observable

我对 Jest 和 RxJs 还很陌生,并被要求测试一个 Observable。

const testComponents = ['test-component-1', 'test-component-2', 'test-component-3']
const nrOfComponents = testComponents.length

test('Activities get added to the taskStack', (done) => {
    launcher.observable$.subscribe((state) => {
        expect(state.taskStack).toHaveLength(nrOfComponents)
        done()
        }
    )

    testComponents.forEach((name) => {
        addActivityToTaskStack(name, 'standard')
    })
})

预期的行为显然是 state.taskStack 数组的长度为 3。但是,添加第一项后测试就已经完成。如何等待 Observable 完成然后才运行断言?

最佳答案

第一个 subscribe 回调对每个值运行。测试应该在可观察到的完成时结束,并处理错误,这可能很乏味:

let subscription = launcher.observable$.subscribe(
 function onValue(state) {
   try {
     expect(state.taskStack).toHaveLength(nrOfComponents)
   } catch (err) {
     subscription.unsubscribe();
     done.fail(err);
   }
 },
 function onError(err) {
   subscription.unsubscribe();
   done.fail(err);
 },
 function onComplete() {
   done();
 }
)

如果一个 observable 预计接收一个值然后完成,一种直接的方法是切换到 Promise,因为它们符合所描述的 observable 的语义,并且本质上受到 Jest 支持。

test('Activities get added to the taskStack', async () => {
    const state = await launcher.observable$.toPromise();
    expect(state.taskStack).toHaveLength(nrOfComponents)
})

如果有多个值,可以在 toPromise 之前收集它们进行断言,例如与 toArray 运算符。

请注意,在 RxJS 7 中,toPromise 已被弃用,取而代之的是 lastValueFrom

关于javascript - 在 Jest 中等待 Observer 完成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63313614/

相关文章:

javascript - 如何在MySQL数据库中更新数据后显示加载图像

recursion - 避免使用 RxJS5 observables 进行递归

reactjs - 如何用enzyme和Jest中的mock函数模拟点击事件?

unit-testing - 自 ag-grid 集成以来 Jest vuejs 崩溃

JavaScript 插件帮助 - ContentFlow

javascript - Angular UI Router 在 url 更改时无法获取查询参数

javascript - 单击时显示元素,不活动时再次隐藏

javascript - 为什么在 rx 2.3 中订阅两次 observable 时第二次订阅没有收到任何值?

Angular 7 缓存 API 结果

reactjs - 模拟在另一个函数中使用的函数