Wie verwenden Sie Espresso-test-item-in-adapter an einer bestimmten position
Ich versuche, Espresso (2.0), um zu überprüfen, dass der text in einer Liste an adapter Element an einer bestimmten position korrekt ist, und für das Leben meines ich kann nicht herausfinden, die richtigen Methoden zu nennen.
Mein Adapter-Typ (IconRowAdapter
) enthält eine Liste der IconRow
Objekte. Jeder IconRow hat eine getText()
Methode liefert den text des Elements.
Hier ist die nicht-Espresso-working test, code, der überprüft, dass die IconRow Objekt an position 0 in der adapter hat den erwarteten text ("Künstler").
public void testHomeActivityMenu() {
ListView list = (ListView) getActivity().findViewById(R.id.item_list);
IconRowAdapter adapter = (IconRowAdapter) list.getAdapter();
assertEquals(adapter.getItem(0).getText(), "Artists");
}
Dieser funktioniert.
Ich habe versucht, verschiedene Variationen über die folgenden Espresso-code, um das gleiche zu tun,
onData(is(instanceOf(IconRowAdapter.class)))
.atPosition(0)
.check(matches(withItemContent("Artists")));
wo withItemContent()
sieht wie folgt aus:
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);
}
};
}
Was ich erwarten würde, dass zu tun ist:
- Die Daten vom adapter, das eine Instanz von IconRowAdapter (von denen es nur eine im-Tätigkeit)...
- ... finde den Eintrag an der position 0 in die adapter...
- ... verwenden withItemContent (), um zu überprüfen, dass der text in das Element an dieser position entspricht "Künstler"
Wenn ich Laufe, bekomme ich folgende Fehlermeldung:
Caused by: java.lang.RuntimeException: No data found matching: is an instance of
uk.org.ngo.squeezer.IconRowAdapter contained values: <[Data:
uk.org.ngo.squeezer.IconRowAdapter$IconRow@b1585980 (class:
uk.org.ngo.squeezer.IconRowAdapter$IconRow) token: 0, Data:
uk.org.ngo.squeezer.IconRowAdapter$IconRow@b15859e0 (class:
uk.org.ngo.squeezer.IconRowAdapter$IconRow) token: 1, Data:
uk.org.ngo.squeezer.IconRowAdapter$IconRow@b1585a00 (class:
uk.org.ngo.squeezer.IconRowAdapter$IconRow) token: 2, Data:
uk.org.ngo.squeezer.IconRowAdapter$IconRow@b1585a20 (class:
uk.org.ngo.squeezer.IconRowAdapter$IconRow) token: 3, Data:
uk.org.ngo.squeezer.IconRowAdapter$IconRow@b1585a40 (class:
uk.org.ngo.squeezer.IconRowAdapter$IconRow) token: 4, Data:
uk.org.ngo.squeezer.IconRowAdapter$IconRow@b1585a60 (class:
uk.org.ngo.squeezer.IconRowAdapter$IconRow) token: 5, Data:
uk.org.ngo.squeezer.IconRowAdapter$IconRow@b1585a80 (class:
uk.org.ngo.squeezer.IconRowAdapter$IconRow) token: 6, Data:
uk.org.ngo.squeezer.IconRowAdapter$IconRow@b1585aa0 (class:
uk.org.ngo.squeezer.IconRowAdapter$IconRow) token: 7, Data:
uk.org.ngo.squeezer.IconRowAdapter$IconRow@b1585ac0 (class:
uk.org.ngo.squeezer.IconRowAdapter$IconRow) token: 8, Data:
uk.org.ngo.squeezer.IconRowAdapter$IconRow@b1585ae0 (class:
uk.org.ngo.squeezer.IconRowAdapter$IconRow) token: 9, Data:
uk.org.ngo.squeezer.IconRowAdapter$IconRow@b1585b00 (class:
uk.org.ngo.squeezer.IconRowAdapter$IconRow) token: 10, Data:
uk.org.ngo.squeezer.IconRowAdapter$IconRow@b1585b20 (class:
uk.org.ngo.squeezer.IconRowAdapter$IconRow) token: 11]>
Gibt es 12 Elemente in IconRowAdapter, so habe ich etwas Vertrauen, dass es auf der Suche in den korrekten adapter.
Alle Beispiel-code und Dokumentation, die ich habe finden können, wird davon ausgegangen, dass Sie versuchen zu finden ein Eintrag in den adapter, um es anzuklicken (und dies wird sich in den Wert in irgendeiner anderen Ansicht wechseln). Ich kann nichts finden, dass die Gespräche darüber, wie zu prüfen, wie der Wert eines bestimmten Elements in einem adapter.
Alle Erkenntnisse dankbar angenommen.
Bearbeiten, um hinzuzufügen:
Was funktioniert ist folgende:
onData(anything())
.inAdapterView(withId(R.id.item_list))
.atPosition(0)
.check(matches(hasDescendant(
allOf(withId(R.id.text1), withText(containsString("Artists"))))));
Verstehe ich das richtig, dass die Prüfung der Wert der R. id.text1 anzeigen, anstatt den Wert in den adapter. Ich denke, das macht Sinn für ein UI-test, aber ich bin immer noch daran interessiert, herauszufinden, wie (ob?) Ich kann verwenden Sie Espresso-test den Inhalt eines Artikels in den adapter.
InformationsquelleAutor Nik | 2014-12-23
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den matcher, der als argument übergeben zu
onData()
muss dem Wert entsprechen, der zurückgegeben durchAdapter.getItem()
.So die erste version nicht übereinstimmt, weil der falsche Typ verwendet wird. Es sollte sein:
Was kann auch ein Fallstrick ist mit equalTo auf verschiedene Arten von CharSequences. String eine CharSequence, aber wenn IconRow.getText() gibt CharSequence anstelle von String, dann kann dies auch Spannable, Editable, etc, in dem Fall equalTo würde nicht übereinstimmen. Also, wenn IconRow.getText() Rückgabe nichts, aber String, stellen Sie sicher, es zu konvertieren in eine Zeichenfolge vor dem Vergleich.
InformationsquelleAutor haffax
Ausprobieren muss es funktionieren:
Wenn Sie löschen
atPosition(0)
, dann wirst du nur überprüfen, Präsenz in der adapter-Ansicht.Haben Sie modifiziert die matcher?
yep. so etwas
fun withItemContent(expectedText: String): Matcher<Any> { checkNotNull(expectedText) return withItemContent(equalTo(expectedText).toString()) }
InformationsquelleAutor denys