2014-12-10 4 views
7

У меня есть активность, которая использует RxLoader для извлечения данных с сервера при создании активности и заполняет представление списка. У меня также есть тестовый код, который пытается щелкнуть первую строку списка после того, как он заселен.Тест эспрессо с RxLoader

Поскольку я использую RxLoader, я должен написать индивидуальный IdlingResource для Espresso. Однако проблема заключается в том, что тест заканчивается (сбой) до того, как мой список будет заполнен.

Вот мой код активность:

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

Вот моя реализация 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; 

} }

Проблема заключается в том, что: При запуске тестового кода, метод «counter.decrementAndGet()» всегда вызывается перед методом «onNext()» в моей деятельности. Мой тест терпит неудачу, потому что он ожидает, что список будет заполнен.

Видимо, я делаю что-то неправильно. Но что я делаю неправильно?

UPDATE:

Вот уборщик фрагмент кода, чтобы проиллюстрировать эту проблему:

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

В коде выше фрагмент кода в finallyDo() вызывается перед "onNext()" звонок наблюдателя. Должен ли finallyDo() вызываться после «onNext()»?

ответ

1

Эван Татарка указала мне на правильное направление: https://github.com/evant/rxloader/issues/14

Вот мое окончательное решение:

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

}

Смежные вопросы