Ответ 1
Эта проблема сводила меня с ума, но я смог заставить NSLocalizedString
вести себя.
zoul был прав, если вы напечатаете mainBundle на консоли в логическом тесте, это не тот же пакет, который содержит файл Localizable.strings. Вам нужно условно переопределить NSLocalizedString
всякий раз, когда вы запускаете модульные тесты. Я сделал это в следующих шагах:
- Нам нужен способ рассказать, когда мы находимся в целевом задании логических тестов, поэтому добавьте что-то вроде LOGIC_TESTS в целевую настройку сборки
Preprocessor Macros
для логических тестов. -
В моем коде есть только 1 место, где мне нужно переопределить
NSLocalizedString
, поэтому я смог поместить следующий код в заголовок, соответствующий этому классу. Если у вас возникла эта проблема в нескольких местах, я бы предложил поместить следующий код в заголовок и#include
-в его, где он вам нужен (я попытался использовать файл .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
идентификатором Bundle вашего приложения (найденным в вашем файле Info.plist
, ключ CFBundleIdentifier
). Предполагается, что вы определили 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 для одного из моих логических тестовых классов. И нет, я понятия не имею, почему мне приходится регистрировать allBundles, чтобы он работал, поэтому любой, у кого есть ключ, сообщите мне!