Почему не прошел тест на ресайклерское представление? - PullRequest
1 голос
/ 28 мая 2020

Я написал тест, проверяющий, отображается ли представление ресайклера (id: comments_view), но он всегда терпит неудачу, и я не знаю почему. Когда я проверяю макет (id: cm), тест проходит.

У меня есть следующий код фрагмента:

<layout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools">

    <data>
        <variable
            name="post"
            type="com.example.kotlinpostapi.apiObjects.Post" />
        <variable
            name="comments"
            type="java.util.List" />
    </data>

    <androidx.constraintlayout.widget.ConstraintLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".views.MainActivity"
        android:id="@+id/cm">


        <androidx.recyclerview.widget.RecyclerView
            android:id="@+id/comments_view"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent" />

    </androidx.constraintlayout.widget.ConstraintLayout>

</layout>

Тестовый код (я перехожу к фрагменту из другого):

@RunWith(AndroidJUnit4::class)
class CommentsListTest{

    @get: Rule
    val activityScenario = ActivityScenarioRule(MainActivity::class.java)

    @Test
    fun testCommentsAreDisplayed() {
        onView(withId(R.id.posts_view)).perform(actionOnItemAtPosition<PostAdapter.PostsViewHolder>(0, MyMatchers.clickChildView(R.id.show_comments_button)))

        //it fails
        onView(withId(R.id.comments_view)).check(matches(isDisplayed()))
        //it passes
        onView(withId(R.id.cm)).check(matches(isDisplayed()))
    }
}

Как это возможно и как я могу проверить свое представление ресайклера?

1 Ответ

1 голос
/ 29 мая 2020

Высота RecyclerView установлена ​​на wrap_content, и если элемент не виден хотя бы на 90%, тест не выполняется.

Что вы можете сделать, так это проверить одного из дочерних элементов RecyclerView.

Сначала я объявляю следующий метод:

fun nthChildOf(parentMatcher: Matcher<View?>, childPosition: Int): Matcher<View?>? {
    return object : TypeSafeMatcher<View>() {
        override fun describeTo(description: Description) {
            description.appendText("with $childPosition child view of type parentMatcher")
        }

        override fun matchesSafely(view: View): Boolean {
            if (view.parent !is ViewGroup) {
                return parentMatcher.matches(view.parent)
            }
            val group = view.parent as ViewGroup
            return parentMatcher.matches(view.parent) && group.getChildAt(childPosition) == view
        }
    }
}

с его помощью вы можете проверить, отображается ли его первый дочерний элемент:

onView(nthChildOf(withId(R.id.comments_view), 0)).check(matches(isDisplayed()))

И проверить один элемент его дочерних элементов (recyclerview_element_id для Пример):

onView(allOf(
        withId(R.id.recyclerview_element_id),
        isDescendantOfA(
                nthChildOf(withId(R.id.comments_view), 0))
)).check(matches(isDisplayed()))

Еще одна вещь, которую вы можете попробовать, если ваш RecyclerView расширяется до доступного пространства экрана, - это изменить макет RecyclerView, чтобы все ограничения были установлены, а высота - 0dp:

<androidx.recyclerview.widget.RecyclerView
            android:id="@+id/comments_view"
            android:layout_width="0dp"
            android:layout_height="0dp"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent" />

У меня так и делаю:

onView(withId(R.id.myRecyclerviewId)).check(matches(isDisplayed()))

у меня работает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...