我有一个使用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的正常行为吗?
有没有更好的方法来实现这一目标?
答案 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不是制作动画的东西必须是其他东西。
希望这有帮助。