10

Espresso 2.2 を使用してインストルメンテーション テストを作成しています。

テストしたいフロー:

  1. テストでクリックされたradioButton
  2. onClick は API へのリクエストを起動します
  3. 毎回異なる時間の後、私は応答を受け取ります
  4. 肯定応答は、アクティビティで呼び出されるインターフェイス メソッドをトリガーします
  5. onRequestSuccess vSetupAmount という名前の画面に追加のパネルを表示しています

radioButton をクリックした後に IdleResource を登録したいので、vSetupAmount が表示されるまで待ちます。しかし、私はそれを機能させることはできません。私が間違っていることを教えてください。

私はそのような IdleResource を書きました:

public class AmountViewIdlingResource implements IdlingResource {

    private CountriesAndRatesActivity activity;
    private ResourceCallback callback;

    private SetupAmountView amountView;

    public AmountViewIdlingResource(CountriesAndRatesActivity activity) {
        this.activity = activity;

        amountView = (SetupAmountView) this.activity.findViewById(R.id.vSetupAmount);
    }

    @Override public String getName() {
        return "Amount View idling resource";
    }

    @Override public boolean isIdleNow() {
        callback.onTransitionToIdle();
        return amountView.getVisibility() == View.VISIBLE;
    }

    @Override public void registerIdleTransitionCallback(ResourceCallback resourceCallback) {
        this.callback = resourceCallback;
    }

}

そのため、アクティビティを IdleResource に渡し、ビューを変数にリンクしています。isIdleNow() が値 true を返すまで、IdleResource はテストを通過させないことを理解しています。したがって、view が View.GONE の場合、それ以上は進みません。

テストでどのように見えるか:

    // click of radioButton picked from radioGroup
    onView(withId(rgDeliveries.getChildAt(id).getId())).perform(scrollTo(), click());

    // wait for view to become visible
    Espresso.registerIdlingResources(new AmountViewIdlingResource(getActivity()));

    // go to button on view
    onView(withId(R.id.btnGetStarted)).perform(scrollTo());

    // unregister idle resource
    for (  IdlingResource resource : getIdlingResources()) {
        Espresso.unregisterIdlingResources(resource);
    }

だから私はradioButtonをクリックします。IdleResource は正常に登録されましたが、何も起こりません。デバイスの API 応答が来ます。vSetupAmountが表示されていますが、

amountView.getVisibility() == View.VISIBLE;

これは永遠にチェックされています(ただし、画面に自分のビューが表示されます)常にfalseを返します。

私は何を間違っていますか?

4

1 に答える 1

16

手遅れかもしれませんが、私の答えは誰かを助けるかもしれません。

  1. をインスタンス化して登録するときはAmountViewIdlingResource、それへの参照を保持し、その参照のみを登録解除し、すべての を登録解除しないでくださいIdlingResources
  2. メソッドの実装は、アイドリング リソースが毎回ではなく実際にアイドル状態である場合にisIdleNow()のみ、コールバックのメソッドを呼び出す必要があります。onTransitionToIdle()

ボタンが画面に表示されるのを待つために、同様のことを行う必要がありました。ボタンは、HTTP 呼び出しが終了した後にのみ表示されます。ビューの可視性アイドリング リソースの私の実装は次のとおりです。

public class ViewVisibilityIdlingResource implements IdlingResource {

    private final View mView;
    private final int mExpectedVisibility;

    private boolean mIdle;
    private ResourceCallback mResourceCallback;

    public ViewVisibilityIdlingResource(final View view, final int expectedVisibility) {
        this.mView = view;
        this.mExpectedVisibility = expectedVisibility;
        this.mIdle = false;
        this.mResourceCallback = null;
    }

    @Override
    public final String getName() {
        return ViewVisibilityIdlingResource.class.getSimpleName();
    }

    @Override
    public final boolean isIdleNow() {
        mIdle = mIdle || mView.getVisibility() == mExpectedVisibility;

        if (mIdle) {
            if (mResourceCallback != null) {
                mResourceCallback.onTransitionToIdle();
            }
        }

        return mIdle;
    }

    @Override
    public void registerIdleTransitionCallback(ResourceCallback resourceCallback) {
        mResourceCallback = resourceCallback;
    }

}

お役に立てれば

于 2016-01-29T08:43:26.667 に答える