Страницы

Поиск по вопросам

Показаны сообщения с ярлыком espresso. Показать все сообщения
Показаны сообщения с ярлыком espresso. Показать все сообщения

суббота, 15 июня 2019 г.

Тест не проходит

Есть вспомогательный класс DialogIdlingResource, благодаря которому пытаюсь запустить свои тесты, все тесты проходят за исключением этого запускается активити и доходит до шага нажатия на кнопку:
AcceptanceHelper.clickOnButtonInLayout(R.id.mainSignButton, R.string.common_signin_button_text, R.id.inputLayout)
, после чего всё замирает, хотя тест по идее должен отрабатывать(а именно проверять текст в методе isDialogRunning):
@Test fun signInUserWithInvalidEmail() { goToSignIn() AcceptanceHelper.updateValidationTextView(R.string.ui_data_attribute_email, "kokojambo@mail.ru") AcceptanceHelper.updateValidationTextView(R.string.ui_data_attribute_password, VALID_PASSWORD) AcceptanceHelper.clickOnButtonInLayout(R.id.mainSignButton, R.string.common_signin_button_text, R.id.inputLayout) val idlingResource = DialogIdlingResource() registerDialogIdlingResource() unregisterDialogIdlingResource() } private fun registerDialogIdlingResource() { val instrumentation = InstrumentationRegistry.getInstrumentation() idlingResource = DialogIdlingResource() Espresso.registerIdlingResources(idlingResource) }
private fun unregisterDialogIdlingResource() { Espresso.unregisterIdlingResources(idlingResource) }
Предпологаю что ошибка из за двух методов регистрации и UNрегистрации idlingResource
Но по сути всё должно работать, но может быть где то, что скорей всего сделал ошибку, код вспомогательного класса:
class DialogIdlingResource(private val waitTimeSeconds: Int = 5) : IdlingResource { private var resourceCallback: IdlingResource.ResourceCallback? = null private var startTime = -1L
override fun getName(): String { return DialogIdlingResource::class.java.name }
override fun isIdleNow(): Boolean { if (startTime < 0) { startTime = System.currentTimeMillis() } val timeOut = System.currentTimeMillis() - waitTimeSeconds * 1000 > startTime if (timeOut) throw TimeoutException("error") val idle = !isDialogRunning if (idle && resourceCallback != null) { resourceCallback!!.onTransitionToIdle() } return idle }
override fun registerIdleTransitionCallback(resourceCallback: IdlingResource.ResourceCallback) { this.resourceCallback = resourceCallback }
private val isDialogRunning: Boolean get() { try { onView(Matchers.allOf(withId(R.id.titleTextView), ViewMatchers.withText("Warning"))) .check(ViewAssertions.matches(isDisplayed())) } catch (e: NoMatchingViewException) { e.printStackTrace() System.out.println("some text") } return true }
}


Ответ

Сразу скажу у Вас слишком замудренная реализация того, что можно сделать гораздо проще, ну как мне кажется. На данный момент я вижу два варианта:
Первый вариант подробно описан по ссылке в данной репозитории github. Принцип которого заключается в проставлении необходимых Вам параметров и место где они распологаются. Также советую обратить внимание на флаги параметра visibility.
Ну а второй вариант будет выглядеть примерно следующим образом. Создаём класс, который унаследуем от IdlingResource, имплементируем его методы и заполняем:
class ElapsedTimeIdlingResource(private val activity: SignActivity?) : IdlingResource { private var callback: IdlingResource.ResourceCallback? = null
override fun getName(): String { return "SignInScreenTest" }
override fun isIdleNow(): Boolean { val idle = isIdle if (idle) callback!!.onTransitionToIdle() return idle }
val isIdle: Boolean get() = activity != null && callback != null
override fun registerIdleTransitionCallback(resourceCallback: IdlingResource.ResourceCallback) { this.callback = resourceCallback } }
После этого в Ваших тестах после нажатия на кнопку реализуем вызов следующим образом:
val activity = mActivityTestRule.getActivity() val idlingResource = ElapsedTimeIdlingResource(activity) Espresso.registerIdlingResources(idlingResource)
Где мы "получаем" компоненты нашей аквтивности, иначе открытые элементы/переходы возможно приведут к null вашей активити. Как я понял, Вы пытыетесь открыть в Вашей activity диалог. После чего регистируем наши idlingResource из класса. После того как открылся Ваш диалог например, Вы можете проверить элементы содержащиеся в нём, или просто вернуться назад. После всех операций, в этом же тесте нужно вызвать:
Espresso.unregisterIdlingResources(idlingResource)
Также Вы наверное видели уже что возможно поместить методы registerIdlingResource/unregisterIdlingResources в аннотации @Before/@After чтобы не прописывать всегда одно и то же, если тестов скажем несколько.
И опять же для дополнительного чтения : пример использования