2014-12-23 9 views
5

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.

Odpowiedz

3

Matcher przekazany jako argument do onData() musi być zgodny z wartością zwróconą przez Adapter.getItem(). Pierwsza wersja nie pasuje, ponieważ użyto niewłaściwego typu.Powinno być:

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

To, co może być pułapką, to używanie równań na różnych typach CharSequences. String jest CharSequence, ale jeśli IconRow.getText() zwraca CharSequence zamiast String, to może być również Spannable, Editable, itp. W takim przypadku equalTo nie pasuje. Więc jeśli IconRow.getText() zwraca cokolwiek poza String, przed porównaniem należy przekonwertować go na ciąg.

0

Spróbuj tego musi działać:

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

Jeśli usuniesz atPosition(0) Pokochasz więc tylko sprawdzić obecność w widoku adaptera.

+0

Metoda "withItemContent" nie działa poprawnie w kotlinach. Może masz jakieś pojęcie o tym? – Morozov

+0

Czy zmodyfikowałeś matcher? – denys

+0

tak. coś podobnego do 'zabawy zItemContent (expectedText: String): Matcher { checkNotNull (expectedText) return withItemContent (equalTo (expectedText) .toString()) } – Morozov

Powiązane problemy