Android Espresso проверяет выбранный текст прядильщика

У меня есть этот код в моем тесте эспрессо

    onView(withId(R.id.src))
            .perform(click());

    onData(hasToString(startsWith("CCD")))
            .perform(click());

   onView(withId(R.id.src))
           .check(matches(withText(containsString("CCD"))));

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

Но я получаю эту ошибку:

android.support.test.espresso.base.DefaultFailureHandler $ AssertionFailedWithCauseError: 'with text: строка, содержащая "CCD" ", не соответствует выбранному представлению. Ожидается: с текстом: строка, содержащая "CCD". Получено: "AppCompatSpinner{id=2131558533, res-name=src, видимость =VISIBLE, ширина =528, высота =163, has-focus=false, has-focusable=true, has-window-focus=true, is-clickable=true, is-enabled=true, is-focus =false, is-focusable=true, is-layout-запрашивается =false, is-selected=false, root-is-layout-Request =false, has-input-connection=false, x=0.0, y=0.0, child-count=1}"

4 ответа

Решение

Замещать withText() с withSpinnerText()

onView(withId(spinnerId)).perform(click());
onData(allOf(is(instanceOf(String.class)), is(selectionText))).perform(click());
onView(withId(spinnerId)).check(matches(withSpinnerText(containsString(selectionText))));

Ссылка: https://code.google.com/p/android-test-kit/issues/detail?id=85

Действительно простое решение, которое сработало для меня..... без использования matcher For CustomSpinner

    onView(withId(R.id.custom_spinner)).perform(click());
 onData(anything()).atPosition(1).perform(click());
 onView(withId(R.id.custom_spinner)).check(matches(withSpinnerText(containsString("yourstring"))));

Для нестандартного адаптера я должен был создать собственный сопоставитель:

 onView(withId(R.id.spinner)).perform(click());
 onData(allOf(is(instanceOf(YourCustomClass.class)), withMyValue("Open"))).perform(click());


public static <T> Matcher<T> withMyValue(final String name) {
    return new BaseMatcher<T>() {
        @Override
        public boolean matches(Object item) {
            return item.toString().equals(name);
        }

        @Override
        public void describeTo(Description description) {

        }
    };
}

Затем вы должны переопределить метод toString() в вашем пользовательском классе.

Это работает для меня

       private void selectSpinnerItem(final int resId, final String selection) {
    onView(withId(resId)).perform(click());
    onData(hasToString(selection)).perform(click());
    onView(withId(resId)).check(matches(withSpinnerText(containsString(selection))));
}
Другие вопросы по тегам