我有一个向服务器发送异步请求的活动。 就在它被触发时,我显示一个进度栏。结果返回到活动后,我将进度条设置为View.GONE。
我现在有两个测试。 一种用于测试尝试使用错误凭据登录的测试 完美地工作:
@Test
public void tryLogin__withWrongPassword() {
onView(withId(R.id.loginEmail))
.perform(typeText("em@ail.com"), closeSoftKeyboard());
onView(withId(R.id.loginPassword))
.perform(typeText("123456789"), closeSoftKeyboard());
onView(withId(R.id.loginSubmit))
.perform(click());
onView(withId(R.id.loginProgressBar))
.check(matches(isDisplayed()));
onView(isRoot()).perform(waitFor(3000));
onView(withId(R.id.loginProgressBar))
.check(matches(not((isDisplayed()))));
onView(withId(R.id.loginPassword))
.check(matches(hasErrorText("Wrong password")));
}
我测试的那台没有互联网连接不起作用:
@Test
public void tryLogin__withoutInternet() {
onView(withId(R.id.loginEmail))
.perform(typeText("em@ail.com"), closeSoftKeyboard());
onView(withId(R.id.loginPassword))
.perform(typeText("123456789"), closeSoftKeyboard());
onView(withId(R.id.loginSubmit))
.perform(click());
onView(withId(R.id.loginProgressBar))
.check(matches(isDisplayed()));
onView(isRoot()).perform(waitFor(3000));
onView(withId(R.id.loginProgressBar))
.check(matches(not((isDisplayed()))));
onView(withText("Network error, try again later"))
.inRoot(withDecorView(not(mActivityRule.getActivity().getWindow().getDecorView())))
.check(matches(isDisplayed()));
}
测试失败,因为在这种情况下进度条只显示了不到一秒钟(因为错误几乎是从视图模型中立即发出的) 看起来Espresso仍在加载时无法捕获它。
我的问题是,如何在我的测试中解决这个问题?我读过某处Espresso无法测试进度条的建议,但建议是改用UIAutomator,但是我只是从Instrumented测试开始,选择了Espresso,对于这种情况,我很难找到理想的工具。而且,当进度条出现半秒钟以上(例如在我的第一个测试中)时,它似乎工作得很好
P.S。 waitFor(long millis)方法是一种实用程序附加方法,我强迫Espresso在检查某些内容之前执行指定的时间(强制执行超时作为质量要求)
编辑以进行澄清: 我的主要问题是,是否有人知道为什么活动时间少于一定时间而不是活动时间超过半秒(即使在执行后立即进行检查)也看不到可见性? ())致电。