Sto scrivendo i miei primi test dell'unità iOS (Xcode 5, iOS 6) e ho riscontrato che i risultati dei test delle unità variano a seconda di ciò che ho fatto ultimamente nel Simulatore. Per esempio. Clicco su un utente nel mio elenco di contatti nel simulatore, e ora i miei dati "contatti recenti" in UserDefaults hanno un oggetto in più rispetto a prima, anche quando eseguo test unitari.Non dovrebbe NSUserDefault essere una lavagna pulita per i test unitari?
Per il test delle unità, non è pulito avere dati di default dell'utente casuali (sono abituato ai test RoR con il proprio db pulito). Inoltre, potrei voler testare stati specifici come avere dati "contatti recenti" vuoti.
Dall'esaminare le domande correlate qui, mi sembrano alcune possibili risposte di cui non sono contento.
- Mock UserDefaults per i test di unità! Dovrei modificare molte classi esistenti in modo da poter iniettare quella finta.
- Cancella o personalizza UserDefaults in un metodo setUp! Ma poi i miei dati creati faticosamente nei test manuali sarebbero andati.
- Cancella o personalizza UserDefaults in un metodo setUp quindi ripristina quei valori in tearDown! Ahia.
Questi sembrano inutilmente complicati per qualcosa che dovrebbe essere una pratica standard nei test unitari. Non voglio ripetermi in ogni test unitario. Quindi, le mie domande sono:
- Mi manca qualcosa di desiderabile sul modo in cui gli UserDefaults vengono mantenuti dal test del Simulatore ad-hoc fino alle unit test runs?
- Esiste un modo configurabile per risolvere questo problema, ad esempio un modo per impostare l'obiettivo del test dell'unità in modo che disponga di un percorso di memorizzazione diverso per UserDefaults rispetto a quando utilizzo il simulatore per eseguire il test manuale?
- In caso contrario, c'è un modo elegante per farlo in codice?
- Ad esempio, potrei avere un oggetto MyAppTestCase ereditato da XCTestCase e sovrascrivere i metodi setUp e tearDown per sempre mettere da parte quindi ripristinare UserDefaults. E 'questa una buona idea?
Non dovresti testare le impostazioni predefinite dell'utente in quanto è qualcosa su cui non hai controllo diretto. Un test unitario dovrebbe funzionare su un'unità software atomica stessa -> non dovrebbero essere coinvolte altre classi o servizi. Il tuo approccio sembra molto più simile a un test di integrazione. Quest'ultimo userebbe comunemente le interfacce mocked-up. – Till
Penso che tu abbia frainteso la mia domanda. COME faccio i test unitari senza inserire qualcosa su cui non ho il controllo diretto? Non intendevo inserire le impostazioni predefinite dell'utente con valori reali. – LisaD
Un'altra soluzione potrebbe essere l'utilizzo di un framework di isolamento come OCMock. Aggiungi una cosiddetta cucitura alla tua classe come una proprietà di tipo NSUserDefaults. La classe in prova verrebbe inizializzata con standardUserDefaults memorizzati in detta proprietà. Nel tuo test puoi sovrascrivere l'oggetto defaults con un mock/stub. –