この問題は私を夢中にさせていましたが、私はNSLocalizedString振る舞うことができました.
ロジック テストで mainBundle をコンソールに出力すると、Localizable.strings ファイルを含むバンドルとは異なります。NSLocalizedString単体テストを実行するたびに、条件付きで再定義する必要があります。次の手順で行いました。
- ロジック テスト ターゲットにいることを伝える方法が必要なので、ロジック テスト ターゲットの
Preprocessor Macrosビルド設定に LOGIC_TESTS のようなものを追加します。
私のコードには を再定義する必要がある場所が 1 か所しかないNSLocalizedStringため、そのクラスに対応するヘッダーに次のコードを配置することができました。複数の場所でこの問題が発生している場合は、次のコードをヘッダーに配置し、#include必要な場所に -ing することをお勧めします (.pch ファイルを使用してみましたが、Logic Tests では機能しません)。とにかく、これを使用するクラスのヘッダーのどこかに配置しますNSLocalizedString:
#ifdef LOGIC_TESTS
#undef NSLocalizedString
#define NSLocalizedString(key, comment) [[NSBundle bundleWithIdentifier:@"YOUR_IDENTIFIER"] localizedStringForKey:(key) value:@"" table:nil]
#endif
YOUR_IDENTIFIERアプリのバンドルのバンドル識別子に置き換えます (Info.plistファイル内にあり、キーは ですCFBundleIdentifier)。これは、Logic Tests ターゲットでのみLOGIC_TESTSプリプロセッサ マクロとして定義したことを前提としています。
編集:不思議なことに、デバッグコードを削除すると、このソリューションは機能しなくなりました。Xcode をだましてバンドルをロードする必要があるようです。次のようにします。
NSString *path = @"path_to_main_bundle";
NSBundle *bundle = [NSBundle bundleWithPath:path];
NSLog(@"bundles: %@", [NSBundle allBundles]);
メインターゲットを実行するときはどこですかpath_to_main_bundle。== [[NSBundle mainBundle] bundlePath]gdb に 1 回記録するかNSLog、アプリのデリゲートで使用してパスを取得するだけです。のようになります/Users/YOUR_USER_NAME/Library/Application Support/iPhone Simulator/4.1/Applications/UUID_LOTS_OF_LETTERS_AND_NUMBERS_HERE/App.app。
そのコードを、ロジック テスト クラスの 1 つの setUp 呼び出しに配置しました。いいえ、すべてのバンドルをログに記録して機能させる必要がある理由がわかりません。手がかりがある人は教えてください!