Как получить тег представления в тесте Espresso?

Я работаю над каким-то сквозным тестом, используя Espresso.
В тесте мне нужно знать идентификатор пользователя (потому что мне нужно вызвать одну конечную точку, которая имитирует какую-то внешнюю сторону).
Чтобы получить идентификатор пользователя, я думал о том, чтобы установить его как тег в представлении и получить тег с помощью эспрессо.

Есть ли способ сделать это?

Я нахожу только способы получить представление по тегу, но фактически не получает содержимое тега.

Спасибо за вашу помощь.


person Frank van der Linden    schedule 29.01.2020    source источник


Ответы (2)


Вам не нужен Espresso для получения тега View — вместо этого вы можете просто вызвать findViewById(...), чтобы найти свой View, а затем получить его тег с помощью метода getTag().

Итак, если вы используете ActivityTestRule для запуска вашего Activity, View виден и имеет уникальный идентификатор в Activity, вы можете сделать это следующим образом:

...
// make sure the View is there and visible
onView(withId(R.id.someId)).check(matches(isDisplayed()));

// retrieve its tag using ActivityTestRule
String tag = (String) activityRule.getActivity().findViewById(R.id.someId).getTag();
...
person Nishikant Choudhary    schedule 31.01.2020

Вы можете использовать следующую функцию расширения:

inline fun <reified T : Any> ViewInteraction.getTag(): T? {
    var tag: T? = null
    perform(object : ViewAction {
        override fun getConstraints() = ViewMatchers.isAssignableFrom(View::class.java)

        override fun getDescription() = "Get tag from View"

        override fun perform(uiController: UiController, view: View) {
            when (val viewTag = view.tag) {
                is T -> tag = viewTag
                else -> error("The tag cannot be casted to the given type!")
            }
        }
    })
    return tag
}

К тегу get, например:

@Test
fun myTest() {
    ...
    val userId = onView(withId(R.id.myView)).getTag<String>()
    ...
}
person David Miguel    schedule 29.01.2020