2017-01-20 4 views
2

Il existe une classe auxiliaire DialogIdlingResource, dans laquelle j'essaie d'exécuter mes tests. Les tests ont lieu, sauf celui-ci. Après avoir appuyé sur le bouton, tout s'arrête.Délai d'expiration dans les tests d'expresso, le test ne fonctionne pas

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

Extrait de code avec deux méthodes d'assistance:

@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) 
} 

probable que l'erreur due aux deux méthodes de regester désinscriptions (idlingResource)

Mais en fait, il devrait fonctionner, mais peut quelque part que probablement fait une erreur, un code de classe auxiliaire:

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 
    } 

AUSSI essayer de résoudre le problème avec solution suivant. Et quand je cours juste un de mes tests, tout fonctionne bien. Mais si je commence tous mes tests, j'attrape l'erreur. Beacause test n'a pas le temps de vérifier par exemple le texte dans mon dialogue, il a ouvert le dialogue et c'est tout.

classe 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 
} 

}

dans mon test

val activity = mActivityTestRule.getActivity() 
    val idlingResource = ElapsedTimeIdlingResource(activity) 
    Espresso.registerIdlingResources(idlingResource) 
    AcceptanceHelper.checkTextView(R.id.titleTextView, "Warning") 

Et je le répète, juste au moment où je commence tous mes tests, je dois mettre le sommeil entre registerIdlingResources et checktextView quelque chose comme ceci:

SystemClock.sleep(5000) 

S'il vous plaît aider à résoudre ce problème. Et désolé pour mon anglais.

Répondre

1

Désolé, mais votre IdlingResource ressemble à une fonctionnalité d'attente super compliquée.

Cet extrait de code fonctionne pour moi - github link. Vous devez juste fournir les paramètres nécessaires au constructeur ViewVisibilityIdlingResource. L'un d'eux est int viewId et un autre int visibility. Par exemple, si vous fournissez viewId à l'intérieur de la disposition de la boîte de dialogue et la visibilité View.GONE, cette ressource bloquera les tests Espresso jusqu'à ce que la vue soit visible ou jusqu'à ce que la boîte de dialogue s'affiche pour l'utilisateur.

+0

'java.lang.NullPointerException: Tentative d'invoquer la méthode virtuelle 'int android.view.View.getId()' sur un reference' objet nul quand je résous quelque chose comme ceci' val idlingResource = ViewVisibilityIdlingResource (mActivityTestRule.activity.findViewById (R.id.titleTextView), 2000) ' – Inkognito

+0

La vue que vous recherchez appartient probablement à une autre activité que' mActivityTestRule.activity'. Vous devriez obtenir la dernière activité affichée sur l'écran. Voir ce lien - http://qathread.blogspot.ch/2014/09/discovering-espresso-for-android-how-to.html – denys

0

N'a pas attrapé la syntaxe pour Kotlin cependant. IsIdle() est toujours exécuté sur le thread principal qui doit être non bloquant. Ainsi, plutôt que d'appeler isDialogRunning() dans isIdle(), l'appelle dans un thread distinct et met à jour l'état de idlingResource (si la vue est assortie ou expirée) qui peut ensuite être vérifiée par isIdle().

Hope it helps :)