2010-03-08 17 views
31

Qualcuno sa come testare l'aspetto di un messaggio Toast su un'attività?Come verificare l'aspetto di un messaggio Toast

Sto utilizzando un codice simile a quello pubblicato dall'OP this question per verificare il flusso del mio programma da un'attività all'altra. Mi piacerebbe anche essere in grado di testare i messaggi di brindisi su attività particolari.

risposta

22

Qualcuno sa come test per la aspetto di un messaggio Toast su un di attività?

Non è possibile - mi dispiace. Con ciò, voglio dire, non c'è modo di chiedere ad Android "hey, è un Toast che mostra? E che aspetto ha?".

+1

Grazie per quella CommonsWare. Probabilmente farò qualcosa di simile a popolare una variabile con il messaggio di toast quando creo il brindisi. Sarà invisibile all'utente ma mi darà qualcosa da esaminare. – Adrian

+9

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

12

Hm, attualmente è una possibilità di testare l'aspetto di un brindisi. Basta creare una sottoclasse di Toast (ad esempio MyOwnToast) e utilizzarla nel programma invece di Toast. In questa sottoclasse è possibile sovrascrivere il metodo show() per avvisare che il Toast è stato mostrato.

Inoltre è possibile memorizzare il Toast all'interno del metodo show() in una specie di un singleton ToastDatabase da cui è possibile accedere a Toast e la sua vista anche dopo che è stata mostrata e distrutta (non l'hanno testata con Toasts, ma Lo faccio spesso con gli intenti risultato delle attività per tenerli disponibili per ulteriori test dopo che sono stati distrutti, quindi non dovrebbe essere un problema implementarlo con Toasts).

Attenzione: forse è necessario clonare l'oggetto Toast o la vista corrispondente per ToastDatabase perché probabilmente sarà nullo dopo che il Toast è stato distrutto. Spero che questo ti aiuti!

+0

Grazie per quel lordfinga. Sembra una soluzione più ordinata di quella che ho descritto. – Adrian

+2

Buona idea, ma attenzione quando si aggiunge codice al codice di produzione solo per scopi di test. Vorrei raccomandare un metodo per disabilitare questo "codice di test" nel codice di produzione finale, possibilmente controllando il flag di debugging nel manifest http://stackoverflow.com/a/4277868/383414 –

6

verifico, le seguenti opere:

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

Se stiamo davvero chiedendo "come può un ActivityUnitTestCase asserisce che il codice di produzione ha attivato un Toast con tali e così i contenuti ", quindi tale test non dovrebbe dipendere dal codice di produzione extra. Se, ad esempio, hai rifattorizzato quel codice, non vorrai che il test si interrompa, quando nella produzione viene ancora visualizzato un vero Toast. – Phlip

2

si può scegliere Robolectric prova framework.For controllo toast, è possibile utilizzarlo come di seguito:

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

Io lo utilizzo come:

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

Questo è un modo alternativo che serve parzialmente allo scopo.

+0

Che cos'è wait_for_text()? Non esiste alcun metodo nell'API Android con questo nome. –

+0

Se si sta utilizzando una lingua diversa da Java, è necessario specificare. –

+0

"wait_for_text" è un metodo in Calabash api in ruby ​​ –

8

Ora è possibile testare i messaggi di toast utilizzando robolectric. L'esempio che segue è come la nostra squadra sta facendo questo per la società:

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

Spero che questo aiuti

+0

Mi sembra che tra il momento in cui si chiama 'performClick()' e si asserisca che è possibile che il toast non sia ancora apparso e apparirà dopo l'asserzione finiture. Come rendiamo conto di questa possibilità? –

+0

Robolectric ha un shadowHandler.idleMainLooper che è stato deprecato. Esiste tuttavia un ShadowLooper.idleMainLooper() che ha implementazioni multiple. Uno di loro prende il "tempo" come parametro per attivare le esecuzioni .. – user2511882

2

Si potrebbe verificare che il brindisi è stato dimostrato da un messaggio

ShadowToast.showedToast("expected message") 

Se si utilizza un personalizzato toast

ShadowToast.showedToast("expected message", R.id.yourToastId) 
Problemi correlati