2016-10-17 4 views
1

У меня есть тестовый случай Espresso, где я проверяю для с первой строки, отображается ли диалоговое окно или нетКак избежать проблем с асинхронной работой в эспрессо?

onView(withText(R.string.dialog_title)).check(matches(isDisplayed())); 

и их я выполнить щелчок на кнопке, чтобы закрыть диалоговое окно:

onView(withText(R.string.negative_button)).perform(click()); 

Дело в том, что операция клика всегда выполняется перед проверкой, так как обе операции выполняются асинхронно. Как избежать этой проблемы и сохранить порядок выполняемых строк, как это написано в тестовом примере, когда мне не нужно выполнять операции асинхронно?

+0

Я никогда не видел случая, когда операции onView выполняются асинхронно. «Проверьте свои предпосылки, попытайтесь выполнить другое действие или поместите полный код, но espresso не так быстро асинхронно. – satyajit

+0

@satyajit Если бы вы взглянули на реализацию проверки и выполнения методов, вы увидите, что эти методы поставлены в очередь для выполнения асинхронным способом. – karate

+0

https://google.github.io/android-testing-support-library/docs/espresso/idling-resource/index.html «По умолчанию Espresso ждет событий пользовательского интерфейса в текущей очереди сообщений, которые будут обрабатываться, и по умолчанию AsyncTasks для завершения, прежде чем он перейдет к следующей тестовой операции ». Таким образом, тестовые операции выполняются несинхронно. Мой совет: выполните тест в режиме отладки с некоторыми точками останова и проверьте, что происходит с вашим тестом. – jeprubio

ответ

1

Вы можете попробовать настроить класс IdlingResource, который будет ждать определенного условия, пока компоненты View не будут полностью загружены и только затем продолжите проверку или выполнение операций. Переопределить метод isIdleNow, который должен возвращать true только тогда, когда представление уже загружено (или какое-либо другое условие, которое вам нужно выполнить).