2016-07-26 43 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

你是對的,我不願意接受這是一個動畫問題,因爲我有一些其他的測試搞亂了結果,但最終它變成了動畫。在我的情況下,當應用程序在調試模式下運行時,我禁用了所有的動畫。 –

相關問題