【问题标题】:iOS RxSwift - testing with RxTest and TestScheduler does not end / terminate test caseiOS RxSwift - 使用 RxTest 和 TestScheduler 进行测试不会结束/终止测试用例
【发布时间】:2019-02-07 06:06:19
【问题描述】:

我正在尝试了解如何正确使用 TestScheduler from RxTest 4.2 for 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
    }

【问题讨论】:

标签: swift unit-testing rx-swift swift4.2 rxtest


【解决方案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)])
//...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-20
    • 1970-01-01
    • 2018-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多