【发布时间】:2019-05-29 13:53:16
【问题描述】:
为了给这个问题一些背景知识,我有一个 ViewModel 等待一些数据,将其发布到 MutableLiveData,然后通过一些属性公开所有值。以下是其外观的简短要点:
class QuestionViewModel {
private val state = MutableLiveData<QuestionState>()
private val currentQuestion: Question?
get() = (state.value as? QuestionState.Loaded)?.question
val questionTitle: String
get() = currentQuestion?.title.orEmpty()
...
}
然后,在我的测试中,我模拟数据并运行 assertEquals 检查:
assertEquals("TestTitle", viewModel.questionTitle)
到目前为止,所有这些都运行良好,但我实际上希望我的片段能够观察当前问题何时发生变化。因此,我尝试将其更改为使用Transformations.map:
class QuestionViewModel {
private val state = MutableLiveData<QuestionState>()
private val currentQuestion: LiveData<Question> = Transformations.map(state) {
(it as? QuestionState.Loaded)?.question
}
val questionTitle: String
get() = currentQuestion.value?.title.orEmpty()
...
}
突然间,我在测试类中的所有断言都失败了。我公开了currentQuestion,并在我的单元测试中验证了它的值为空。我确定这是问题所在,因为:
- 我可以模拟数据并且仍然从我的
stateLiveData 中获得正确的值 - 我可以运行我的应用并在屏幕上看到预期的数据,所以这个问题是我的单元测试所特有的。
我已经将InstantTaskExecutorRule 添加到我的单元测试中,但也许这不能处理Transformations 方法?
【问题讨论】:
标签: android kotlin android-architecture-components android-livedata