在开发一组用于将数值和日期转换为字符串的日期计算和语言规则时,我正在编写断言字符串格式化方法的结果的测试。一个虚构的断言可能如下所示:
NSAssert([dateString isEqualToString:@"Three days, until 6:00 PM"], @"Date string should match expectation");
但是,由于该应用程序已针对多种语言进行了本地化,并且我的开发人员同事也来自不同的区域设置,因此您的设备或模拟器可能设置为与编写测试所针对的区域设置不同的区域设置。在这样的场景中,dateString
可能是这样的:
@"Drie dagen, tot 18:00" // the assertion fails
@"Drei Tage, bis 18 Uhr" // the assertion also fails
对于这些区域设置,这可能是也可能不是正确的日期表示法,但我的问题是,当底层代码使用 Apple API 时,如何能够对特定区域设置运行测试,如下所示:
[NSDateFormatter localizedStringFromDate:date
dateStyle:NSDateFormatterNoStyle
timeStyle:NSDateFormatterShortStyle];
我很乐意在我的断言中涵盖两种或多种语言,如下所示:
[NSSomething actionToSetTheLocaleTo:@"en_US"];
dateString = ...; // the formatting
NSAssert([dateString isEqualToString:@"Three days, until 6:00 PM"], @"match en_US");
[NSSomething actionToSetTheLocaleTo:@"nl_NL"];
dateString = ...; // the formatting
NSAssert([dateString isEqualToString:@"Drie dagen, tot 18:00"], @"match nl_NL");
谁知道如何实现这个效果?
Notes:
- 更改首选语言并不能解决问题,它还需要影响 NSDateFormatter 和 NSNumberFormatter 的行为。
- 因为这仅用于单元测试目的,所以我对使用私有 API 感到满意。然而,为了其他人在这篇文章中绊倒的利益,公共 API 是首选。
- 将自定义区域设置传递给每个日期或数字格式化 API 可能是最后的考虑因素,但我发布这个问题希望avoid又回到那些极端措施。但是,如果您知道这是唯一的解决方案,请提供一些参考,我不会再浪费时间了
该主题的链接:
- Ray Lillywhite 撰写的关于 i18n 和 l10n 的好文章 http://engineering.hoteltonight.com/the-nitty-gritty-of-ios-internationalization-and-localization/
- 关于 NSLocale 的 NSHipster 文章 http://nshipster.com/nslocale/