Rx-Kotlin ждутTerminalEvent, никогда не получающего onComplete

Я пытаюсь лучше понять, как выполнять модульные тесты с Rx-Kotlin, но я не смог успешно установить тему «завершен». В результате я всегда жду тайм-аута в 5 секунд (onComplete должен быть немедленным), а затем сбой на assertComplete.

Мое понимание awaitTerminalEvent заключается в том, что он должен блокироваться только до вызова onComplete. Я также заглянул в TestScheduler, но я не думаю, что это нужно здесь.

Любая помощь или документация, которые могут привести меня в правильном направлении, будут высоко оценены.

@Test fun testObservable() { val subject = BehaviorSubject.create<Int>() subject.onNext(0) TestSubscriber<Int>().apply { subject.subscribe({ System.out.println(it) subject.onNext(1) subject.onComplete() }) this.awaitTerminalEvent(5, TimeUnit.SECONDS) this.assertComplete() this.assertValue(1) } } 

Вы неправильно используете неправильный инструмент …

  • TestSubscriber предназначен для тестирования Flowable , вы должны использовать здесь TestObserver .
  • вы должны подписаться с TestObserver (или TestSubscriber in TestSubscriber ), чтобы он отслеживал выбросы и мог ждать терминального события и утверждать значения. В вашем коде TestSubscriber не привязан к какому-либо потоку, поэтому он никогда не получит никакого события.

пытаясь подражать вашему коду, это может быть что-то вроде этого:

  @Test fun testObservable() { val subject = BehaviorSubject.create<Int>() subject.onNext(0) TestObserver<Int>().apply { subject.doOnNext { System.out.println(it) subject.onNext(1) subject.onComplete() } .subscribe(this) this.awaitTerminalEvent(5, TimeUnit.SECONDS) this.assertComplete() this.assertValue(1) } } 

как вы можете видеть, я использую TestObserver подписка выполняется с объектом TestObserver , а объект onNext() , onComplete() перемещен в doOnNext() . тест завершится неудачно, так как у вас есть два испущенных значения, в то время как тест утверждается только для одного значения «1».

Вообще говоря, это неправильно, что вы используете субъект для повторного включения в onNext() а затем вызываете onComplete() , вы можете подписаться раньше и затем выходить извне. что-то вроде этого:

 TestObserver<Int>().apply { subject.subscribe(this) subject.onNext(1) subject.onComplete() .... } 
Intereting Posts
Выражение лямбда не используется Фрагменты в действиях странное поведение Firebase & Retrieving Elements UnsupportedOperationException при построении проекта Kotlin в Idea Как разбить строку и установить разделители между разделенными частями в Котлине? Можем ли мы получить доступ к PropertyMetaData любого свойства в котлин? Как я могу представить отношение многих к многим с Android Room? доступ к расширению kotlin в другом kt Что такое «реализация» в зависимостях Kotlin Gradle? Странная ошибка «Val не может быть переназначена» при установке свойства в Kotlin объекта Java свойство lateinit не было инициализировано kotlin как ссылаться на внешнюю область в многослойных приложениях Исключено исключение Kotlin coroutine Что такое правильное место для инициализации переменных класса в котлине Использование цветов, определенных в базовом модуле из функционального модуля, не выполняется после восстановления Android Instant App