2017-01-20 4 views
2

Существует вспомогательный класс DialogIdlingResource, с помощью которого я пытаюсь запустить свои тесты. Испытания проходят, за исключением этого. После нажатия кнопки все останавливается.Тайм-аут в тестах эспрессо, тест не запускается

AcceptanceHelper.clickOnButtonInLayout(R.id.mainSignButton, R.string.common_signin_button_text, R.id.inputLayout) 

Фрагмент кода с двумя вспомогательными методами:

@Test 
fun signInUserWithInvalidEmail() { 
    goToSignIn() 
    AcceptanceHelper.updateValidationTextView(R.string.ui_data_attribute_email, "[email protected]") 
    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) 
} 

вероятность того, что ошибка из-за двух методов regester и UNREGISTER (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 
    } 

ТАКЖЕ попытайтесь решить проблему со следующими solution. И когда я запускаю только один из моих тестов, все работает хорошо. Но если я начну все свои тесты, я поймаю ошибку. Тест Beacause не успел проверить, например, текст в моем диалоговом окне, он открыл диалоговое окно, и это все.

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) 
    AcceptanceHelper.checkTextView(R.id.titleTextView, "Warning") 

И я повторяю, только когда я начинаю все мои тесты, мне нужно положить спать между registerIdlingResources и checktextView примерно такой:

SystemClock.sleep(5000) 

Пожалуйста, помогите решить эту проблему. И извините за мой английский.

ответ

1

Извините, но ваш IdlingResource выглядит как супер сложная функция ожидания.

Этот снимок кода работает для меня - github link. Вам просто нужно предоставить необходимые параметры для конструктора ViewVisibilityIdlingResource. Один из них - int viewId и еще один int visibility. Например, если вы предоставите viewId внутри макета диалога и видимости View.GONE, то этот ресурс блокирует тесты Espresso, пока вид не будет виден или пока не появится диалоговое окно для пользователя.

+0

'java.lang.NullPointerException: Попытка вызвать виртуальный метод«INT android.view.View.getId()»на нулевом объект reference', когда я решить что-то вроде этого' Валу idlingResource = ViewVisibilityIdlingResource (mActivityTestRule.activity.findViewById (R.id.titleTextView), 2000) ' – Inkognito

+0

Просмотр, который вы ищете, принадлежит, вероятно, к различной активности, а затем' mActivityTestRule.activity'. Вы должны отображать последнюю активность на экране. См. Эту ссылку - http://qathread.blogspot.ch/2014/09/discovering-espresso-for-android-how-to.html – denys

0

Не поймал синтаксис для kotlin.

isIdle() всегда выполняется на основной резьбе, которая не должна блокироваться. Поэтому вместо вызова isDialogRunning() в isIdle(), вызовите его в отдельном потоке и обновите состояние idlingResource (если время просмотра совпало или тайм-аут), который затем может быть проверен isIdle().

Надеется, что это помогает :)

Смежные вопросы