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