2016-07-26 42 views
0

我有一个服务器调用是使用Retrofit + RxJava进行的,我想在屏幕上测试它的行为。Android Espresso正在等待可观察的rxjava .delay

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

我试图使用Observable类中的“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())); 

运行测试后,我意识到,咖啡实际上是在等待延迟可观察到的设置,实际执行检查(isDisplayed)前。这样它只会在信息加载和加载图像消失后才会检查。

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

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

回答

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

希望这会有所帮助。

+0

你是对的,我不愿意接受这是一个动画问题,因为我有一些其他的测试搞乱了结果,但最终它变成了动画。在我的情况下,当应用程序在调试模式下运行时,我禁用了所有的动画。 –

相关问题