Как проверить значения TextInputLayout (подсказка, ошибка и т. д.) с помощью Android Эспрессо?
Я пытаюсь проверить с помощью кофе, если мой TextInputLayout
представления имеют определенную подсказку. Я использовал код, как показано ниже:
Espresso.onView(ViewMatchers.withId(R.id.edit_text_email))
.check(ViewAssertions.matches(
ViewMatchers.withHint(R.string.edit_text_email_hint)))
это отлично работает для нормального EditText
представления, не завернутые в TextInputLayout
. Однако, когда он оборачивается, он больше не работает.
Я попытался использовать решение из Android Espresso-Как проверить подсказку EditText?, но он все еще не работает.
Я также посмотрел в: https://code.google.com/p/android/issues/detail?id=191261 это сообщило о проблеме, он говорит, что обходной путь довольно прост, указывая на текущий withHint
код, но я не могу заставить его работать.
любые идеи, чтобы исправить эту проблему?
3 ответов
вот мой пользовательский matcher:
public static Matcher<View> hasTextInputLayoutHintText(final String expectedErrorText) {
return new TypeSafeMatcher<View>() {
@Override
public boolean matchesSafely(View view) {
if (!(view instanceof TextInputLayout)) {
return false;
}
CharSequence error = ((TextInputLayout) view).getHint();
if (error == null) {
return false;
}
String hint = error.toString();
return expectedErrorText.equals(hint);
}
@Override
public void describeTo(Description description) {
}
};
}
}
а вот как использовать:
@RunWith(AndroidJUnit4.class)
public class MainActivityTest {
@Rule
public ActivityTestRule<MainActivity> mRule = new ActivityTestRule<>(MainActivity.class);
@Test
public void testMyApp() {
onView(withId(R.id.textInputLayout)).check
(matches(hasTextInputLayoutErrorText(mRule.getActivity().getString(R.string
.app_name))));
}
если вы хотите проверить errorText
of TextInputLayout
, измените эту строку:
CharSequence error = ((TextInputLayout) view).getHint();
С
CharSequence error = ((TextInputLayout) view).getError();
надеюсь, это поможет
более общее решение, которое будет работать с любым представлением, имеющим метод "getHint":
public static Matcher<View> withCustomHint(final Matcher<String> stringMatcher) {
return new BaseMatcher<View>() {
@Override
public void describeTo(Description description) {
}
@Override
public boolean matches(Object item) {
try {
Method method = item.getClass().getMethod("getHint");
return stringMatcher.matches(method.invoke(item));
} catch (NoSuchMethodException e) {
} catch (InvocationTargetException e) {
} catch (IllegalAccessException e) {
}
return false;
}
};
}
использование:
onView(withId(R.id.SomeLayout)).check(matches(withCustomHint(is("SomeString"))));
решения выше не работали для моего варианта использования. Я хотел найти TextInputEditText и ввести в него текст. Вот мое решение:
@VisibleForTesting
class WithTextInputLayoutHintMatcher @RemoteMsgConstructor
constructor(@field:RemoteMsgField(order = 0)
private val stringMatcher: Matcher<String>) : TypeSafeMatcher<View>() {
override fun describeTo(description: Description) {
description.appendText("with TextInputLayout hint: ")
stringMatcher.describeTo(description)
}
public override fun matchesSafely(textInputEditText: View): Boolean {
if (textInputEditText !is TextInputEditText) return false
return stringMatcher.matches((textInputEditText.parent.parent as? TextInputLayout)?.hint)
}
}
/**
* Returns a matcher that matches [TextInputEditText] based on it's hint property value.
*
*
* **Note:** View's sugar for `withHint(is("string"))`.
*
* @param hintText [String] with the hint text to match
*/
fun withTextInputHint(hintText: String): Matcher<View> {
return withTextInputHint(Matchers.`is`(checkNotNull(hintText)))
}
/**
* Returns a matcher that matches a descendant of [TextInputEditText] that is displaying the hint
* associated with the given resource id.
*
* @param resourceId the string resource the text view is expected to have as a hint.
*/
fun withTextInputHint(resourceId: Int): Matcher<View> {
return withTextInputHint(getString(resourceId))
}
/**
* Returns a matcher that matches [TextView]s based on hint property value.
*
*
* **Note:** View's hint property can be `null`, to match against it use `
* withHint(nullValue(String.class)`
*
* @param stringMatcher [`Matcher
`](http://hamcrest.org/JavaHamcrest/javadoc/1.3/org/hamcrest/Matcher.html) * of [String] with text to match
*/
fun withTextInputHint(stringMatcher: Matcher<String>): Matcher<View> {
return WithTextInputLayoutHintMatcher(checkNotNull(stringMatcher))
}
использование:
onView(withTextInputHint(R.string.hint)).perform(ViewActions.typeText("Type text here"))