10

我正在使用 Espresso 2.2 编写仪器测试。

我要测试的流程:

  1. 测试单击的单选按钮
  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,用变量链接视图。我知道 IdleResource 不会让测试通过,直到 isIdleNow() 返回值 true。所以如果 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;

永远被检查(但我在屏幕上看到我的视图)总是返回错误。

我究竟做错了什么?

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 回答