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

Android Espresso is waiting rxjava .delay from observable

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

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

我尝试使用 Observable class 中的 "delay" 方法设置模拟,以便 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()));

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

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

有没有更好的方法实现这个?

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 不是制作动画的那个,则必须是其他东西。

希望对您有所帮助。