Android 使用 rx 链接时测试失败
Android test failing when using rx chaining
dao.insert(position)
returns Unit
("Void
"), dao.getPosition()
returns Single<IssPosition>
。 dbFailingTest
失败并出现以下异常 Query returned empty result set: SELECT * FROM iss_position LIMIT 1
(但如果我将参数更改为 id = 1
并不重要)。我正在使用房间。
为什么第一个测试失败而第二个没有?我相信它们是等价的,但显然不是。我希望我的代码最终看起来更像是失败的测试,因为在我的回购中我也会订阅一些外部事件。
@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
class:
@Rule
@JvmField
val instantTaskExecutorRule = InstantTaskExecutorRule()
此代码应该有效:
@Test
fun dbFailingTest() {
dao.insert(position)
dao.getPosition()
.test()
.assertResult(position)
}
dao.insert(position)
returns Unit
("Void
"), dao.getPosition()
returns Single<IssPosition>
。 dbFailingTest
失败并出现以下异常 Query returned empty result set: SELECT * FROM iss_position LIMIT 1
(但如果我将参数更改为 id = 1
并不重要)。我正在使用房间。
为什么第一个测试失败而第二个没有?我相信它们是等价的,但显然不是。我希望我的代码最终看起来更像是失败的测试,因为在我的回购中我也会订阅一些外部事件。
@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
class:
@Rule
@JvmField
val instantTaskExecutorRule = InstantTaskExecutorRule()
此代码应该有效:
@Test
fun dbFailingTest() {
dao.insert(position)
dao.getPosition()
.test()
.assertResult(position)
}