gpt4 book ai didi

ios - 如果 subscribeOn 背景,RxSwift TestScheduler 不工作

转载 作者:塔克拉玛干 更新时间:2023-11-02 22:00:36 24 4
gpt4 key购买 nike

我有模拟交互器和路由器用于演示者的单元测试演示者方法:

private func presenterMethod(_ isOn: Bool) -> Driver<Bool> {
return interactor.interactorMethod(isOn)
.subscribeOn(ConcurrentDispatchQueueScheduler(qos: .background))
.observeOn(MainScheduler.instance)
.do(onError: { [weak self] error in
self?.view.showError(error)
})
.asDriver(onErrorJustReturn: !isOn)
}

然后测试

func testPresenterMethod() {
let trigger = self.scheduler.createHotObservable([
next(100, (false)),
next(200, (true)),
next(300, (false))
]).asDriverOnErrorJustComplete()

let observer = scheduler.createObserver(Bool.self)
let input = createInput(presenterTrigger: trigger)
let output = presenter.transform(input)

scheduler.scheduleAt(0, action: {
output.presenterMethodOutput.asObservable()
.subscribe(observer)
.disposed(by: self.disposeBag)
})

scheduler.start()

let results = observer.events.map {
$0.value.element
}

XCTAssertEqual(results, [false, true, false])
}

结果是空的,

只有当我从 presenterMethod 中删除这些行时,这个测试才能正常工作

    .subscribeOn(ConcurrentDispatchQueueScheduler(qos: .background))
.observeOn(MainScheduler.instance)

我尝试使用 XCTestExpectation 并在 do(onNext:{}) block 中完成并获得相同的结果,仅在没有 subscribeOn 背景的情况下工作。方法在设备和模拟器上工作正确,presenterMethod 在开关上被触发并发出正确的事件。应该如何编写此测试以与 SubscribeOn 后台一起使用?

最佳答案

您实际上希望传递给 subscribeOn 的调度器成为演示者上的可配置变量。

因为测试最好同步运行,传递测试调度程序将确保无需等待异步执行。

struct Presenter {
let mainScheduler: SchedulerType
let backgroundScheduler: SchedulerType

init(backgroundScheduler: SchedulerType = ConcurrentDispatchQueueScheduler(qos: .background), mainScheduler: SchedulerType = MainScheduler.instance) {
self.mainScheduler = mainScheduler
self.backgroundScheduler = backgroundScheduler
}

private func presenterMethod(_ isOn: Bool) -> Driver<Bool> {
return interactor.interactorMethod(isOn)
.subscribeOn(backgroundScheduler)
.observeOn(mainScheduler)
.do(onError: { [weak self] error in
self?.view.showError(error)
})
.asDriver(onErrorJustReturn: !isOn)
}
}

然后,在测试中创建演示者时

let presenter = Presenter(backgroundScheduler: self.scheduler, mainScheduler: self.scheduler)

关于ios - 如果 subscribeOn 背景,RxSwift TestScheduler 不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53468918/

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