Dieses Problem machte mich verrückt, aber ich war in der Lage, NSLocalizedString
zu verhalten.
ZOUL war richtig, wenn Sie das MainBundle in einem logischen Test auf die Konsole drucken, ist es nicht das gleiche Paket, das Ihre Localizable.strings-Datei enthält. Sie müssen NSLocalizedString
bedingt neu definieren, wenn Sie Ihre Komponententests ausführen. Ich habe es in den folgenden Schritten:
- Wir brauchen eine Möglichkeit zu sagen, wenn wir in unseren Logik-Tests Ziel sind, so fügen Sie so etwas wie LOGIC_TESTS auf Ihre Logik Tests
Preprocessor Macros
Build Einstellung des Ziels.
Es gibt nur 1 Platz in meinem Code, wo ich NSLocalizedString
neu definieren muss, so konnte ich den folgenden Code in der Kopfzeile entsprechend dieser Klasse platzieren. Wenn Sie dieses Problem an mehreren Stellen haben, würde ich vorschlagen, den folgenden Code in eine Kopfzeile zu setzen und #include
-wo Sie es brauchen (Ich habe versucht, eine .pch-Datei, aber es funktioniert nicht in Logiktests). Wie dem auch sei, stellen Sie diesen irgendwo im Header der Klasse (n), die NSLocalizedString
verwenden:
#ifdef LOGIC_TESTS
#undef NSLocalizedString
#define NSLocalizedString(key, comment) [[NSBundle bundleWithIdentifier:@"YOUR_IDENTIFIER"] localizedStringForKey:(key) value:@"" table:nil]
#endif
ersetzen YOUR_IDENTIFIER
mit dem Bundle Identifier des Bündels Ihrer App (in Ihrer Info.plist
Datei gefunden, Schlüssel ist CFBundleIdentifier
). Dies setzt voraus, dass Sie in Ihrem Logic Tests-Ziel LOGIC_TESTS
als Präprozessor-Makro nur definiert haben.
edit: Merkwürdiger, einmal entfernte ich einige Debug-Code diese Lösung funktioniert nicht mehr. Es sieht so aus, als müssten Sie Xcode dazu bringen, das Paket ebenfalls zu laden. Die folgende tut es:
NSString *path = @"path_to_main_bundle";
NSBundle *bundle = [NSBundle bundleWithPath:path];
NSLog(@"bundles: %@", [NSBundle allBundles]);
Wo path_to_main_bundle
== [[NSBundle mainBundle] bundlePath]
ist, wenn Sie Ihr Hauptziel führen. Loggen Sie es einfach einmal in gdb ein oder verwenden Sie NSLog
auf Ihrem App-Delegaten, um den Pfad zu erfassen. Es sollte ungefähr so aussehen: /Users/YOUR_USER_NAME/Library/Application Support/iPhone Simulator/4.1/Applications/UUID_LOTS_OF_LETTERS_AND_NUMBERS_HERE/App.app
.
Ich habe diesen Code in den Aufruf setUp für eine meiner Logik-Test-Klassen platziert. Und nein, ich habe keine Ahnung, warum ich allBundles einloggen muss, damit es funktioniert. Also, jeder, der eine Ahnung hat, lass es mich wissen!
Es muss einen eleganteren Weg geben, dies zu tun, aber ich habe andere Sachen, an denen ich arbeiten muss. Ich vermute, dass die wirkliche Lösung darin besteht, einen Weg zu finden, die Bündelressourcen ohne merkwürdige Hardcoding und Introspektion zu finden. – kevboh
Alter! Danke für eine so detaillierte Antwort. Dies wird eine große Hilfe sein. Ich bin überrascht, dass so wenige Leute das gefunden haben - vielleicht nicht viele Leute, die Unit-Tests lokalisieren. ;-) –
Kein Problem. Ja, es ist komisch, wie ich im Interweb nichts zu diesem Problem finden konnte. Sagen Sie mir auf jeden Fall Bescheid, wenn Sie etwas anderes herausfinden. – kevboh