gpt4 book ai didi

iphone - 使用 NSLocalizedString 对 iPhone 代码进行单元测试

转载 作者:行者123 更新时间:2023-12-03 18:22:40 27 4
gpt4 key购买 nike

我有一个使用本地化字符串的 iPhone iOS4.1 应用程序。我刚刚开始使用 SenTestingKit 构建单元测试。我已经能够成功测试许多不同类型的值。

我无法正确测试任何使用 NSLocalizedString 调用的代码,因为当代码在我的 LogicTests 目标中运行时,我的所有 NSLocalizedString 调用仅返回字符串键。

我已将 Localized.strings 文件添加到 LogicTests 目标。

我的问题是:我必须如何配置我的 LogicTests 目标,以便对 NSLocalizedString 的调用将返回本地化字符串而不是字符串键。

最佳答案

这个问题让我抓狂,但我能够让 NSLocalizedString 正常工作。

zoul 是对的,如果您在逻辑测试中将 mainBundle 打印到控制台,则它与包含 Localized.strings 文件的包不同。每当运行单元测试时,您都需要有条件地重新定义 NSLocalizedString。我按照以下步骤完成了:

  1. 我们需要一种方法来判断何时处于逻辑测试目标中,因此请将 LOGIC_TESTS 之类的内容添加到逻辑测试目标的预处理器宏build设置中。
  2. 我的代码中只有 1 个位置需要重新定义 NSLocalizedString,因此我能够将以下代码放置在与该类对应的 header 中。如果您在多个地方遇到此问题,我建议将以下代码放入 header 中,并在需要的地方使用 #include-ing (我尝试使用 .pch 文件,但它没有在逻辑测试中不起作用)。无论如何,将其放置在使用 NSLocalizedString 的类的 header 中的某个位置:

    #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定义为在逻辑测试目标中的预处理器宏。

编辑:奇怪的是,一旦我删除了一些调试代码,这个解决方案就停止工作了。看来您还必须欺骗 Xcode 来加载该包。执行以下操作:

NSString *path = @"path_to_main_bundle";
NSBundle *bundle = [NSBundle bundleWithPath:path];
NSLog(@"bundles: %@", [NSBundle allBundles]);

当您运行主要目标时,path_to_main_bundle== [[NSBundle mainBundle] bundlePath] 。只需在 gdb 中记录一次或在应用程序委托(delegate)上使用 NSLog 即可获取路径。它应该类似于 /Users/YOUR_USER_NAME/Library/Application Support/iPhone Simulator/4.1/Applications/UUID_LOTS_OF_LETTERS_AND_NUMBERS_HERE/App.app

我将该代码放置在我的一个逻辑测试类的 setUp 调用中。不,我不知道为什么我必须记录 allBundles 才能使其正常工作,所以任何有线索的人,请告诉我!

关于iphone - 使用 NSLocalizedString 对 iPhone 代码进行单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3833128/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com