RxSwift TestScheduler не работает, если подписаться на фоне - PullRequest
0 голосов
/ 25 ноября 2018

У меня есть фиктивный интерактор и маршрутизатор для модульных тестов по методике презентатора:

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: {}) и получил те же результаты, работая только без фона подписки.Метод корректно работает на устройстве и симуляторе, PresenterMethod переключается при переключении и выдает правильные события.Как написать этот тест для работы с SubscribeOn background?

1 Ответ

0 голосов
/ 25 ноября 2018

Вы фактически захотите, чтобы планировщики, переданные в 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)
...