2010-03-08 15 views
31

¿Alguien sabría cómo probar la apariencia de un mensaje de Toast en una actividad?Cómo probar la apariencia de un mensaje de Toast

Estoy usando un código similar al que OP publicó en this question para probar el flujo de mi programa de una actividad a la siguiente. También me gustaría poder probar mensajes de brindis en actividades particulares.

Respuesta

22

¿Alguien sabe cómo poner a prueba para la aparición de un mensaje de aviso emergente en una Actividad?

No puede, lo siento. Por lo cual, me refiero a que no hay forma de preguntarle a Android "hey, ¿se muestra un Toast? Y ¿qué aspecto tiene?".

+1

Gracias por ese CommonsWare. Probablemente haga algo así como llenar una variable con el mensaje de pan tostado al crear el pan tostado. Será invisible para el usuario pero me dará algo para examinar. – Adrian

+9

Voilà: myToast.getView(). IsShown(). –

12

Hm, de hecho hay es una posibilidad de probar la apariencia de un brindis. Simplemente crea una subclase de Toast (por ejemplo, MyOwnToast) y utiliza esta en tu programa en lugar de Toast. En esta subclase puede sobrescribir el método show() para notificarle que se está mostrando el Toast.

Además, puede almacenar el Toast dentro del método show() en una especie de singlete ToastDatabase desde donde puede acceder al Toast y su vista también después de haber sido mostrado y destruido (no lo ha probado con Toasts, pero A menudo hago eso con los resultados de las actividades para mantenerlos disponibles para más pruebas después de que hayan sido destruidos, así que no debería ser un problema implementar esto con Toasts).

Cuidado: tal vez tenga que clonar el objeto Toast o su vista correspondiente para ToastDatabase porque probablemente será nulo después de que se haya destruido el Toast. ¡Espero que esto ayude!

+0

Gracias por ese lordfinga. Suena como una solución más ordenada de lo que describí. – Adrian

+2

Buena idea, pero tenga cuidado al agregar código al código de producción solo para fines de prueba. Recomendaría un método para desactivar este "código de prueba" en el código de producción final, posiblemente comprobando el indicador de depuración en el manifiesto http://stackoverflow.com/a/4277868/383414 –

6

puedo comprobar, las siguientes obras:

if(someToast == null) 
    someToast = Toast.makeText(this, "sdfdsf", Toast.LENGTH_LONG); 
boolean isShown = someToast.getView().isShown(); 
+1

Si realmente estamos preguntando "¿cómo puedo hacerlo?" una ActivityUnitTestCase afirma que el código de producción ha disparado un Toast con tal y tal contenido ", entonces tal prueba no debería depender de un código de producción adicional. Si, por ejemplo, refactorizaste ese código, no querrás que la prueba se rompa, mientras que en la producción todavía se muestre una Tostada real. – Phlip

2

puede elegir Robolectric prueba framework.For comprobar tostadas, que se puede utilizar de la siguiente manera:

assertTrue(ShadowToast.showedCustomToast("message", R.id.message)); //R.id.message: textView ID 
-3

lo estoy usando como:

wait_for_text("Notification message to be verified", timeout: 30) 

Esta es una manera alternativa que sirve parcialmente para este propósito.

+0

¿Qué es wait_for_text()? No hay ningún método en la API de Android con este nombre. –

+0

Si está utilizando un idioma que no sea Java, debe especificarlo. –

+0

"wait_for_text" es un método en Calabash api en ruby ​​ –

8

De hecho, ahora podemos probar los mensajes de pan tostado usando robolectric. El siguiente ejemplo es cómo nuestro equipo está haciendo esto por ahora:

@Test 
    public void ccButtonDisplaysToast() throws NullPointerException { 
     Button ccRedButton = (Button) findViewById(R.id.cc_red); 
     cc_red.performClick(); --> this calls the actual onClickListener implementation which has the toast. 
     ShadowLooper.idleMainLooper(YOUR_TIME_HERE); --> This may help you. 
     assertThat(ShadowToast.getTextOfLatestToast().toString(), equalTo("TEST_YOUR_TEXT_HERE")); 
    } 

Esperanza esto ayuda

+0

Me parece que entre el momento en que llamas a 'performClick()' y haces la afirmación de que es posible que la tostada no haya aparecido aún y aparecerá después de la afirmación termina ¿Cómo explicamos esta posibilidad? –

+0

Robolectric tiene un shadowHandler.idleMainLooper que ha quedado obsoleto. Sin embargo, hay un ShadowLooper.idleMainLooper() que tiene múltiples implementaciones. Uno de ellos toma el "tiempo" como parámetros para activar las ejecuciones. – user2511882

2

Se puede comprobar que la tostada se demostró a través de mensajes

ShadowToast.showedToast("expected message") 

Si está utilizando una costumbre tostada

ShadowToast.showedToast("expected message", R.id.yourToastId) 
Cuestiones relacionadas