2014-04-30 3 views
14

Ich möchte Textstring in einer Textansicht in LinearLayout angezeigt bekommen. Kann Espresso das tun? Wenn nicht, gibt es einen anderen Weg, das zu tun, oder kann ich Android-API im Espresso-Testfall verwenden? Ich benutze API 17 18 oder neuer, espresso 1.1 (Es sollte der neueste sein.). Ich habe keine Ahnung davon. Vielen Dank.wie man Text von Textview mit espresso

+0

Ja, Espresso kann dies tun, wenn auf eine hacky Weise. Aber die meiste Zeit sollten Sie nicht müssen, weil Sie in Tests normalerweise Text in einer Textansicht mit einem gegebenen Text vergleichen oder eine Eigenschaft davon testen möchten. Mit mehr Details zu dem, was Sie tatsächlich in Ihrem Test versuchen, ist es einfacher, eine hilfreiche Antwort zu geben. – haffax

+0

Nun, was ist eigentlich der Hacky Weg? Wie geht das? Ich muss diesen Text in einen Bericht einfügen. Vielen Dank für Ihre Aufmerksamkeit, @haffax –

Antwort

28

Die Grundidee besteht darin, eine Methode mit einer internen ViewAction zu verwenden, die den Text in seiner perform -Methode abruft. Anonyme Klassen können nur auf letzte Felder zugreifen, sodass wir nicht einfach eine lokale Variable von getText() setzen können, sondern stattdessen ein Array von String, um die Zeichenfolge aus der ViewAction zu entfernen.

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]; 
} 

Hinweis: Diese Art von Sichtdaten Retrievern sollte mit Vorsicht verwendet werden. Wenn Sie ständig diese Art von Methoden schreiben, gibt es eine gute Chance, Sie tun etwas falsch von Anfang an. Greifen Sie auch niemals auf die View außerhalb eines ViewAssertion oder ViewAction zu, da nur dort sichergestellt ist, dass die Interaktion sicher ist, da sie vom UI-Thread ausgeführt wird und vor der Ausführung geprüft wird, dass keine anderen Interaktionen stattfinden.

+0

Könnten Sie bitte eine Beispielverwendung Ihres Codes eingeben? Ich sehe nicht, wie Sie Ihre Lösung verwenden. Vielen Dank – Loebre

+0

@Loebre können Sie es wie folgt verwenden 'getText (withId (viewId));' – CROSP

5

Wenn Sie den Textwert mit einem anderen Text überprüfen möchten, können Sie Matcher erstellen. Sie können meinen Code sehen, um Ihre eigene Methode zu erstellen:

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"); 
     } 
    }; 
}