gpt4 book ai didi

javascript - 在为 RXJS observables 编写测试时,如何避免通过我的业务逻辑传递调度程序?

转载 作者:行者123 更新时间:2023-11-29 14:45:39 24 4
gpt4 key购买 nike

我发现让某些测试通过的唯一方法是明确地将调度程序传递给函数。为了便于说明,请考虑以下功能:

function doStuff( stream ){
return stream.delay(100)
.filter( x => x % 2 === 0 )
.map( x => x * 2 )
.flatMapLatest( x=> Rx.Observable.range( x, x+100) )

还有一个测试:

it('example test', () => {
let scheduler = new Rx.TestScheduler()
let xs = scheduler.createHotObservable(
onNext(210, 1),
onNext(220, 2),
onNext(230, 3)
)

let res = scheduler.startScheduler(
() => doStuff( xs, scheduler ),
{created:0, subscribed:200, disposed:1000})

expect( res.messages ).toEqual( [
onNext(321, 4),
onNext(322, 5),
onNext(323, 6)
] )
})

这给出了一个错误:

    Expected [  ] to equal [ ({ time: 321, value: OnNextNotification({ value: 4, kind: 'N' }), comparer: Function }), ({ time: 322, value: OnNextNotification({ value: 5, kind: 'N' }), comparer: Function }), ({ time: 323, value: OnNextNotification({ value: 6, kind: 'N' }), comparer: Function }) ].

这表明延迟发生在真实时间而不是 TestScheduler 的模拟时间。

如果我将调度程序传递给每个运算符(operator),那么我可以让它工作:

function doStuff( stream, scheduler ){
return stream.delay( 100, scheduler )
.filter( x => x % 2 === 0 )
.map( x => x * 2 )
.flatMapLatest( x => Rx.Observable.range(x, 3, scheduler ) )
}

但我觉得我应该能够设置一次调度程序,而不必让我的实际生产代码将其线程化。我真的很期待,假设原始流是从 TestScheduler 创建的,然后通过相同的调度程序运行,这一切都会自动连接起来。

最佳答案

RX 指南建议 consider passing a specific scheduler to concurrency introducing operators .对于单线程 Javascript,没有并发性,但像 delay() 这样的基于时间的运算符也有类似的问题。

这并没有我最初想象的那么糟糕,因为大多数操作符没有调度器参数,而且只有一部分是基于时间的。这突出了为什么你会明确地传递一个调度程序。在我上面的示例中,我将调度程序传递给支持它的每个运算符(operator),但结果并不完全符合我的预期 - 我什至调整了我的“预期”结果以使其工作:

expect( res.messages ).toEqual( [
onNext(321, 4),
onNext(322, 5),
onNext(323, 6)
] )

但实际上,我期望所有这些时间都是 320

对于 delay(),我需要从测试中继承调度器,但是对于 range(),我需要默认调度器,因为它将调度事件立即。

我的最终示例代码片段将如下所示:

function doStuff( stream, scheduler ){
return stream.delay( 100, scheduler )
.filter( x => x % 2 === 0 )
.map( x => x * 2 )
.flatMapLatest( x => Rx.Observable.range(x, 3))
}

创建测试时,您总是希望将 TestScheduler 用于基于时间的运算符。无论测试是否正在运行,其他运算符(operator)可能都希望使用 DefaultScheduler。

关于javascript - 在为 RXJS observables 编写测试时,如何避免通过我的业务逻辑传递调度程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33283214/

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