运行具有特定区域设置的单元测试(en_US或none)

时间:2013-07-29 16:15:37

标签: ios cocoa nslocalizedstring nslocale sentestingkit

运行单元测试时是否有办法强制使用特定区域设置?

EG。总是使用en_US或强制没有语言环境,因此没有加载任何.lproj文件。

我的unittest对“设置”应用中的当前所选语言(在iOS模拟器中)很敏感。我希望我的单元测试不会对语言敏感。

以下是显示问题的单元测试代码

@interface MYGalleryTests : SenTestCase
@end
@implementation MYGalleryTests
-(void)test0 {
    // This test doesn't work. 
    // I get 'No pictures' when locale is en_US
    // I get 'Ingen billeder' when locale is da_DK
    NSString* actual = [MYGallery emptyMessage];
    NSString* expected = @"EMPTY_MESSAGE"; 
    STAssertEqualObjects(actual, expected, nil);
}
@end


@interface MYGallery : NSObject
+(NSString*)emptyMessage;
@end
@implementation MYGallery
+(NSString*)emptyMessage {
    return NSLocalizedStringFromTable(@"EMPTY_MESSAGE", @"Gallery", @"Message shown when gallery is empty");
}
@end


en.lproj/Gallery.strings
/* Message shown when gallery is empty */
"EMPTY_MESSAGE" = "No pictures";

da.lproj/Gallery.strings
/* Message shown when gallery is empty */
"EMPTY_MESSAGE" = "Ingen billeder";

3 个答案:

答案 0 :(得分:3)

有一种方法可以在特定的区域设置中运行单元测试,但它不适合单元测试,但它可以用于测试。

在Xcode中,转到产品 - >方案 - >编辑方案... - >选择测试 - >选项然后设置应用程序语言'弹出所需的语言。然后您的单元测试将以指定的语言运行。您可以使用它来测试特定区域设置的代码。您可以使用它来实现比实际运行应用程序更快的测试周转时间,特别是如果您只运行单元测试的特定子集。但是,它通常对单元测试没有用,因为您只能使用指定的语言。

此外,执行此操作会修改.xcscheme,因此您在完成后需要更改。

更改单元测试的语言环境的一种方法是使用指定的技术here。但是,该技术使用方法调配,这对Swift无效。

答案 1 :(得分:1)

发布正确答案,以便将其标记为已回答。

How to force NSLocalizedString to use a specific language有解决此问题的方法。

答案 2 :(得分:1)

只需在运行选项中指定lang。

enter image description here