我正在使用谷歌Espresso for Android编写UI测试,我一直坚持如何断言TextView文本,这些内容是从Web服务异步加载的。我目前的代码是:
public class MyTest extends BaseTestCase<MyActivity>{
public void setUp() throws Exception {
// (1) Tell the activity to load 'element-to-be-loaded' from webservice
this.setActivityIntent(new Intent(Intent.ACTION_VIEW, Uri.parse("data://data/element-to-be-loaded")));
getActivity();
super.setUp();
}
public void testClickOnReviews(){
// (2) Check the element is loaded and its name is displayed
Espresso
.onView(ViewMatchers.withId(R.id.element_name))
.check(ViewAssertions.matches(ViewMatchers.withText("My Name")));
// (3) Click on the details box
Espresso
.onView(ViewMatchers.withId(R.id.details_box))
.check(ViewAssertions.matches(ViewMatchers.isDisplayed()))
.perform(ViewActions.click());
// (4) Wait for the details screen to open
Espresso
.onView(ViewMatchers.withId(R.id.review_box));
// Go back to element screen
Espresso.pressBack();
}
}
On(1),我通知我的活动从webservice加载一个元素。在(2),我正在等待断言其内容的观点。这是测试失败的部分,因为它在webservice应答应用程序之前执行。
如何告诉Espresso等待屏幕上显示特定数据?或者我应该以不同的方式思考这样的测试?
答案 0 :(得分:18)
您可以通过向Espresso注册Web服务的IdlingResource来处理此案例。看一下这篇文章:https://developer.android.com/training/testing/espresso/idling-resource.html
最有可能的是,您需要使用CountingIdlingResource(使用简单的计数器来跟踪某些内容何时处于空闲状态)。这个sample test演示了如何做到这一点。
答案 1 :(得分:1)
如果您不喜欢使用带Espresso的UiAutomator,您可以在第4步中执行此类操作。
UiObject object = mDevice.findObject(new UiSelector().resourceId(packageName + ":id/" + "review_box"));
object.waitForExists(5000);