2015-07-15 16 views
19

Ho questo codice nel mio test EspressoAndroid Espresso controllo selezionata testo filatore

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

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

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

Quello che sto cercando di fare è fare clic sulla voce nella Spinner e verificare se è effettivamente selezionato nella Spinner.

Ma sto ottenendo questo errore:

android.support.test.espresso.base.DefaultFailureHandler$AssertionFailedWithCauseError: 'with text: a string containing "CCD"' doesn't match the selected view. Expected: with text: a string containing "CCD" Got: "AppCompatSpinner{id=2131558533, res-name=src, visibility=VISIBLE, width=528, height=163, has-focus=false, has-focusable=true, has-window-focus=true, is-clickable=true, is-enabled=true, is-focused=false, is-focusable=true, is-layout-requested=false, is-selected=false, root-is-layout-requested=false, has-input-connection=false, x=0.0, y=0.0, child-count=1}"

+0

Nella documentazione di prova spresso mostrano una soluzione per selezionare una voce all'interno del filatore dalla sua posizione di indice che penso è nel modo giusto ... URL: https://github.com/vgrec/EspressoExamples/blob/master/app/src/androidTest/java/com/vgrec/espressoexamples/SpinnerSelectionTest.java –

risposta

47

Sostituire withText() con withSpinnerText()

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

Riferimento: https://code.google.com/p/android-test-kit/issues/detail?id=85

+0

qual è la selezioneText qui ?? –

+0

Questa è una stringa: il testo dello spinner, lo stesso visibile all'utente. – Jonas

2

Per adattatore personalizzato ho avuto yo creare un matcher personalizzato:

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

     } 
    }; 
} 

Quindi è necessario eseguire l'override del metodo toString() sulla classe personalizzata.

+0

YouCustomClass è la classe dell'adattatore e l'articolo è un articolo dall'adattatore? –

2

molto semplice soluzione che ha funzionato per me ..... senza usare matcher Per 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")))); 
Problemi correlati