我有一个使用 RxLoader 在 Activity 创建时从服务器获取数据并填充 ListView 的 Activity 。我还有测试代码,它会在 ListView 填充后尝试点击它的第一行。
因为我正在使用 RxLoader,所以我必须为 Espresso 编写一个自定义的 IdlingResource。但是,问题是测试在我的 ListView 被填充之前完成(失败)。
这是我的 Activity 代码:
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()”总是在我的 Activity 中的“onNext()”方法之前被调用。我的测试失败了,因为它希望填充 ListView 。
显然我做错了什么。但是我做错了什么?
更新:
这是一个更清晰的代码 fragment 来说明问题:
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() 中的代码 fragment 在观察者的“onNext()”调用之前被调用。 finallyDo() 应该在“onNext()”之后调用吗?
最佳答案
Evan Tatarka 为我指出了正确的方向: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;
}
关于android - 使用 RxLoader 进行 Espresso 测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27410786/