单元测试使用NSLocalizedString的iPhone代码

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无论何时运行单元测试,都需要有条件地重新定义.我是通过以下步骤完成的:

  1. 我们需要一种方法来判断我们何时处于逻辑测试目标中,因此在逻辑测试目标的Preprocessor Macros构建设置中添加类似LOGIC_TESTS的内容.
  2. 我的代码中只有一个地方需要重新定义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以使其工作,所以任何有线索的人,请告诉我!


cpu*_*iya 7

我能够在我的单元测试的设置中使用以下代码来使用NSLocalizedString

- (void)setUp
{
    [super setUp];

    NSString *bundlePath = [[NSBundle bundleForClass:[self class]] resourcePath];
    [NSBundle bundleWithPath:bundlePath];
}
Run Code Online (Sandbox Code Playgroud)