安卓浓缩咖啡-如何检查EditText提示



我开始玩Espresso了,我的基本测试已经开始了。现在想知道如何检查我的编辑文本是否有特定的提示文本?谢谢

onView(withId(R.id.locationInput)).check(matches...?)

由于Espresso 2.0只使用内部ViewMatcher并带有提示:

onView(withId(R.id.locationInput)).check(matches(withHint("your_hint")))

看起来我想明白了。基本上,你需要创建自己的匹配器:

public static Matcher<View> withHint(final String expectedHint) {
    return new TypeSafeMatcher<View>() {
        @Override
        public boolean matchesSafely(View view) {
            if (!(view instanceof EditText)) {
                return false;
            }
            String hint = ((EditText) view).getHint().toString();
            return expectedHint.equals(hint);
        }
        @Override
        public void describeTo(Description description) {
        }
    };
}

然后你可以使用它:

onView(withId(R.id.locationInput)).check(matches(withHint("Location (Optional)")));

有一种稍微不同的方法。在我的情况下,在将字符串传递给matcher之前,您检查字符串是否为null(如Espresso示例中所述)。而且在下面的代码中,您不需要带有此提示的EditText的R.id。您只需检查是否显示带有"hintText"的提示:

import static com.google.common.base.Preconditions.checkArgument;
import static com.google.common.base.Preconditions.checkNotNull;
public final class Matchers {
    public static Matcher<View> withItemHint(String hintText) {
        // use preconditions to fail fast when a test is creating an invalid matcher.
        checkArgument(!(hintText.equals(null)));
        return withItemHint(is(hintText));
    }
    public static Matcher<View> withItemHint(final Matcher<String> matcherText) {
        // use preconditions to fail fast when a test is creating an invalid matcher.
        checkNotNull(matcherText);
        return new BoundedMatcher<View, EditText>(EditText.class) {      
            @Override
            public void describeTo(Description description) {
                description.appendText("with item hint: " + matcherText);
            }
            @Override
            protected boolean matchesSafely(EditText editTextField) {
                return matcherText.matches(editTextField.getHint().toString());
            }
        };
    }
}

用法:

import static com.google.android.apps.common.testing.ui.espresso.matcher.ViewMatchers.isDisplayed;
import static com.google.android.apps.common.testing.ui.espresso.assertion.ViewAssertions.matches;
import static com.google.android.apps.common.testing.ui.espresso.Espresso.onView;
import static com.your.package.withMatcher.withItemHint;
.
.
.
onView(withItemHint(someHintString)).check(matches(isDisplayed()));

我创建了一个Matcher,它支持传递resourceId而不是String

public static Matcher<View> withHint(final int resourceId) {
     return new BoundedMatcher<View, TextView>(TextView.class) {
     private String resourceName = null;
     private String expectedHint = null;
     @Override
     public boolean matchesSafely(TextView editText) {
        if (null == expectedHint) {
          try {
            expectedHint = editText.getResources().getString(resourceId);
            resourceName = editText.getResources().getResourceEntryName(resourceId);
          } catch (Resources.NotFoundException ignored) {
            /* view could be from a context unaware of the resource id. */
          }
        }
        if (null != expectedHint) {
          return expectedHint.equals(editText.getHint());
        } else {
          return false;
        }
      }
      @Override
      public void describeTo(Description description) {
        description.appendText("with string from resource id: ");
        description.appendValue(resourceId);
        if (null != resourceName) {
          description.appendText("[");
          description.appendText(resourceName);
          description.appendText("]");
        }
        if (null != expectedHint) {
          description.appendText(" value: ");
          description.appendText(expectedHint);
        }
      }
    };
  }

这是Valera Zakharov指出的Espresso的带文本匹配器的复制品(带文本(resourceId)

最新更新