单元测试使用NSLocalizedString的iPhone代码
我有一个使用本地化字符串的iPhone iOS4.1应用程序。 我刚开始使用SenTestingKit构建单元测试。 我已经能够成功地测试许多不同类型的值。
我无法正确地测试任何使用NSLocalizedString调用的代码,因为当代码在我的LogicTests目标中运行时,我的所有NSLocalizedString调用都只返回字符串键。
我已将我的Localizable.strings文件添加到LogicTests目标。
我的问题是:如何配置我的LogicTests目标,以便对NSLocalizedString的调用将返回本地化的字符串而不是字符串键。
这个问题令我疯狂,但我能够获得NSLocalizedString
的行为。
zoul是对的,如果您在逻辑测试中将mainBundle打印到控制台,它不是包含Localizable.strings文件的同一个包。 无论何时运行单元测试,都需要有条件地重新定义NSLocalizedString
。 我通过以下步骤完成了它:
Preprocessor Macros
构建设置中添加诸如LOGIC_TESTS之类的内容。 在我的代码中只有1个地方需要重新定义NSLocalizedString
,所以我可以将下面的代码放在对应于该类的头文件中。 如果您在多个地方这个问题,我建议把下面的代码在头和#include
-ing它在你需要它(我尝试使用.PCH文件,但它不能在逻辑测试工作) 。 无论如何,将它放在使用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
定义为预处理器宏。
编辑:奇怪的是,一旦我删除了一些调试代码,此解决方案停止工作。 它看起来像你必须欺骗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调用中。 不,我不知道为什么我必须记录所有捆绑才能使其工作,所以任何有线索的人请告诉我!
我能够使用NSLocalizedString在我的单元测试的设置中使用以下代码
- (void)setUp
{
[super setUp];
NSString *bundlePath = [[NSBundle bundleForClass:[self class]] resourcePath];
[NSBundle bundleWithPath:bundlePath];
}
我遇到同样的问题,并且,感谢@kevboth,我通过向YourUnitTests-Prefix.pch添加两行来解决它:
#undef NSLocalizedString
#define NSLocalizedString(key, comment) [[NSBundle bundleForClass:[self class]] localizedStringForKey:(key) value:@"" table:nil]
链接地址: http://www.djcxy.com/p/19229.html
上一篇: Unit Testing iPhone Code That Uses NSLocalizedString
下一篇: iPhone OS: Why is my managedModelObject not complying with Key Value Coding?