iOS RxSwift - тестирование с использованием RxTest и TestScheduler не завершает / не завершает контрольный пример - PullRequest
0 голосов
/ 01 сентября 2018

Я пытаюсь понять, как правильно использовать TestScheduler из RxTest 4.2 для RxSwift 4.2.

Как правильно создать TestScheduler и передать ему события, которые завершат работу планировщика после выполнения всех событий?

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

    var testScheduler: TestScheduler = TestScheduler(initialClock: 0)

    let stateObserver = testScheduler.createObserver(Bool.self)
    subject.outputRelay.bind(to: stateObserver).disposed(by: bag)

    let events = [next(1,true), next(10,false)]
    let hotObservable = testScheduler.createHotObservable(events)

    //direct events to the given relay
    hotObservable.bind(to: subject.inputRelay).disposed(by: bag)

    testScheduler.start() //infinite loop

//do not get called
    XCTAssertEqual(stateObserver.events, [next(0, InterfaceState.started)])
    testScheduler.stop()

Я сузил число выпущенных до этого вызова метода в TestScheduler. Кажется, что-то не так с удалением подписки

 func findNext() -> VirtualSchedulerItem<VirtualTime>? {
        while let front = _schedulerQueue.peek() {
            if front.isDisposed {
                //this never gets called
                _schedulerQueue.remove(front)
                continue
            }

            return front
        }

        return nil
    }

1 Ответ

0 голосов
/ 03 сентября 2018

Что я делаю в этом случае, так это планирую блок на определенное время, которое, как я знаю, должно завершиться всем тестом и остановить подписку. Я думаю, что в вашем случае должно быть что-то вроде этого:

//...
let hotObservable = testScheduler.createHotObservable(events)
let disposable = hotObservable.bind(to: subject.inputRelay)
testScheduler.scheduleAt(1) {
     disposable.dispose()
}
testScheduler.start()
XCTAssertEqual(stateObserver.events, [next(0, InterfaceState.started)])
//...
...