我进行了一些搜索,但是找不到用例的简单答案。如果在SO上已经存在足够类似的问题,我预先表示歉意。
我有一个可观察的myObservable
,它从商店连续流式传输一个值(即它代表商店的状态)。我想用Jest测试一下,当商店发生更改时,我的Observable是否能够正确更新。
// i.e. every time the value changes, an event is emitted by myObservable
myObservable.subscribe(x => console.log(x))
所以我真正想做的是如下所示:
await myStore.set(0)
// insert here: check that `myObservable` stream is a 0
await myStore.set(5)
// insert here: check that `myObservable` stream is a 5
基本上,我需要一种在任何时间点“接入” myObservable
的方法,以查看最后一次发出的值。抱歉,这是一个n00b问题。
答案 0 :(得分:1)
我不确定这是否有效。但是您可以尝试一下。
此代码在Jasmine中,我希望在Jest中会有些相似。
adjustNothing
答案 1 :(得分:1)
此解决方案创建一个订阅以接收期望值,执行断言并结束测试。
尽管时间稍长,但对我来说似乎很惯用,并且应该能够随着应用程序的需求增长而扩展。
import { from, Observable, of } from 'rxjs'
import { concatMap, finalize, take, tap, toArray } from 'rxjs/operators'
// sample "definitions" to make the example compile
// replace "myObservable", "myStore" with actual code for expected result
const myObservable: Observable<number> = of(123)
const myStore: {
set: (number) => Promise
} = null as any
describe('my test', () => {
it('is an example', done => {
// configure observable to assert emitted values
myObservable.pipe(
// this subscription will complete after emitting 2 values
take(2),
// put all the values into a single array
toArray(),
// assert the values (that has been converted to array)
tap(vals => expect(vals).toBe([0, 5]),
// this will ensure the test does not 'hang' on observable error
finalize(() => {
// test will fail if assertion did not happen
expect.assertions(1)
done()
})
).subscribe()
// --- pick preferred way to execute - "set store value"
// option 1: set 0 then set 5 (using observables)
from(myStore.set(0)).pipe(
concatMap(() => myStore.set(5))
).subscribe()
// option 2: set 0 then set 5 (using promises)
myStore.set(0).then(() =>
myStore.set(5)
)
})
})
祝你好运!