单元测试使用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?