2

我想测试我的 Presenter

public class MainPresenter extends MvpBasePresenter<MainView> {

    private Repository repository;

    private final CompositeDisposable disposables = new CompositeDisposable();

    public void setRepository(Repository repository) {
        this.repository = repository;
    }

    public void loadFromRepository() {
        getView().showLoading(false);

        disposables.add(repository.getCountries()
                .observeOn(AndroidSchedulers.mainThread())
                .subscribeOn(Schedulers.newThread())
                .subscribeWith(new DisposableObserver<List<Country>>() {
                    @Override
                    public void onNext(List<Country> countries) {
                        if (isViewAttached()) {
                            getView().setData(countries);
                            getView().showContent();
                        }
                    }

                    @Override
                    public void onError(Throwable e) {
                        if (isViewAttached()) {
                            getView().showError(e, false);
                        }
                    }

                    @Override
                    public void onComplete() {

                    }
                }));
    }

    public void loadFromRemoteDatastore() {
        disposables.add(new RemoteDataStore().getCountries()
                .observeOn(AndroidSchedulers.mainThread())
                .subscribeOn(Schedulers.newThread())
                .subscribeWith(new DisposableObserver<List<Country>>() {
                    @Override
                    public void onNext(List<Country> countries) {
                        if (isViewAttached()) {
                            getView().setData(countries);
                            getView().showContent();
                        }
                    }

                    @Override
                    public void onError(Throwable e) {
                        if (isViewAttached()) {
                            getView().showError(e, false);
                        }
                    }

                    @Override
                    public void onComplete() {

                    }
                }));
    }

    @Override
    public void detachView(boolean retainInstance) {
        super.detachView(retainInstance);
        if (!retainInstance) {
            disposables.clear();
        }
    }
}

但是,我有很多疑问,最好的测试方法是什么

1)我写这4个测试场景可以吗

shouldShowContentWhenLoadFromRepository()
shouldShowErrorWhenLoadFromRepository()
shouldShowContentWhenLoadFromRemoteDatastore()
shouldShowErrorWhenLoadFromRemoteDatastore()

2) 我是否应该为 detachView(boolean retainInstance) 编写测试并清除一次性用品

3) 在我的情况下,哪种机制最适合测试 RxJava?

4

1 回答 1

0
  1. 这些测试场景似乎是合理的。

  2. 让测试覆盖对象的公共表面通常是一种好习惯,但detachView()考虑disposablesMainPresenter.

  3. 您可以为调用Repository时返回的 Observable创建一个存根。GetCountries()您可以分别使用Observable.return()&创建成功和不成功的 Observable Observable.error()

如果您需要对异步的特定时间进行更多控制,那么TestScheduler它会变得非常简单(参见此处)

于 2018-02-10T05:53:05.380 回答