3

我试图更好地了解如何使用 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)
    }
}
4

1 回答 1

5

您以错误的方式使用了错误的工具...

  • TestSubscriber用于测试Flowable,你应该在这里使用TestObserver
  • TestObserver您应该使用( 或TestSubscriberin )订阅Flowable,以便它监控排放并能够等待终端事件和断言值。在您的代码中,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)
    }
}  

如您所见,我正在使用TestObserversubscribe 完成TestObserver对象,并将onNext()subjectonComplete()移至doOnNext(). 测试将失败,因为您有两个发出的值,而测试仅针对单个“1”值断言。

onNext()一般来说,在然后调用中使用subject再次发出是错误的onComplete(),您可以先订阅然后在外面发出。像这样的东西:

TestObserver<Int>().apply {
        subject.subscribe(this)
        subject.onNext(1)
        subject.onComplete()
        ....
}
于 2017-05-04T04:56:56.233 回答