2014-04-30 14 views
14

Chcę uzyskać ciąg tekstowy wyświetlany w widoku tekstowym w LinearLayout. czy może to zrobić espresso? Jeśli nie, czy jest inny sposób, aby to zrobić, czy mogę użyć apia Android w teście espresso? Używam API 17 18 lub nowszego, espresso 1.1 (powinien być najnowszy). Nie mam o tym pojęcia. Dzięki.Jak uzyskać tekst z widoku tekstowego przy użyciu espresso

+0

Tak, espresso może to zrobić, jeśli jest w hacky sposób. Ale najczęściej nie powinieneś tego robić, ponieważ w testach zazwyczaj chcesz porównać tekst w tekście z danym tekstem lub przetestować jakąś jego własność. Więcej szczegółów na temat tego, co faktycznie próbujesz zrobić w teście, łatwiej jest udzielić pomocnej odpowiedzi. – haffax

+0

Cóż, czym właściwie jest hacky? Jak to zrobić? Muszę uzyskać tekst do wstawienia do raportu. Dziękujemy za uwagę, @haffax –

Odpowiedz

28

Podstawową ideą jest użycie metody z wewnętrzną ViewAction, która pobiera tekst w swojej metodzie wykonywania. Anonimowe klasy mają dostęp tylko do pól końcowych, więc nie możemy pozwolić, aby ustawiono lokalną zmienną getText(), ale zamiast tego tablica String jest używana do wyciągnięcia łańcucha z ViewAction.

String getText(final Matcher<View> matcher) { 
    final String[] stringHolder = { null }; 
    onView(matcher).perform(new ViewAction() { 
     @Override 
     public Matcher<View> getConstraints() { 
      return isAssignableFrom(TextView.class); 
     } 

     @Override 
     public String getDescription() { 
      return "getting text from a TextView"; 
     } 

     @Override 
     public void perform(UiController uiController, View view) { 
      TextView tv = (TextView)view; //Save, because of check in getConstraints() 
      stringHolder[0] = tv.getText().toString(); 
     } 
    }); 
    return stringHolder[0]; 
} 

Uwaga: Ten rodzaj retrieverów przeglądania danych należy stosować z ostrożnością. Jeśli ciągle odkrywasz, że piszesz tego rodzaju metody, istnieje duża szansa, że ​​robisz coś złego przed rozpoczęciem. Nie należy też nigdy uzyskiwać dostępu do widoku poza numerem ViewAssertion lub ViewAction, ponieważ tylko tam jest zapewnione, że interakcja jest bezpieczna, ponieważ jest uruchamiana z wątku interfejsu użytkownika, a przed wykonaniem jest sprawdzana, że ​​żadne inne interakcje nie mieszają się.

+0

Czy możesz podać przykład użycia swojego kodu? Nie widzę sposobu korzystania z twojego rozwiązania. Dziękuję – Loebre

+0

@Loebre możesz go używać w ten sposób 'getText (withId (viewId));' – CROSP

5

Jeśli chcesz sprawdzić wartość tekstu za pomocą innego tekstu, możesz utworzyć Matchera. Możesz zobaczyć mój kod, aby utworzyć własną metodę:

public static Matcher<View> checkConversion(final float value){ 
    return new TypeSafeMatcher<View>() { 

     @Override 
     protected boolean matchesSafely(View item) { 
      if(!(item instanceof TextView)) return false; 

      float convertedValue = Float.valueOf(((TextView) item).getText().toString()); 
      float delta = Math.abs(convertedValue - value); 

      return delta < 0.005f; 
     } 

     @Override 
     public void describeTo(Description description) { 
      description.appendText("Value expected is wrong"); 
     } 
    }; 
} 
Powiązane problemy