Rx-Kotlin awaitTerminalEvent永远不会完成
问题描述:
我想更好地了解如何使用Rx-Kotlin进行单元测试,但我无法成功设置主题为“已完成”。因此,我总是等待5秒的时间(onComplete应该是立即的),然后在assertComplete上失败。Rx-Kotlin awaitTerminalEvent永远不会完成
我对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
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)
}
}
,你可以看到,我使用TestObserver
的订阅与TestObserver
对象来完成,并且对象onNext()
, onComplete()
转移到doOnNext()
。测试将失败,因为您有两个发射值,而测试仅针对单个“1”值。
一般来说,这是一种错误的,你使用主题再次发射在onNext()
,然后打电话onComplete()
,你可以订阅之前,然后发射到外面。这样的事情:
TestObserver<Int>().apply {
subject.subscribe(this)
subject.onNext(1)
subject.onComplete()
....
}
我知道我不应该在这样的主题内发射,我只是想写一个奇怪的测试。非常感谢! – sschmitz