Questo problema mi stava facendo impazzire, ma ero in grado di ottenere NSLocalizedString
comportarsi.
zoul aveva ragione, se si stampa il mainBundle sulla console in un test di logica, non è lo stesso pacchetto che contiene il file Localizable.strings. È necessario ridefinire in modo condizionale NSLocalizedString
ogni volta che si eseguono i test unitari. L'ho fatto nelle seguenti fasi:
- Abbiamo bisogno di un modo per dire quando siamo nel nostro obiettivo di test logici, in modo da aggiungere qualcosa di simile LOGIC_TESTS all'impostazione
Preprocessor Macros
costruzione del bersaglio test logici.
C'è solo 1 posto nel mio codice in cui ho bisogno di ridefinire NSLocalizedString
, quindi sono stato in grado di inserire il seguente codice nell'intestazione corrispondente a quella classe. Se stai riscontrando questo problema in più punti, ti suggerisco di inserire il seguente codice in un'intestazione e #include
inserendolo dove ne hai bisogno (ho provato a utilizzare un file .pch ma non funziona nei test di logica). In ogni caso, mettere da qualche parte nell'intestazione di classe (i) che utilizzano NSLocalizedString
:
#ifdef LOGIC_TESTS
#undef NSLocalizedString
#define NSLocalizedString(key, comment) [[NSBundle bundleWithIdentifier:@"YOUR_IDENTIFIER"] localizedStringForKey:(key) value:@"" table:nil]
#endif
Sostituire YOUR_IDENTIFIER
con il Bundle Identifier del fascio della tua app (che si trova nel file Info.plist
, chiave è CFBundleIdentifier
). Ciò presuppone che tu abbia definito LOGIC_TESTS
come una macro preprocessore solo nel tuo obiettivo Test di logica.
modifica: Stranamente, una volta rimosso il codice di debug, questa soluzione ha smesso di funzionare. Sembra che devi ingannare Xcode anche nel caricare il pacchetto. Di seguito lo fa:
NSString *path = @"path_to_main_bundle";
NSBundle *bundle = [NSBundle bundleWithPath:path];
NSLog(@"bundles: %@", [NSBundle allBundles]);
Dove path_to_main_bundle
è == [[NSBundle mainBundle] bundlePath]
quando si esegue il vostro obiettivo principale. Basta registrarlo una volta in gdb o utilizzare NSLog
sul delegato dell'app per afferrare il percorso. Dovrebbe assomigliare a /Users/YOUR_USER_NAME/Library/Application Support/iPhone Simulator/4.1/Applications/UUID_LOTS_OF_LETTERS_AND_NUMBERS_HERE/App.app
.
Ho inserito quel codice nella chiamata setUp per una delle mie classi di test logiche. E no, non ho idea del motivo per cui devo registrare tutti i bundle per farlo funzionare, quindi chiunque abbia un indizio, per favore fatemelo sapere!
Ci deve essere un modo più aggraziato per farlo, ma ho altre cose su cui ho bisogno di lavorare. Sospetto che la vera soluzione sia trovare un modo per localizzare le risorse del bundle senza strane codifiche e introspezioni. – kevboh
Amico! Grazie per una risposta così dettagliata. Questo sarà di grande aiuto. Sono sorpreso che così poche persone sembrano averlo incontrato - forse non molte persone che localizzano il test unitario. ;-) –
Nessun problema. Sì, è strano come non ho trovato nulla su questo problema nell'interwebs. Sicuramente fammi sapere se pensi a qualcos'altro su questo. – kevboh