web-dev-qa-db-fra.com

Quelle est la bonne façon de vérifier les données d'un objet de PagingData dans Android tests de l'unité

J'utilise une bibliothèque de pagination pour récupérer des données d'une API et les montrer dans une liste

à cette fin dans mon référentiel, j'ai créé la méthode:

fun getArticleList(query: String): Flow<PagingData<ArticleHeaderData>>

dans mon point de vue, j'ai créé la méthode de recherche qui va quelque chose comme ceci:

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)
        }
    }
}

afin de tester mon point de vue, j'utilise la méthode de test PagingData.from Pour créer un flux pour revenir de mon référentiel moqué comme si:

whenever(repo.getArticleList(query)).thenReturn(flowOf(PagingData.from(articles)))

et puis je récupère les données de pagination réelles de l'articleliste Liveta As de même:

val data = vm.articleList.value!!

cela renvoie un objet PagingData<ArticleList> que je souhaiterais vérifier qu'il contient les données du service (c'est-à-dire le articles renvoyé à chaque fois)

la seule façon dont j'ai trouvé cela consiste à créer la fonction d'extension suivante:

private val dcb = object : DifferCallback {
    override fun onChanged(position: Int, count: Int) {}
    override fun onInserted(position: Int, count: Int) {}
    override fun onRemoved(position: Int, count: Int) {}
}

suspend fun <T : Any> PagingData<T>.collectData(): List<T> {
    val items = mutableListOf<T>()
    val dif = object : PagingDataDiffer<T>(dcb, TestDispatchers.Immediate) {
        override suspend fun presentNewList(previousList: NullPaddedList<T>, newList: NullPaddedList<T>, newCombinedLoadStates: CombinedLoadStates, lastAccessedIndex: Int): Int? {
            for (idx in 0 until newList.size)
                items.add(newList.getFromStorage(idx))
            return null
        }
    }
    dif.collectFrom(this)
    return items
}

qui semble fonctionner, mais est basé sur la classe PagingDataDiffer qui est marquée comme @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP) afin de ne pas fonctionner à l'avenir

y a-t-il un meilleur moyen d'obtenir le flow à partir de PagingData (marqué comme interne dans la bibliothèque) ou obtenez-en des données réelles?

13
Cruces

Cela ne fonctionne que lorsqu'il y a une connexion Internet active.

0
Kai Lean