gpt4 book ai didi

javascript - 测试跟踪最后发射值(没有完整信号)的 RxJS observable?

转载 作者:行者123 更新时间:2023-11-28 21:07:18 25 4
gpt4 key购买 nike

我进行了一些搜索,但无法为我的用例找到简单的答案。如果在 SO 上已经存在足够相似的问题,我提前道歉。

我有一个 observable,myObservable,它不断地从商店流出一个值(即它代表商店的状态)。我想用 Jest 测试我的可观察对象是否能够在商店发生变化时正确更新。

// 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 的问题。

最佳答案

此解决方案创建订阅以接收预期值、执行断言并结束测试。

虽然有点长,但它对我来说似乎很符合习惯,并且应该能够随着您应用的 react 性需求的增长而扩展。

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)
)
})
})

祝你好运!

关于javascript - 测试跟踪最后发射值(没有完整信号)的 RxJS observable?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53894004/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com