Android Espresso正在等待来自observable的rxjava .delay

时间:2016-07-26 12:44:49

标签: android rx-java android-espresso

我有一个使用Retrofit + RxJava进行的服务器调用,我想在屏幕上测试它的行为。

目标是在执行调用之前设置加载图像,并在获得结果后隐藏加载图像并显示数据。

我尝试使用Observable类中的“延迟”方法设置模拟,因此Espresso可以找到图像。这是我使用的代码:

Observable<AccountDetails> observable = Observable.just(details)
            .delay(5, TimeUnit.SECONDS)
            .observeOn(AndroidSchedulers.mainThread())
            .subscribeOn(Schedulers.io());
doReturn(observable).when(mScope).requestAccounts();

performServerCall();

onView(withId(R.id.panel_loading)).check(matches(isDisplayed()));

运行测试后,我意识到在实际执行检查(isDisplayed)之前,Espresso实际上正在等待Observable设置的延迟。这样它只会在加载信息并且加载图像消失后进行检查。

这是RxJava / Espresso的正常行为吗?

有没有更好的方法来实现这一目标?

1 个答案:

答案 0 :(得分:1)

正在执行的R.id.panel_loading中必须有一个动画。

当UI线程中有动画时,espresso会一直等到它结束。

我遇到了同样的问题,我做了一个ViewAction来禁用自定义加载的动画,这里是代码:

public static ViewAction disableAnimations() {
    return new ViewAction() {
        @Override
        public Matcher<View> getConstraints() {
            return isAssignableFrom(CustomLoading.class);
        }

        @Override
        public String getDescription() {
            return "Disable animations";
        }

        @Override
        public void perform(UiController uiController, View view) {
            CustomLoading loading = (CustomLoading) view;
            loading.setAnimations(false);
        }
    };
}

在按下显示加载的按钮之前我按照这种方式调用它,因此测试不会等待:

onView(withId(R.id.panel_loading)).perform(disableAnimations());

如果panel_loading不是制作动画的东西必须是其他东西。

希望这有帮助。