web-dev-qa-db-fra.com

Android Espresso vérifier le texte du spinner sélectionné

J'ai ce code dans mon test Espresso

onView(withId(R.id.src))
    .perform(click());
onData(hasToString(startsWith("CCD")))
    .perform(click());
onView(withId(R.id.src))
    .check(matches(withText(containsString("CCD"))));

Ce que j'essaie de faire, c'est de cliquer sur l'élément dans le Spinner et de vérifier s'il est bien sélectionné dans le Spinner.

Mais je reçois cette erreur:

Android.support.test.espresso.base.DefaultFailureHandler $ AssertionFailedWithCauseError: 'avec texte: une chaîne contenant "CCD"' ne correspond pas à la vue sélectionnée. Attendu: avec du texte: une chaîne contenant "CCD" Obtenu: "AppCompatSpinner {id = 2131558533, res-name = src, visibilité = VISIBLE, largeur = 528, hauteur = 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-required = false, is-selected = false, root-is- layout-required = false, has-input-connection = false, x = 0.0, y = 0.0, nombre d'enfants = 1} "

22
Jezer Crespo

Remplacez withText() par withSpinnerText()

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

Référence: https://code.google.com/p/Android-test-kit/issues/detail?id=85

69
Jonas

Solution vraiment simple qui a fonctionné pour moi ..... sans utiliser de matcher pour 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"))));
8
Arpit Agarwal

Pour l'adaptateur personnalisé, je devais créer un adaptateur personnalisé:

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

        }
    };
}

Ensuite, vous devez remplacer la méthode toString () sur votre classe personnalisée.

3
sagits