ios - 如果 subscribeOn 背景,RxSwift TestScheduler 不起作用
问题描述
我有模拟交互器和路由器,用于对演示者演示者方法进行单元测试:
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:{}) 块中完成并获得相同的结果,仅在没有 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)
推荐阅读
- node.js - 通过扩展/超类 NodeJS 访问请求参数
- symfony - Symfony 4 Entity getter 和 setter 返回值
- node.js - MongoDB:使用 $geoNear 并非所有结果都从查询返回
- php - 在多个表中搜索并在所有表中应用条件
- odoo - (odoo10) 如何更改 pdf 发票中的行
- sql - 创建视图时缺少表达式错误
- typescript - 如何在 TypeScript 中引用同一类中的静态变量?
- swift - 如何在 Swift 中隐藏操作按钮?
- django - 信号仅在主线程中有效:scrapy
- git - 可以 - 我应该 - 在 GitHub 上的存储库之间合并吗?