2016-07-14 93 views
3

我正在使用Espresso为我的应用程序编写UI测试。我想测试一个事实,即如果在服务器请求正在进行时单击后退按钮,则该应用程序必须保持在原来的位置。AsyncTask运行时的Espresso测试返回按钮

由于espresso的体系结构,如果某些后台操作(如AsyncTask)被触发,测试执行将会等待,这似乎是不可能的。

那么,如何测试以下情形:

  • 点击即触发一个的AsyncTask
  • 测试一个按钮,而正在运行的任务,我按后退按钮,该应用程序在那里停留?

它可能吗?

谢谢

回答

0

可以防止应用程序按下后退按钮时触发finish()。为此,只需覆盖public void onBackPressed()而不致电super.onBackPressed()。就像:

@Override 
public void onBackPressed() { 
    // super.onBackPressed(); 
} 

此外,如果你是显示在执行任务对话框,您可以使用

myDialog.setCancelable(false); 
myDialog.setCanceledOnTouchOutside(false); 

以防止按下按钮。

Regards,

1

这很棘手。使用AsyncTasks任务运行时,您无法使用Espresso。 如果您使用其他方式进行后台工作,Espresso不会等待,并且测试在完成后台工作之前完成。

一个简单的解决方法是在任务运行时不用Espresso“按下”后退按钮。因此,启动任务,调用Activity.onBackPressed()并在任务完成之后用咖啡来检查Activity仍清晰可见:

// Start the async task  
onView(withId(R.id.start_task_button)).perform(click()); 

// Then "press" the back button (in the ui thread of the app under test) 
mActivityTestRule.runOnUiThread(new Runnable() { 
    @Override 
    public void run() { 
     mActivityTestRule.getActivity().onBackPressed(); 
    } 
}); 

// Then check that the Activity is still visible 
// (will be performed when the async task has finished) 
onView(withId(R.id.any_view_on_activity)).check(matches(isDisplayed())); 
+0

您好,我这个自动化测试,以便他们不会被人工跑去,所以我不能点击手动启动该按钮..并且在启动任务后调用Activity.onBackPressed()将导致不同的行为,因为它将在任务完成后执行,并且任务完成时后退按钮的行为不同 – Apperside

+0

我知道测试是自动化的,你不能自己点击它。当你使用我的答案中的代码时,''onBackPressed()'将在AsyncTask运行时执行。但是,如果任务在启动后即刻完成或很快完成,则可能会在任务之后调用onBackPressed()。你试过我的解决方案吗?什么确切不起作用? – thaussma

+1

我没有试过它jet,但是因为我在考虑当你的例子的第一条指令被执行时,测试执行在那里停止,只有当任务完成时才前进。无论如何,我会试一试 – Apperside

相关问题