Jay*_*ase 16 iphone unit-testing nslocalizedstring
我有一个使用本地化字符串的iPhone iOS4.1应用程序.我刚刚开始使用SenTestingKit构建单元测试.我已经能够成功测试许多不同类型的值.
我无法正确测试任何使用NSLocalizedString调用的代码,因为当代码在我的LogicTests目标中运行时,我的所有NSLocalizedString调用都只返回字符串键.
我已将Localizable.strings文件添加到LogicTests目标.
我的问题是:如何配置我的LogicTests目标,以便对NSLocalizedString的调用将返回本地化字符串而不是字符串键.
kev*_*boh 10
这个问题让我发疯,但我能够NSLocalizedString表现得很好.
zoul是对的,如果你在逻辑测试中将mainBundle打印到控制台,它就不是包含你的Localizable.strings文件的bundle.NSLocalizedString无论何时运行单元测试,都需要有条件地重新定义.我是通过以下步骤完成的:
Preprocessor Macros构建设置中添加类似LOGIC_TESTS的内容.我的代码中只有一个地方需要重新定义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
Run Code Online (Sandbox Code Playgroud)替换YOUR_IDENTIFIER为应用程序包的Bundle Identifier(在您的Info.plist文件中找到,密钥是CFBundleIdentifier).这假定您仅在逻辑测试目标中定义LOGIC_TESTS为预处理器宏.
编辑:奇怪的是,一旦我删除了一些调试代码,这个解决方案就停止了工作.看起来你必须欺骗Xcode加载捆绑包.以下是:
NSString *path = @"path_to_main_bundle";
NSBundle *bundle = [NSBundle bundleWithPath:path];
NSLog(@"bundles: %@", [NSBundle allBundles]);
Run Code Online (Sandbox Code Playgroud)
哪里path_to_main_bundle是== [[NSBundle mainBundle] bundlePath]当你运行你的主要目标.只需在gdb中记录一次,或NSLog在您的app委托上使用以获取路径.它应该看起来像/Users/YOUR_USER_NAME/Library/Application Support/iPhone Simulator/4.1/Applications/UUID_LOTS_OF_LETTERS_AND_NUMBERS_HERE/App.app.
我将该代码放在我的一个逻辑测试类的setUp调用中.不,我不知道为什么我必须记录allBundles以使其工作,所以任何有线索的人,请告诉我!
我能够在我的单元测试的设置中使用以下代码来使用NSLocalizedString
- (void)setUp
{
[super setUp];
NSString *bundlePath = [[NSBundle bundleForClass:[self class]] resourcePath];
[NSBundle bundleWithPath:bundlePath];
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4593 次 |
| 最近记录: |