2016-07-26 10 views
0

Ich habe einen Server Anruf mit Retrofit + RxJava gemacht, dass ich sein Verhalten auf dem Bildschirm testen möchten.Android Espresso wartet rxjava .delay von beobachtbaren

Das Ziel besteht darin, vor dem Aufruf ein Ladebild zu setzen und nach dem Einblenden der Ergebnisse das Ladebild auszublenden und die Daten anzuzeigen.

Ich habe versucht, den Mock mit der "Verzögerung" -Methode aus der Observable-Klasse einzurichten, damit Espresso das Bild finden kann. Das ist der Code, den ich verwendet:

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())); 

Nach der Durchführung der Untersuchung wurde mir klar, dass der Espresso ist eigentlich die Verzögerung auf beobachtbaren gesetzt warten, bevor sie tatsächlich die Ausführung der Prüfung (wirdangezeigt). Auf diese Weise wird nur überprüft, nachdem die Informationen geladen wurden und das Ladebild verschwunden ist.

Ist das das normale Verhalten für RxJava/Espresso?

Gibt es einen besseren Weg, dies zu erreichen?

Antwort

1

In der R.id.panel_loading muss eine Animation ausgeführt werden, die gerade ausgeführt wird.

Wenn im UI-Thread eine Animation angezeigt wird, wartet der Espresso bis zum Ende.

ich hatte das gleiche Problem, und ich habe eine Viewaction die Animationen für meine benutzerdefinierten Beladungen, hier zu deaktivieren, ist der Code:

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); 
     } 
    }; 
} 

und ich nenne es auf diese Weise, bevor Sie die Taste drücken, die das Laden zeigt und so warten die Tests nicht:

Wenn das panel_loading nicht derjenige ist, der die Animation etwas anderes machen muss.

Hoffe, das hilft.

+0

Sie haben Recht, ich war widerwillig zu akzeptieren, dass es ein Animationsproblem war, weil ich einige andere Tests hatte, die mit den Ergebnissen durcheinander bringen, aber am Ende stellt es sich heraus, die Animation zu sein. In meinem Fall habe ich alle Animationen deaktiviert, wenn die App im Debug-Modus läuft. –