RxSwift Test теперь не проходит. Задержка введена - PullRequest
0 голосов
/ 08 ноября 2019

У меня есть следующий код -

        viewIsReady
            .flatMapLatest { [unowned self] _ in self.dependencies.authSvc.checkSession().asDriver(onErrorJustReturn: false) }
            .distinctUntilChanged()
            .delay(.seconds(2), scheduler: MainScheduler.instance) <-- without this test passes
            .bind(to: checkSessionComplete)
            .disposed(by: disposeBag)

У нас есть всплывающее представление, которое мы хотим показывать в течение минимального времени каждый раз. Поскольку это представление отклоняется путем выдачи значения checkSessionComplete, я добавил задержку, чтобы позволить асинхронной операции завершиться и предотвратить перемещение последовательности.

Однако проверка для этого сейчас не выполняется, но поведениеправильно.

Как мне проверить операцию, которая включает оператор delay?

   func test_on_check_session_response_emits() {
        let deps = TestDependencies()
        deps.authSvcSpy.stubbedCheckSessionResult = .just(true)

        DependencyInjector.dependencies = deps

        scheduler.scheduleAt(0) {
            self.sut.viewIsReady.onNext(())
        }

        let observer = scheduler.createObserver(AuthState.self)

        sut.checkSessionComplete
        .asObservable()
        .bind(to: observer)
        .disposed(by: disposeBag)

        scheduler.start()

        XCTAssertEqual(observer.events.count, 1)
    }

РЕДАКТИРОВАТЬ

Основываясь на ответе ниже Iобновил мой Presenter -

final class StartPresenter {

    // Input
    let viewIsReady = PublishSubject<Void>()

    // Output
    let checkSessionComplete = PublishSubject<Void>()

    var scheduler: SchedulerType = MainScheduler.instance

    weak private var view: StartViewInterface?

    private lazy var disposeBag = DisposeBag()

    init(view: StartViewInterface?) {
        self.view = view

        viewIsReady
            .flatMapLatest { [unowned self] _ in self.dependencies.authSvc.checkSession().asDriver(onErrorJustReturn: false) }
            .distinctUntilChanged()
            .mapToVoid()
            .delay(.seconds(2), scheduler: scheduler)
            .bind(to: checkSessionComplete)
            .disposed(by: disposeBag)
    }
}

и мой тестовый набор

    func test_on_check_session_response_emits() {
         let deps = TestDependencies()
         deps.authSvcSpy.stubbedCheckSessionResult = .just(true)
         DependencyInjector.dependencies = deps

        sut.scheduler = testScheduler

        testScheduler.scheduleAt(0) {
            self.sut.viewIsReady.onNext(())
        }

        let observer = testScheduler.createObserver(Void.self)

        sut.checkSessionComplete
        .asObservable()
        .delay(.seconds(2), scheduler: testScheduler)
        .bind(to: observer)
        .disposed(by: disposeBag)

        testScheduler.start()

        XCTAssertEqual(observer.events.count, 1)
    }

}

И тест по-прежнему не выполняется, если .delay находится в цепочке.

1 Ответ

0 голосов
/ 09 ноября 2019

В вашем коде вы используете MainScheduler.instance, который не будет работать во время тестов. Вам необходимо ввести планировщик испытаний и использовать его, например: .delay(.seconds(2), scheduler: scheduler).

...