14

我正在使用适用于 Android 的 Google Espresso 编写 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();
    }
}

在 (1) 上,我通知我的活动从 web 服务加载元素。在 (2) 上,我正在等待断言其内容的视图。这是测试失败的部分,因为它在 web 服务响应应用程序之前执行。

如何让 Espresso 等待特定数据出现在屏幕上?还是我应该以不同的方式思考来编写这样的测试?

4

2 回答 2

19

您可以通过使用 Espresso 为您的 Web 服务注册 IdlingResource 来处理这种情况。看看这篇文章:https ://developer.android.com/training/testing/espresso/idling-resource.html

最有可能的是,您需要使用CountingIdlingResource(它使用一个简单的计数器来跟踪某物何时空闲)。此示例测试演示了如何做到这一点。

于 2014-01-08T23:22:26.033 回答
1

如果您不介意将 UiAutomator 与 Espresso 一起使用,您可以在步骤 4 中执行类似的操作。

UiObject object = mDevice.findObject(new UiSelector().resourceId(packageName + ":id/" + "review_box"));
object.waitForExists(5000);

https://developer.android.com/reference/android/support/test/uiautomator/UiObject.html#waitForExists(long)

于 2017-09-18T12:15:10.120 回答