Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/111.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios RxSwift测试调度程序don';如果在后台订阅,则无法工作_Ios_Swift_Rx Swift_Reactivex_Rxtest - Fatal编程技术网

Ios RxSwift测试调度程序don';如果在后台订阅,则无法工作

Ios RxSwift测试调度程序don';如果在后台订阅,则无法工作,ios,swift,rx-swift,reactivex,rxtest,Ios,Swift,Rx Swift,Reactivex,Rxtest,我有模拟交互器和路由器,用于演示者的单元测试 演示者方法: 结果是空的, 只有当我从presenterMethod中删除这些行时,此测试才能正常工作 我尝试使用XTestExpection并在do(onNext:{})块中实现,得到了相同的结果,只在后台不使用subscribeOn的情况下工作。 方法在设备和模拟器上正确工作,演示方法在开关上触发并发出正确的事件。如何编写此测试以在后台使用SubscribeOn 您实际上希望传递给subscribeOn的调度程序成为演示程序上的可配置变量

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

结果是空的,

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

我尝试使用XTestExpection并在do(onNext:{})块中实现,得到了相同的结果,只在后台不使用subscribeOn的情况下工作。
方法在设备和模拟器上正确工作,演示方法在开关上触发并发出正确的事件。如何编写此测试以在后台使用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)
    }
}
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])
}
    .subscribeOn(ConcurrentDispatchQueueScheduler(qos: .background))
    .observeOn(MainScheduler.instance)
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)