在ViewAnimator中的按钮上执行(单击())后,Espresso测试卡住/不活动

时间:2016-07-18 20:45:10

标签: android android-fragments testing android-espresso viewanimator

问题: 我在运行Espresso测试时遇到问题,在登录按钮上调用perform(click())方法后,测试继续运行但是直到45秒后才会继续运行并且测试自动失败。同时,登录正常进行。

上下文:我有一个带有两个片段的活动,右边的片段处理用户名和密码EditTexts以及登录按钮。这个片段使用ViewAnimator和两个LinearLayouts作为子视图构建,第一个LinearLayout具有前面提到的元素,第二个具有其他东西。

这是在点击登录按钮时在UI上发生的事情:

    @Override
public void setUILoggingIn() {
    spinnerLogin.setVisibility(View.VISIBLE);
    loginButton.setEnabled(false);
    loginButton.setText(R.string.logging_in);
    usernameText.setEnabled(false);
    passwordText.setEnabled(false);
}

在使用服务器进行身份验证后,这就是我处理UI的方式:

@Override
public void setUIAuthorized() {
    new Handler(Looper.getMainLooper()).post(new Runnable() {
        @Override
        public void run() {
            viewAnimator.showNext();
            // elements on the first child of the ViewAnimator
            loginButton.setEnabled(true);
            spinnerLogin.setVisibility(View.GONE);

            // elements on the second child of the ViewAnimator
            sendMessageButton.setEnabled(true); 
            chatInputText.setEnabled(true);
        }
    });
}

Espresso测试

ViewInteraction loginButton2 = onView(withId(R.id.login_button));
        loginButton2.perform(click());        // Test gets stuck here.
        loginButton2.check(doesNotExist());   // Never reached.

有没有人知道在这种情况下成功测试?只需检测ViewAnimator何时更改,但测试卡在点击上就足够了。

另外:这不是测试的开始,在之前显示的代码之前,我运行此测试并且它像梦一样:

ViewInteraction loginButton = onView(withId(R.id.login_button));

    /** Failed login **/

    loginButton.perform(click());

    ViewInteraction snackBarTextView = onView(
            allOf(withId(R.id.snackbar_text), withText("Login error"), isDisplayed()));
    snackBarTextView.check(matches(withText("Login error")));

感谢大家的帮助和建议

2 个答案:

答案 0 :(得分:8)

我有类似的问题,在我的情况下,它是一个加载在未显示的片段上的进度条。这个进度条没有被错误地解雇,并且阻止了测试。我得到了相同的结果,如你描述的那样,在45秒卡住后测试失败了。 总而言之,检查UI线程上没有动画作为进度条或任何其他动画运行。

答案 1 :(得分:0)

我在使用ListView时遇到了同样的问题。

有趣的是,我注意到如果手动尝试滚动屏幕​​,测试将恢复。添加此行解决了问题并重新开始测试。

onView(withId(R.id.myListView)).perform(swipeUp());