2014-12-23 11 views
5

Sto provando a utilizzare Espresso (2.0) per verificare che il testo in una voce dell'elenco di schede in una determinata posizione sia corretto e per la durata della mia Non riesco a capire i metodi corretti da chiamare.Come utilizzare Espresso per testare l'articolo nell'adattatore in una posizione specifica

Il mio tipo di adattatore (IconRowAdapter) contiene un elenco di oggetti IconRow. Ogni IconRow ha un metodo getText() che restituisce il testo di quell'elemento.

Ecco il codice del test di lavoro non espresso che verifica che l'oggetto IconRow nella posizione 0 nell'adattatore abbia il testo previsto ("Artisti").

public void testHomeActivityMenu() { 
    ListView list = (ListView) getActivity().findViewById(R.id.item_list); 
    IconRowAdapter adapter = (IconRowAdapter) list.getAdapter(); 

    assertEquals(adapter.getItem(0).getText(), "Artists"); 
} 

Questo funziona.

ho provato varianti assortite sul seguente codice Espresso per fare la stessa cosa,

onData(is(instanceOf(IconRowAdapter.class))) 
     .atPosition(0) 
     .check(matches(withItemContent("Artists"))); 

dove withItemContent() assomiglia a questo:

public static Matcher<Object> withItemContent(String expectedText) { 
    checkNotNull(expectedText); 
    return withItemContent(equalTo(expectedText)); 
} 

@SuppressWarnings("rawtypes") 
public static Matcher<Object> withItemContent(final Matcher<String> itemTextMatcher) { 
    checkNotNull(itemTextMatcher); 
    return new BoundedMatcher<Object, IconRow>(IconRow.class) { 
     @Override 
     public boolean matchesSafely(IconRow iconRow) { 
      return itemTextMatcher.matches(iconRow.getText()); 
     } 

     @Override 
     public void describeTo(Description description) { 
      description.appendText("with item content: "); 
      itemTextMatcher.describeTo(description); 
     } 
    }; 
} 

quello che mi aspetterei che fare è:

  • Ottenere i dati dall'adattatore che è un'istanza di IconRowAdapter (di cui non c'è " s solo uno nell'attività) ...
  • ... trova la voce nella posizione 0 nell'adattatore ...
  • ... usa withItemContent() per verificare che il testo nell'elemento in quella posizione corrisponda "Artisti"

quando corro che ricevo il seguente errore:

Caused by: java.lang.RuntimeException: No data found matching: is an instance of 
uk.org.ngo.squeezer.IconRowAdapter contained values: <[Data: 
[email protected] (class: 
uk.org.ngo.squeezer.IconRowAdapter$IconRow) token: 0, Data: 
[email protected] (class: 
uk.org.ngo.squeezer.IconRowAdapter$IconRow) token: 1, Data: 
[email protected] (class: 
uk.org.ngo.squeezer.IconRowAdapter$IconRow) token: 2, Data: 
[email protected] (class: 
uk.org.ngo.squeezer.IconRowAdapter$IconRow) token: 3, Data: 
[email protected] (class: 
uk.org.ngo.squeezer.IconRowAdapter$IconRow) token: 4, Data: 
[email protected] (class: 
uk.org.ngo.squeezer.IconRowAdapter$IconRow) token: 5, Data: 
[email protected] (class: 
uk.org.ngo.squeezer.IconRowAdapter$IconRow) token: 6, Data: 
[email protected] (class: 
uk.org.ngo.squeezer.IconRowAdapter$IconRow) token: 7, Data: 
[email protected] (class: 
uk.org.ngo.squeezer.IconRowAdapter$IconRow) token: 8, Data: 
[email protected] (class: 
uk.org.ngo.squeezer.IconRowAdapter$IconRow) token: 9, Data: 
[email protected] (class: 
uk.org.ngo.squeezer.IconRowAdapter$IconRow) token: 10, Data: 
[email protected] (class: 
uk.org.ngo.squeezer.IconRowAdapter$IconRow) token: 11]> 

ci sono 12 articoli in IconRowAdapter, quindi ho una certa sicurezza che si sta cercando l'adattatore corretto.

Tutto il codice di esempio e la documentazione che sono stato in grado di trovare presuppone che si stia cercando di trovare una voce nell'adattatore per fare clic su di esso (e che ciò comporterà il valore in qualche altra vista mutevole). Non riesco a trovare nulla che parla di come controllare il valore di un dato oggetto in un adattatore.

Qualsiasi informazione ricevuta con gratitudine.

Modifica per aggiungere:

quello che funziona è la seguente:

onData(anything()) 
     .inAdapterView(withId(R.id.item_list)) 
     .atPosition(0) 
     .check(matches(hasDescendant(
       allOf(withId(R.id.text1), withText(containsString("Artists")))))); 

Se capisco che correttamente che sta mettendo alla prova il valore della vista R.id.text1, piuttosto che il valore nel adattatore. Immagino che abbia senso per un test dell'interfaccia utente, ma sono ancora interessato a scoprire come (se?) Posso usare Espresso per testare il contenuto di un articolo nell'adattatore.

risposta

3

Il modulo di corrispondenza passato come argomento a onData() deve corrispondere al valore restituito da Adapter.getItem(). Quindi la prima versione non corrisponde, a causa del tipo errato utilizzato.Dovrebbe essere:

onData(is(instanceOf(IconRowAdapter.IconRow.class))) 

Ciò che può anche essere una trappola è usare uguale su diversi tipi di CharSequences. String è un oggetto CharSequence, ma se IconRow.getText() restituisce CharSequence anziché String, questo può anche essere Spannable, Editable, ecc. In questo caso equalTo non corrisponde. Quindi se IconRow.getText() restituisce qualcosa tranne String, assicurati di convertirlo in una stringa prima del confronto.

0

Prova questo si deve lavorare:

//check that item is present in list at position 0 
onData(withItemContent("Artists")) 
    .inAdapterView(withId(R.id.list_view)) 
    .atPosition(0) 
    .check(matches(isDisplayed())); 

Se si elimina atPosition(0) Allora ti basta controllare la presenza nella visualizzazione adattatore.

+0

il metodo 'withItemContent' non funziona correttamente in kotlin. Forse hai qualche idea a riguardo? – Morozov

+0

Hai modificato l'abbinamento? – denys

+0

sì. qualcosa di simile a 'fun withItemContent (expectedText: String): Matcher { checkNotNull (expectedText) return withItemContent (equalTo (expectedText) .toString()) }' – Morozov

Problemi correlati