iOS RxSwift - тестирование с использованием RxTest и TestScheduler не завершает / не завершает контрольный пример
Я пытаюсь понять, как правильно использовать 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 ответ
Что я делаю в этом случае, так это планирую блок на определенное время, чтобы я знал, что все тесты должны быть закончены и там остановлена подписка. Я думаю, что в вашем случае должно быть что-то вроде этого:
//...
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)])
//...