2013-03-07 13 views
5

Ho premuto un pulsante che attiva un'animazione e, al completamento dell'animazione, modifica il testo di un'etichetta. Mi piacerebbe scrivere un test per verificare che quando si preme il pulsante, alla fine il testo dell'etichetta cambia correttamente.TDD iOS: test di un metodo che utilizza UIVIew animateWithDuration: animazioni: completamento:

L'implementazione del pulsante premere IBAction utilizzerà [UIView animateWithDuration:animations:completion:]. Ovviamente non voglio che il mio test di unità attenda effettivamente 0,5 secondi per il completamento dell'animazione.

Ho pensato di prendere in giro UIView, ma mi sembra strano iniettare UIView come dipendenza da un controller di visualizzazione. Inoltre, il framework di derisione che sto usando (OCMockito) non sembra funzionare bene con i metodi di classe mocking.

Ho anche pensato di metodo swizzling o la scrittura di una categoria di prova per UIView, e l'utilizzo di un'implementazione che non fa altro che invocare il blocco animations: seguito dal blocco completion:. Mi sembra un po 'rotto; Sono preoccupato che l'override dell'implementazione di un metodo di classe su UIView possa avere conseguenze indesiderate lungo la strada.

Essendo nuovo a TDD, non sono sicuro di quale sia la migliore pratica qui. È uno di quei pezzi di codice che dovrebbero essere considerati "UI che girano" e quindi è accettabile che non vengano testati? O c'è un modo più ovvio per testare questo che mi manca?

risposta

4

Vorrei semplicemente creare una proprietà che determina la lunghezza dell'animazione e impostarla su 0,5 secondi.

In questo modo, il test può impostare la durata dell'animazione su 0 e osservare che il testo dell'etichetta viene aggiornato senza attendere.

Questo è dependency injection ed è estremamente utile se si inizia con TDD. Ha anche il piacevole effetto collaterale di rendere il tuo codice più modulare e meno accoppiato.

+0

curioso di sapere: esiste una garanzia che l'animazione venga eseguita prima del completamento del test? questo blocco dell'animazione potrebbe in qualche modo essere ritardato per una ragione o per l'altra? – Ying

+1

Questo è davvero un buon punto. L'animazione verrà accodata sul runloop, il che normalmente significherebbe che l'animazione si verificherà dopo il ritorno del test. Tuttavia, l'animazione con una durata di <= 0 è un caso speciale che causa immediatamente la modifica. –

+1

@ La durata dell'animazione di impostazione di Benoit su 0 o meno non chiama immediatamente il blocco di completamento. Anche con durata 0, potrebbe chiamare il blocco nel ciclo di esecuzione successivo. Quello che ho fatto è chiamare le asserzioni all'interno del blocco di ritardo GCD. Ho fatto una risposta separata per spiegare la mia soluzione. –

Problemi correlati