这个问题让我发疯,但我能够NSLocalizedString
表现得很好。
zoul 是对的,如果您在逻辑测试中将 mainBundle 打印到控制台,则它与包含您的 Localizable.strings 文件的包不同。NSLocalizedString
每当您运行单元测试时,您都需要有条件地重新定义。我是按照以下步骤完成的:
- 我们需要一种方法来判断我们何时处于逻辑测试目标中,因此将 LOGIC_TESTS 之类的内容添加到逻辑测试目标的
Preprocessor Macros
构建设置中。
我的代码中只有一个地方需要重新定义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 目标中定义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 中记录一次或NSLog
在您的应用程序委托上使用来获取路径。它应该看起来像/Users/YOUR_USER_NAME/Library/Application Support/iPhone Simulator/4.1/Applications/UUID_LOTS_OF_LETTERS_AND_NUMBERS_HERE/App.app
.
我将该代码放在我的一个逻辑测试类的 setUp 调用中。不,我不知道为什么我必须记录 allBundles 才能使其工作,所以任何有线索的人,请告诉我!