dao.insert(position)
返回Unit
(“Void
”),dao.getPosition()
返回Single<IssPosition>
。 dbFailingTest
失败并出现以下异常 Query returned empty result set: SELECT * FROM iss_position LIMIT 1
(但如果我将参数更改为 id = 1
并不重要)。我正在使用 Room。
为什么第一个测试失败而第二个测试失败?我相信它们是等价的,但显然不是。我希望我的代码最终看起来更像失败的测试,因为在我的存储库中我还将订阅一些外部事件。
@Test
fun dbFailingTest() {
Completable
.fromCallable { dao.insert(position) }
// .delay(1, TimeUnit.SECONDS)
.to {
dao.getPosition()
}
.test()
// .awaitDone(1200, TimeUnit.MILLISECONDS)
.assertResult(position)
}
@Test
fun dbPassingTest() {
dao.insert(position)
dao.getPosition()
.test()
.assertResult(position)
}
最佳答案
方法to
将Completable
转换为其他内容,而无需等待前者完成。它只是使用 Completable
作为参数来执行作为参数传递的函数。
另一方面,如果您使用Single
:
@Test
fun dbFailingTest() {
Single
.fromCallable { dao.insert(position) }
.flatMapMaybe { dao.getPosition() }
.test()
.assertResult(position)
}
flatMapMaybe
转换 Single
的结果,因此必须等待 Single
完成.
此外,如果您在测试类中使用 InstantTaskExecutorRule
:
@Rule
@JvmField
val instantTaskExecutorRule = InstantTaskExecutorRule()
这段代码应该可以工作:
@Test
fun dbFailingTest() {
dao.insert(position)
dao.getPosition()
.test()
.assertResult(position)
}
关于rx-java - 使用 rx 链接时 Android 测试失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51654194/