2015-12-15 10 views
5

Grundsätzlich versuche ich zu testen, dass nach dem Login falsch habe ich eine Fehlermeldung im E-Mail-Feld angezeigt.Android Espresso. Wie überprüfe ich ErrorText in TextInputLayout

Die Aussicht ist:

<android.support.design.widget.TextInputLayout 
    android:id="@+id/ti_email" 
    android:paddingEnd="10dp" 
    android:paddingTop="10dp" 
    android:paddingLeft="10dp" 
    android:paddingRight="10dp" 
    android:paddingStart="10dp" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content"> 

    <EditText 
     android:id="@+id/et_email" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:hint="@string/authentication_email_placeholder" 
     android:inputType="textEmailAddress" 
     android:maxLines="1" 
     android:textSize="16sp" 
     tools:text="@string/placeholder_email"/> 

</android.support.design.widget.TextInputLayout> 

Ich versuche, es so zu tun:

onView(withId(R.id.et_email)) 
    .check(matches(hasErrorText(
     ctx.getString(R.string.authentication_error_empty_email)))); 

Antwort

11

Das funktioniert mit einem CustomMatcher:

public static Matcher<View> hasTextInputLayoutErrorText(final String expectedErrorText) { 
    return new TypeSafeMatcher<View>() { 

     @Override 
     public boolean matchesSafely(View view) { 
      if (!(view instanceof TextInputLayout)) { 
       return false; 
      } 

      CharSequence error = ((TextInputLayout) view).getError(); 

      if (error == null) { 
       return false; 
      } 

      String hint = error.toString(); 

      return expectedErrorText.equals(hint); 
     } 

     @Override 
     public void describeTo(Description description) { 
     } 
    }; 
} 
2

Sie könnten ein benutzerdefinierter Matcher schreiben:

public final class CustomItemMatchers { 

private static class TextInputLayoutErrorMatcher extends BoundedMatcher<Object, Wrapper> { 

    private final Matcher<String> itemTextMatcher; 

    public TextInputLayoutErrorMatcher(final Matcher<String> itemTextMatcher){ 
    super(TextInputLayout.class); 
    this.itemTextMatcher = itemTextMatcher; 
    } 

    @Override 
    public void describeTo(Description description) { 
    description.appendText("with error content: "); 
    itemTextMatcher.describeTo(description); 
    } 

    @Override 
    protected boolean matchesSafely(TextInputLayout til) { 
    if (til == null) { 
     return false; 
    } 
    return itemTextMatcher.matches((til.getError()); 
    } 
} 

public static Matcher<Object> withErrorName(final Matcher<String> itemTextMatcher) { 
    checkNotNull(itemTextMatcher); 
    return new TextInputLayoutErrorMatcher(itemTextMatcher); 
} 
} 

Sie können es dann mit

matches(CustomItemMatchers.withErrorName(equalTo("My Error"))) 

Dieser Code wurde mit Espresso 1 geschrieben, aber ich hoffe, es funktioniert immer noch.

-4

Verwenden Sie bitte die Methode setError() von EditText Beispiel: EditText emailEditText;

if(invalidLogin) 
    emailEditText.setError("Error Message"); 
Verwandte Themen