gpt4 book ai didi

android - 如何对从 Paging 3 返回 PagingSource 的 Room Dao 查询进行单元测试

转载 作者:行者123 更新时间:2023-12-04 16:38:45 27 4
gpt4 key购买 nike

我的问题实际上很笼统。我想知道如何对 进行单元测试房间 返回 的查询寻呼源 来自 寻呼 3 .
我有一个 房间 询问:

    @Query("SELECT * FROM database")
fun getChocolateListData(): PagingSource<Int, Chocolate>
我想知道如何对这个查询进行单元测试。
到目前为止我尝试过的(使用内存中的 房间 数据库进行测试):
@FlowPreview
@Test
fun saveChocolateToDbSavesData() = runBlocking {
val dao: Dao by inject()

val chocolate = Chocolate(
name = "Dove"
)
dao.saveChocolate(chocolate)

val pagingSourceFactory = { dao.getChocolateListData() }
val pagingDataFlow: Flow<PagingData<Chocolate>> = Pager(
config = PagingConfig(
pageSize = 50,
maxSize = 200,
enablePlaceholders = false
),
pagingSourceFactory = pagingSourceFactory
).flow

val chocolateListFlow = pagingDataFlow.testIn(coroutinesTestRule)
Assert.assertEquals(PagingData.from(listOf(chocolate)), chocolateListFlow.emissions[0])
}
然而,这并没有通过:

junit.framework.AssertionFailedError: Expected:androidx.paging.PagingData@7d6c23a1 Actual:androidx.paging.PagingData@321123d2


不知道如何正确处理。任何帮助将不胜感激!

最佳答案

PagingData是内部事件流的包装器,您无法直接比较它,并且您得到的错误是按预期抛出引用不等式。
相反,您应该查询 PagingSource直接比较LoadResult.Page中的数据或者您需要将它连接到演示者 API,例如 AsyncPagingDataDifferPagingDataAdapter并使用 .snapshot()

val flow = Pager(..).flow
val adapter = MyPagingDataAdapter()
val job = launch {
flow.collectLatest { adapter.submitData(it) }
}
// Do your asserts here
job.cancel()
如果您需要测试范围,我推荐 runBlockingTest来自 kotlinx.coroutines.test 库
查询 PagingSource直接,它有一个悬浮 .load()方法,所以你可以简单地将它包装在 runBlockingTest并断言结果:
@Test
fun test() = runBlockingTest {
val pagingSource = MyPagingSource()
val actual = pagingSource.load(LoadParams.Refresh(...))
assertEquals(actual as? LoadResult.Page)?.data, listOf(...))
}

关于android - 如何对从 Paging 3 返回 PagingSource 的 Room Dao 查询进行单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65164206/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com