• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

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

[复制链接]
菜鸟教程小白 发表于 2022-12-11 20:51:55 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题

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

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 背景一起使用?



Best Answer-推荐答案


您实际上希望传递给 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/

回复

使用道具 举报

懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关注0

粉丝2

帖子830918

发布主题
阅读排行 更多
广告位

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap