Próbuję użyć Espresso (2.0), aby sprawdzić, czy tekst w elemencie adaptera listy na danej pozycji jest poprawny, i dla mojego życia Nie mogę znaleźć prawidłowych metod wywoływania.Jak używać ekspresu do espresso do testowania elementu w adapterze na określonej pozycji
Mój typ adaptera (IconRowAdapter
) zawiera listę obiektów IconRow
. Każdy IconRow ma metodę getText()
, która zwraca tekst tego elementu.
Oto kod testu roboczego innego niż Espresso, który sprawdza, czy obiekt IconRow w pozycji 0 w adapterze ma oczekiwany tekst ("Wykonawcy").
public void testHomeActivityMenu() {
ListView list = (ListView) getActivity().findViewById(R.id.item_list);
IconRowAdapter adapter = (IconRowAdapter) list.getAdapter();
assertEquals(adapter.getItem(0).getText(), "Artists");
}
To działa.
Próbowałem różnorodnych wariacji na poniższym kodzie Espresso zrobić to samo,
onData(is(instanceOf(IconRowAdapter.class)))
.atPosition(0)
.check(matches(withItemContent("Artists")));
gdzie withItemContent()
wygląda następująco:
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);
}
};
}
co by się spodziewać, że do zrobienia jest:
- Pobierz dane z adaptera, który jest instancją IconRowAdapter (z czego " s tylko w działaniu) ...
- ... znajdź wpis w pozycji 0 w adapterze ...
- ... użyj withItemContent(), aby sprawdzić, czy tekst w pozycji na tej pozycji pasuje do „Artyści”
Kiedy biegnę, że pojawia się następujący błąd:
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]>
Istnieje 12 przedmiotów w IconRowAdapter, więc mam trochę pewności, że to patrząc w odpowiednim adapterem.
Cały przykładowy kod i dokumentacja, które udało mi się znaleźć, zakładają, że próbujesz znaleźć wpis w adapterze, aby go kliknąć (i że spowoduje to wyświetlenie wartości w innym widoku wymiana pieniędzy). Nie mogę znaleźć niczego, co mówi o tym, jak sprawdzić wartość danego elementu w adapterze.
Wszelkie uwagi z wdzięcznością przyjmowane.
Edycja dodać:
Co działa to:
onData(anything())
.inAdapterView(withId(R.id.item_list))
.atPosition(0)
.check(matches(hasDescendant(
allOf(withId(R.id.text1), withText(containsString("Artists"))))));
Jeśli dobrze rozumiem, że właściwie to testuje wartość widzenia R.id.text1, zamiast wartości w adapter. Wydaje mi się, że ma to sens w przypadku testu interfejsu użytkownika, ale nadal chcę dowiedzieć się, jak (jeśli?) Mogę użyć Espresso do przetestowania zawartości elementu w adapterze.
Metoda "withItemContent" nie działa poprawnie w kotlinach. Może masz jakieś pojęcie o tym? – Morozov
Czy zmodyfikowałeś matcher? – denys
tak. coś podobnego do 'zabawy zItemContent (expectedText: String): Matcher { checkNotNull (expectedText) return withItemContent (equalTo (expectedText) .toString()) } –
Morozov