我对 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/