2010-02-20 10 views
6

Sono un grande sostenitore dei test, ma non un ottimo professionista. Ho fatto molto bene a ottenere copertura sui miei oggetti modello e programmarli in uno stile TDD. Mi sto davvero divertendo così tanto che mi piacerebbe estendere questo livello al mio controller, in particolare alle sottoclassi UIViewController.Come testare UIViewControllers al momento della compilazione?

Sfortunatamente, molte classi UIKit non funzionano in test indipendenti. Tuttavia, non sono soddisfatto della limitazione di eseguire solo i miei test dipendenti sul dispositivo. Per me è molto importante eseguire tutti i test unitari prima di ogni build, e mi sembra sia il suo possibile e utile test del codice dell'unità (al contrario di altri tipi di test).

La mia domanda è semplicemente questa: come posso testare UIViewController in modo tale che i test vengano eseguiti prima di ogni generazione? Sono a conoscenza di un paio di soluzioni diverse a questo problema, ma non conosco molto sui vari vantaggi di ciascuno.

risposta

2

Quindi non ero contento di questa situazione così com'è stata, e sia le risposte di Daniel che quelle di Ed mi hanno spronato a migliorare ulteriormente le cose. Ho deciso di prendere le cose nelle mie mani.

Quello che ho finito per scrivere è stata una piccola applicazione Cocoa Touch che in -applicationDidFinishLaunching analizza la gerarchia delle classi per ogni sottoclasse SenTestCase e le esegue. A differenza del materiale di test unitario di GoogleToolboxForMac, ho provato a utilizzare il maggior numero possibile di macchine SenTesting e, di conseguenza, non è diventato così tanto codice. Non ho fatto troppi test oltre a verificare che UILabel assegni senza arrestare l'impianto di test (in realtà, se ci provi, Otest fa crash), ma dovrebbe funzionare.

Ho messo la fonte online su entrambi Bitbucket e Github.

2

In generale se si è bloccati con un problema ambientale in cui i test incondizionati sembrano essere resi impossibili, è possibile aggirare il problema se i benefici sono abbastanza grandi da giustificare il salto attraverso alcuni cerchi.

La situazione qui è un caso speciale di dipendenze esterne indesiderate, che in genere risolvo nei miei test di unità da #ifdefing di minuscoli bit di codice dipendente, o implementando le classi di stub per riempire i ruoli di dipendenza attesi abbastanza che il mio codice può essere testato

Quindi, in questo caso specifico, è possibile creare un nuovo file sorgente, collegato solo nel bundle di test, denominato "UIKitStubClasses.m" ... al suo interno è possibile implementare le nudità necessarie per simulare classi dipendenti da UIKit come UIViewController, quindi che i tuoi test collegano e esercitano a fondo la loro logica.

La cosa importante da ricordare è che di solito non è tutto molto lavoro. I test ti consentiranno di sapere cosa è necessario implementare nello stub, ad esempio emettendo eccezioni sui metodi non implementati. Basta aggiungere ciò di cui hai bisogno per attenuare gli errori e testare il codice, e quindi la classe stub è sufficiente come per il test come sarebbe una qualsiasi delle classi del framework di sistema legittime.

+0

Questo probabilmente è ciò che farò, probabilmente. Conosco 'UILabel' e alcune altre classi non riescono ad allocare durante l'esecuzione in un bundle di unit test, ma spero di averne abbastanza da funzionare. –

2

si fa a non utilizzare i suggerimenti/metodi nel blog di Chris Hanson qui: http://chanson.livejournal.com/120263.html

Sembra che si sarebbe probabilmente necessario eseguire la vostra applicazione, come il test harness, ma sembra fattibile. Solo perché stai eseguendo l''app' non significa che debba necessariamente fare la cosa normale della tua applicazione. In alternativa, è possibile creare un altro target di applicazione che sia solo una semplice applicazione fittizia che caricherà i bundle di test e li eseguirà.

Sono d'accordo che potrebbe non essere perfetto, ma sembra che potrebbe funzionare, e sembra che potrebbe essere automatizzato.

+0

Non l'ho provato, ma per quanto ne so questo tipo di test non è supportato per obiettivi iPhone tranne sul dispositivo. Lo darò un colpo però. –

1

Mentre gli strumenti di apple sono migliorati nel tempo, lasciano ancora molto a desiderare. GHUnit è molto meglio, ha un vero runner di test e rende semplice impostare punti di interruzione, ecc. Puoi anche sfruttare tutti i tuoi SenTest esistenti.

Get it on github.

È possibile creare un'istanza tutto il codice UIKit senza preoccupazioni. Lo uso per testare UIViewControllers, affermare punti vendita e fare test di comportamento.

Problemi correlati