2014-12-10 13 views
7

Ich habe eine Aktivität, die RxLoader verwendet, um Daten vom Server nach der Aktivitätserstellung abzurufen, und füllt eine Listenansicht auf. Ich habe auch Testcode, der versucht, auf die erste Zeile der Listenansicht zu klicken, nachdem sie ausgefüllt wurde.Espresso-Test mit RxLoader

Da ich RxLoader verwende, muss ich eine benutzerdefinierte IdlingResource für Espresso schreiben. Das Problem besteht jedoch darin, dass der Test beendet wird (fehlschlägt), bevor meine Listenansicht ausgefüllt wird.

Dies ist mein Tätigkeitscode:

 RxLoaderManager.get(this).create(
      "my_loader", 
      mRestService.loadData(), 
      new RxLoaderObserver<MyData>() { 
       @Override 
       public void onNext(MyData data) { 
        // populate listview with data here 
        ... 
       } 
    }); 

Hier ist meine IdlingResource Umsetzung:

public class IdlingApiServiceWrapper implements IdlingResource { 

public Observable<MyData> loadData(){ 
    counter.incrementAndGet(); 
    Observable<MyData> observable = api.loadData().finallyDo(new Action0() { 
     @Override 
     public void call() { 
      counter.decrementAndGet(); 
      notifyIdle(); 
     } 
    }); 
    return observable; 

} }

Problem ist, dass: Wenn ich den Test-Code ausführen, wobei das Verfahren "counter.decrementAndGet()" wird immer vor der Methode "onNext()" in meiner Aktivität aufgerufen. Mein Test schlägt fehl, da erwartet wird, dass listview ausgefüllt wird.

Anscheinend mache ich etwas falsch. Aber was mache ich falsch?

UPDATE:

Hier ist ein sauberer Code-Snippet, das Problem zu veranschaulichen:

 RxLoaderManager.get(this).create(
      "my_loader", 
      myObservable.finallyDo(new Action0() { 
       @Override 
       public void call() { 
        //log 
       } 
      }), 
      new RxLoaderObserver<MyData>() { 
       @Override 
       public void onNext(MyData data) { 
       // do something here 
      } 
     }).start();   

In dem obigen Code, der Code-Schnipsel in finallyDo() wird vor dem "OnNext()" Aufruf aufgerufen des Beobachters. Soll finallyDo() nach dem "onNext()" aufgerufen werden?

Antwort

1

Evan Tatarka wies mich in die richtige Richtung: https://github.com/evant/rxloader/issues/14

Hier ist meine endgültige Lösung:

public class IdlingApiServiceWrapper implements IdlingResource { 

public Observable<MyData> loadData() { 
    counter.incrementAndGet(); 
    Observable<MyData> observable = api.loadData().finallyDo(new Action0() { 
     @Override 
     public void call() { 
      new Handler(Looper.getMainLooper()).post(new Runnable() { 
       @Override 
       public void run() { 
        counter.decrementAndGet(); 
        notifyIdle(); 
       } 
      }); 
     } 
    }); 
    return observable; 
} 

}