在Android单元测试中,检查PagingData对象数据的正确方法是什么
我使用分页库从api中检索数据并在列表中显示它们 为此,我在我的存储库中创建了以下方法:在Android单元测试中,检查PagingData对象数据的正确方法是什么,android,unit-testing,android-paging,Android,Unit Testing,Android Paging,我使用分页库从api中检索数据并在列表中显示它们 为此,我在我的存储库中创建了以下方法: fun getArticleList(查询:字符串):流 在我的viewmodel中,我创建了如下搜索方法: override fun search(query: String) { val lastResult = articleFlow if (query == lastQuery && lastResult != null) return las
fun getArticleList(查询:字符串):流
在我的viewmodel中,我创建了如下搜索方法:
override fun search(query: String) {
val lastResult = articleFlow
if (query == lastQuery && lastResult != null)
return
lastQuery = query
searchJob?.cancel()
searchJob = launch {
val newResult: Flow<PagingData<ArticleList>> = repo.getArticleList(query)
.map {
it.insertSeparators { //code to add separators }.cachedIn(this)
articleFlow = newResult
newResult.collectLatest {
articleList.postValue(it)
}
}
}
它似乎可以工作,但基于标记为@RestrictTo(RestrictTo.Scope.LIBRARY\u GROUP)
的PagingDataDifference
类,因此将来可能无法工作
有没有更好的方法从PagingData(在库中标记为internal)获取
流
,或者从中获取实际数据?我对Paging3库也有同样的问题,并且还没有很多关于这个库的在线讨论,但是当我翻阅一些文档时,我可能会找到一个解决方案。我面临的场景是试图确定分页数据中的数据列表是否为空,然后我将在此基础上操作UI
以下是我在文档中发现的内容,PagingDataAdapter
中有两个API,它们被添加到版本中,即peek()
,和snapshot()
,peek()
根据索引为我们提供了一个特定的列表对象,而snapshot()
为我们提供了整个列表
下面是我所做的:
lifecycleScope.launch {
//Your PagingData flow submits the data to your RecyclerView adapter
viewModel.allConversations.collectLatest {
adapter.submitData(it)
}
}
lifecycleScope.launch {
//Your adapter's loadStateFlow here
adapter.loadStateFlow.
distinctUntilChangedBy {
it.refresh
}.collect {
//you get all the data here
val list = adapter.snapshot()
...
}
}
由于我最近刚刚接触到分页库和Flow
,这种方法可能存在缺陷,请告诉我是否有更好的方法 我同意王子建的观点,测试它的唯一方法是通过快照这只在有活动的internet连接时有效。您的方法似乎适用于实际代码,我有类似的设置(只有我使用viewmodel保存pageddata的livedata,并在其中内部使用流,而不是公开流本身)但我想做的是在单元测试中测试数据,所以在您的示例中,您将如何测试从viewmodel.allconversations.collectlatest接收到的内容?难道您没有找到解决方案吗?没有,仍然在使用此代码,到目前为止还没有出现故障,所以我猜是这样的staying@Cruces在尝试时,这种方法似乎不再有效要使用扩展名collectData()进行测试,将引发一个异常:在显示新列表后缺少对onListPresentable的调用。如果您看到此异常,通常表明分页存在问题。请提交一个错误,以便我们可以在@ZivKesten just call onListPresentable()修复它在for循环之后。正如我对Zijian所说的,是的,这在实际代码中是有效的,但是我正在运行单元测试,没有lifecyclescope,没有适配器,我没有在它们中运行robolectric来创建这样的对象,它们应该是测试基本功能的普通单元测试
lifecycleScope.launch {
//Your PagingData flow submits the data to your RecyclerView adapter
viewModel.allConversations.collectLatest {
adapter.submitData(it)
}
}
lifecycleScope.launch {
//Your adapter's loadStateFlow here
adapter.loadStateFlow.
distinctUntilChangedBy {
it.refresh
}.collect {
//you get all the data here
val list = adapter.snapshot()
...
}
}