2016-07-26 1 views
2

Pouvons-nous effectuer une assertion sur Edittext Value et écrire notre test en fonction de sa sortie. Comme si nous EditText la valeur est égale à notre valeur, nous voulons effectuer un autre État B.Affirmer la valeur EditText dans Espresso

onView(withId(viewId)).check(matches(isEditTextValueEqualTo(viewId, value))); 

Matcher<View> isEditTextValueEqualTo(final int viewId, final String content) { 

    return new TypeSafeMatcher<View>() { 

     @Override 
     public void describeTo(Description description) { 
      description.appendText("Match Edit Text Value with View ID Value : : " + content); 
     } 

     @Override 
     public boolean matchesSafely(View view) { 
      if (view != null) { 
       String editTextValue = ((EditText) view.findViewById(viewId)).getText().toString(); 

       if (editTextValue.equalsIgnoreCase(content)) { 
        return true; 
       } 
      } 
      return false; 
     } 
    }; 
} 

Ce ne fonctionne pas à l'aide essayer .. catch (Exception e)

Répondre

0

Quand je vérifie la valeur et l'affirmation a échoué, il jette AssertionFailedError qui n'est pas dans la hiérarchie des exceptions. Il est corrigé avec try ... catch (AssertionFailedError e)

4

Je ne pense pas que vous shoud faire un findViewById à l'intérieur du matcher, je ne vois aucune raison de le faire.

J'ai mis à jour votre matcher:

Matcher<View> isEditTextValueEqualTo(final String content) { 

    return new TypeSafeMatcher<View>() { 

     @Override 
     public void describeTo(Description description) { 
      description.appendText("Match Edit Text Value with View ID Value : : " + content); 
     } 

     @Override 
     public boolean matchesSafely(View view) { 
      if (!(view instanceof TextView) && !(view instanceof EditText)) { 
        return false; 
      } 
      if (view != null) { 
       String text; 
       if (view instanceof TextView) { 
        text =((TextView) view).getText().toString(); 
       } else { 
        text =((EditText) view).getText().toString(); 
       } 

       return (text.equalsIgnoreCase(content)); 
      } 
      return false; 
     } 
    }; 
} 

Et l'appeler ainsi:

onView(withId(viewId)).check(matches(isEditTextValueEqualTo(value))); 
+0

Merci pour votre commentaire mais il est corrigé avec le bloc catch AssertionFailedError. Aussi FYI nous pouvons obtenir la vue à l'intérieur de Matcher. – Krishnakant

+1

Je ne dis pas que ça ne peut pas être fait, je viens de dire que ce n'est pas efficace. Si vous avez une vue, vous ne devez pas effectuer d'opérations lentes pour obtenir la même vue. FindViewById n'est pas une opération bon marché comme tout accès à la hiérarchie de vue. – jeprubio

+0

ohk Merci beaucoup :-) – Krishnakant