Почему AsyncPagingDataDiffer submitData() должен замораживать и отключать тест?

Я пытаюсь следовать этой документации, касающейся того, как проводить модульное тестирование потока PagingData, к которому вы применяете преобразования. Код, который я использую, похож:

      @ExperimentalCoroutinesApi
@Test
fun testGetFooBarsPaged(): Unit = runTest {
    val differ = AsyncPagingDataDiffer(
        object : DiffUtil.ItemCallback<FooBar>() {
            override fun areItemsTheSame(oldItem: FooBar, newItem: FooBar) = false
            override fun areContentsTheSame(oldItem: FooBar, newItem: FooBar) = false
        },
        object : ListUpdateCallback {
            override fun onChanged(position: Int, count: Int, payload: Any?) {}
            override fun onMoved(fromPosition: Int, toPosition: Int) {}
            override fun onInserted(position: Int, count: Int) {}
            override fun onRemoved(position: Int, count: Int) {}
        }
    )
    val pagingData = fooBarsSdk.getFooBarsPaged(FooBar.Type, pageSize = 1).first()
    differ.submitData(PagingData.from(listOf(FooBar(), FooBar(), FooBar())))
}

Здесь выполняются две последние строки теста, и тест успешно завершается:

  1. getFooBarsPaged() извлекает Flow <PagingData>, для которого я могу вызвать first () и получить первый экземпляр PagingData <FooBar>.
  2. А в следующей строке вы можете видеть, что я также могу без проблем отправить произвольный список объектов FooBar моему объекту AsyncPagingDataDiffer.

Проблема в том, что я пытаюсь отправить экземпляр PagingData, который я взял из потока, в объект AsyncPagingDataDiffer: differ.submitData(pagingData). Этот вызов блокируется до тех пор, пока не истечет время ожидания runTest () через 60 секунд. У меня вопрос, почему это могло произойти?

Объект Pager и Flow создаются следующим образом:

      Pager(
    config = PagingConfig(pageSize),
    initialKey = null,
    pagingSourceFactory = factory.asPagingSourceFactory(Dispatchers.Default)
).flow.map { pagingData -> pagingData.map { fooBarEntity -> fooBarEntity.toFooBar() } }

где фабрика источника данных извлекается из метода Room Dao, например этого:

      @Query("SELECT DISTINCT * FROM foobars WHERE type = :type")
fun getAllFooBarsByTypeLive(type: String): DataSource.Factory<Int, FooBarEntity>

1 ответ

здесь работает следующее:

      val job = launch {
        val pagingData = Pager(
            config = PagingConfig(20),
            initialKey = null,
            pagingSourceFactory = db.fooBarDao().getAllFooBarsByTypeLive("test")
                .asPagingSourceFactory()
        ).flow.map { pagingData -> pagingData.map { fooBarEntity -> fooBarEntity.toFooBar() } }
            .toList()[2]
        differ.submitData(pagingData)
    }
    job.cancel()

Конечно, в вашем потоке должно быть как минимум 3 элемента.Как проверить данные пейджинга с пейджинга 3

Причина почему

      val pagingData = fooBarsSdk.getFooBarsPaged(FooBar.Type, pageSize = 1).first()
differ.submitData(PagingData.from(listOf(FooBar(), FooBar(), FooBar())))

работает в том, что вы используете «от», и тогда вам не нужно запускать, как вы можете прочитать здесь https://developer.android.com/topic/libraries/architecture/paging/test

Другие вопросы по тегам