2014-12-10 17 views
7

Ho un'attività che utilizza RxLoader per recuperare i dati dal server al momento della creazione dell'attività e popola una visualizzazione elenco. Ho anche il codice di prova che tenta di fare clic sulla prima riga della visualizzazione elenco dopo che è stata popolata.Test Espresso con RxLoader

Poiché sto utilizzando RxLoader, devo scrivere un IdlingResource personalizzato per Espresso. Tuttavia, il problema è che il test finisce (fallisce) prima che il mio listview venga popolato.

Ecco il mio codice di attività:

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

Qui è la mia realizzazione IdlingResource:

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; 

} }

Il problema è che: Quando eseguo il codice di prova, il metodo "counter.decrementAndGet()" viene sempre chiamato prima del metodo "onNext()" nella mia attività. Il mio test fallisce perché prevede di essere popolato da listview.

A quanto pare sto facendo qualcosa di sbagliato. Ma cosa sto sbagliando?

UPDATE:

Ecco un frammento di codice più pulito per illustrare il problema:

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

Nel codice di cui sopra, lo snippet di codice finallyDo() viene chiamato prima della "onNext()" chiamata dell'osservatore. FinallyDo() dovrebbe essere chiamato dopo "onNext()"?

risposta

1

Evan Tatarka mi ha segnalato nella giusta direzione: https://github.com/evant/rxloader/issues/14

Qui è la mia soluzione finale:

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

}

Problemi correlati