我试图了解如何正确地将TestScheduler
中的RxTest 4.2
用作RxSwift 4.2
。
如何正确创建TestScheduler并将事件传递给它,以便在执行所有事件后终止计划程序?
下面的代码在启动测试计划程序时进入无限循环。因为它一直保持同步循环,所以我没有机会从测试中停止调度程序
var testScheduler: TestScheduler = TestScheduler(initialClock: 0)
let stateObserver = testScheduler.createObserver(Bool.self)
subject.outputRelay.bind(to: stateObserver).disposed(by: bag)
let events = [next(1,true), next(10,false)]
let hotObservable = testScheduler.createHotObservable(events)
//direct events to the given relay
hotObservable.bind(to: subject.inputRelay).disposed(by: bag)
testScheduler.start() //infinite loop
//do not get called
XCTAssertEqual(stateObserver.events, [next(0, InterfaceState.started)])
testScheduler.stop()
我将发布范围缩小到TestScheduler
中的此方法调用。订阅处理似乎有问题
func findNext() -> VirtualSchedulerItem<VirtualTime>? {
while let front = _schedulerQueue.peek() {
if front.isDisposed {
//this never gets called
_schedulerQueue.remove(front)
continue
}
return front
}
return nil
}
答案 0 :(得分:1)
在这种情况下,我要做的是在特定的时间安排一个块,我知道所有测试都应该完成,然后停止订阅。我认为您的情况应该是这样的:
//...
let hotObservable = testScheduler.createHotObservable(events)
let disposable = hotObservable.bind(to: subject.inputRelay)
testScheduler.scheduleAt(1) {
disposable.dispose()
}
testScheduler.start()
XCTAssertEqual(stateObserver.events, [next(0, InterfaceState.started)])
//...