просто получить вид из пользовательского представления в эспрессо Android - PullRequest
1 голос
/ 19 мая 2019

У меня есть пользовательский компонент в Android с этим макетом.

<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/mainLayout"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

    <androidx.appcompat.widget.AppCompatEditText
        android:id="@+id/editText"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />
</androidx.constraintlayout.widget.ConstraintLayout>

при использовании в другом макете я нахожу editText по этому коду. (Эспрессо)

val editText = onView(
        allOf(withId(R.id.editText)
               , isDescendantOfA(withId(R.id.mainLayout))
               , isDescendantOfA(withId(R.id.mobileEdt))
        )
)

Я использую этот пользовательский компонент во всех приложениях и во многих макетах. я могу минимизировать или преобразовать в функцию в моем приложении, чтобы не писать снова и снова?

Возможно, я изменю компоновку компонента, поэтому мне нужно отредактировать все withId во всех тестах.

Ответы [ 2 ]

0 голосов
/ 21 мая 2019

это явно не потомок R.id.mobileEdt ...

val editText = onView(allOf(
    withId(R.id.editText),
    isDescendantOfA(withId(R.id.mainLayout))
))
0 голосов
/ 21 мая 2019

Ваш компонент, вероятно, имеет имя класса.Допустим, CustomEditText.В этом случае вы можете реализовать пользовательское сопоставление на основе BoundedMatcher, которое гарантирует, что оно будет соответствовать только экземплярам представления вашего CustomEditText.

Простая реализация может выглядеть так:

fun customEditWithId(idMatcher: Matcher<Int>): Matcher<View> {

    return object : BoundedMatcher<View, CustomEditText>(CustomEditText::class.java!!) {

        override fun describeTo(description: Description) {
            description.appendText("with id: ")
            idMatcher.describeTo(description)
        }

        override fun matchesSafely(textView: CustomEditText): Boolean {
            return idMatcher.matches(textView.id)
        }
    }
}

тогда ваше утверждение выглядит так:

onView(customEditWithId(0)).perform(click());
...