Эта проблема сводила меня с ума, но я смог заставить NSLocalizedString
вести себя.
zoul был прав, если вы печатаете mainBundle на консоли в логическом тесте, это не тот пакет, который содержит ваш файл Localizable.strings. Вам необходимо условно переопределить NSLocalizedString
всякий раз, когда вы запускаете свои модульные тесты. Я сделал это в следующие шаги:
- Нам нужен способ определить, когда мы находимся в нашей цели логических тестов, поэтому добавьте что-то вроде LOGIC_TESTS в настройку
Preprocessor Macros
сборки вашей цели логических тестов.
В моем коде есть только 1 место, где мне нужно переопределить NSLocalizedString
, поэтому я смог поместить следующий код в заголовок, соответствующий этому классу. Если у вас возникла эта проблема в нескольких местах, я бы предложил поместить следующий код в заголовок и указать #include
там, где он вам нужен (я пытался использовать файл .pch, но он не работает в тестах логики). ). В любом случае, поместите это где-нибудь в заголовок класса (ов), которые используют 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
как макрос препроцессора only в своей цели Logic Tests.
edit: Любопытно, что как только я удалил некоторый отладочный код, это решение перестало работать. Похоже, вы должны обмануть Xcode и при загрузке пакета. Это делает следующее:
NSString *path = @"path_to_main_bundle";
NSBundle *bundle = [NSBundle bundleWithPath:path];
NSLog(@"bundles: %@", [NSBundle allBundles]);
Где path_to_main_bundle
равно == [[NSBundle mainBundle] bundlePath]
при запуске вашей основной цели. Просто зарегистрируйте его один раз в gdb или используйте NSLog
в делегате приложения, чтобы получить путь. Это должно выглядеть примерно так: /Users/YOUR_USER_NAME/Library/Application Support/iPhone Simulator/4.1/Applications/UUID_LOTS_OF_LETTERS_AND_NUMBERS_HERE/App.app
.
Я поместил этот код в вызов setUp для одного из моих классов логического теста. И нет, я понятия не имею, почему я должен регистрировать все пакеты, чтобы это работало, поэтому, если у вас есть подсказка, пожалуйста, дайте мне знать!