Страницы

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

суббота, 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 чтобы не прописывать всегда одно и то же, если тестов скажем несколько.
И опять же для дополнительного чтения : пример использования

Комментариев нет:

Отправить комментарий