rx-java - 使用 rx 链接时 Android 测试失败
问题描述
dao.insert(position)
返回Unit
(“ Void
”),dao.getPosition()
返回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
在测试类中使用:
@Rule
@JvmField
val instantTaskExecutorRule = InstantTaskExecutorRule()
这段代码应该可以工作:
@Test
fun dbFailingTest() {
dao.insert(position)
dao.getPosition()
.test()
.assertResult(position)
}
推荐阅读
- reactjs - 我如何将以下代码转换为基于类的组件
- javascript - 在 componentDidMount 内部使用 setState 后,状态数据被复制
- linux - 从源代码编译时出现 GCC 错误 - BYOL Build GCC natively pass 2
- c# - C# 动态 COM 对象找不到方法
- sql-server - 解决方法 - Hibernate 在使用 IDENTITY 时不支持批量插入
- c - 强制 if 语句只执行一次
- ios - “抱歉,出了点问题。请重试您的请求。如果问题仍然存在,请联系我们。” 当点击“提交审核”时 iTunesConnect
- python - 在 Python 中使用一个函数(方法)的返回值到另一个函数(方法)中
- google-apis-explorer - 在 API 搜索中使用 searchType = image 时,没有结果
- date - PySpark Dataframe 中从一列到另一列的最近日期