0

ルーム付きのページング 3。ここのサンプルのようなアプリを作成し、そのテストを書き始めます。

これが私がDAOに持っているものです:

@Query("SELECT * FROM Model")
fun getModels(): PagingSource<Int, Model>

@Insert(onConflict = OnConflictStrategy.REPLACE)
fun insertAll(list: MutableList<Model>) : Completable

そして、私は次のようにテストしたかった:

@OptIn(ExperimentalCoroutinesApi::class) 
class DAOTest {

    private lateinit var dao: Dao
    private lateinit var db: ModelDatabase
    private lateinit var viewModel: MyViewModel
    lateinit var context: Context
    private val testDispatcher = TestCoroutineDispatcher()

    @Before
    fun createDb() {

        Dispatchers.setMain(testDispatcher)
        context = InstrumentationRegistry.getInstrumentation().targetContext
        db = Room.inMemoryDatabaseBuilder(context, MyDatabase::class.java)
            .allowMainThreadQueries()
            .build()
        dao = db.Dao()
        viewModel =
            MyViewModel(MyRepository(db))
    }

    @After
    fun tearDown() {
        Dispatchers.resetMain()
        db.close()
    }

    @Test
    fun dataBase_insertAndGet_success() = runBlockingTest(testDispatcher) {
        val differ = AsyncPagingDataDiffer(
            MyAdapter.diffCallback,
            noopListUpdateCallback,
            testDispatcher,
            testDispatcher
        )
        dao.insertAll(
            mutableListOf(listOfModels)
        ).test().assertResult()

        val job = launch {
            viewModel.getList().collectLatest {
                differ.submitData(it)
            }
        }
        advanceUntilIdle()
        Truth.assertThat(differ.snapshot()).containsExactly(
            model1, model2,model3,model4)
        job.cancel()
    }

    private val noopListUpdateCallback = object : ListUpdateCallback {
        override fun onInserted(position: Int, count: Int) {}
        override fun onRemoved(position: Int, count: Int) {}
        override fun onMoved(fromPosition: Int, toPosition: Int) {}
        override fun onChanged(position: Int, count: Int, payload: Any?) {}
    }
}

サンプルのテストとまったく同じです。奇妙なことに、テストを数回実行すると、合格するものとそうでないものがあります(differ.snapshot()が空であると言います)。これは、このファイルに他のいくつかのテストがあり(更新と削除のテスト)、テスト全体を一緒に実行します。合格するテストと合格しないテストがあり、ラウンドごとに異なります。

これは、リストを取得するために ViewModel にあるものです。

fun getList(type: Int, search: String? = null): Flow<PagingData<Stock>> {

        return Pager(
            config = PagingConfig(
                pageSize = PAGE_SIZE,
                enablePlaceholders = true,
                maxSize = MAX_SIZE
            )
        ) {
           repository.getListFromDao()
        }.flow
            .cachedIn(viewModelScope)

すべてがサンプルのようですが、なぜこの動作が起こっているのかわかりません。このような他の投稿を見ましたが、これはまさにテストで行ったものですが、それでも同じ問題があります。PagingSource<Int, Model> の型を返さずに以下のようなクエリをテストしようとすると、次のようになります。

@Query("SELECT * FROM Model")
fun getModels(): List<Model>

すべて正常に動作します。実行するたびにテストに合格します。したがって、テストのこの部分に何か問題があると思います。

val job = launch {
    viewModel.getList().collectLatest {
        differ.submitData(it)
    }
}

私はかなり長い間取り組んでいるので、誰かが助けてヒントを与えることができれば本当にうれしいです. ありがとうございました。

4

1 に答える 1