2016-07-14 11 views
3

Я пишу тесты пользовательского интерфейса для своего приложения, используя Espresso. Я хотел бы проверить, что, если я нажму кнопку «Назад», когда выполняется запрос на сервер, приложение должно оставаться там, где оно есть.Кнопка проверки тестовой кнопки Espresso во время работы AsyncTask

Возможно, это невозможно из-за архитектуры эспрессо, которая заставляет выполнение тестов ждать, если была запущена какая-либо фоновая операция (например, AsyncTask).

Итак, как я могу проверить следующий сценарий:

  • нажать на кнопку, которая запускает в
  • тест AsyncTask, что в то время как задача выполняется, и я нажимаю кнопку назад, приложение остается там?

Возможно ли это?

спасибо

ответ

0

Вы можете предотвратить приложение от запуска finish() при нажатии кнопки назад. Для этого просто переопределите public void onBackPressed() без звонка super.onBackPressed(). Так же, как:

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

Кроме того, если вы показываете диалог во время выполнения задачи, вы можете использовать

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

предотвратить кнопку от толкаемых.

С уважением,

1

Это сложно. С AsyncTasks вы не можете использовать 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

Здравствуйте, я автоматизируя этот тест, так что они не будут выбежали вручную, и поэтому я не могу нажать вручную на кнопке. И Calling Activity.onBackPressed() после запуска задачи приведет к другому поведению, потому что оно будет выполнено после задачи, а когда задача будет закончена, поведение кнопки обратной связи отличается от – Apperside

+0

. Я знаю, что тесты автоматизированы и вы не можете щелкнуть по нему самостоятельно. Когда вы используете код из моего ответа, 'onBackPressed()' будет выполняться при запуске 'AsyncTask'. Но если задача завершается мгновенно или вскоре после ее запуска, возможно, что после задачи вызывается 'onBackPressed()'. Вы попробовали мое решение? Что точно не работает? – thaussma

+1

Я не пробовал это, но потому, что думал, что когда первая инструкция вашего примера будет выполнена, выполнение тестов прекратится и продолжит работу только тогда, когда задача будет завершена. В любом случае, я дам ему попробовать – Apperside