我需要让我的iOS lib与iOS 6+兼容,所以我使它与iOS 7中提供的库向前兼容,这使我的生活更轻松(最终让我删除旧代码)。
例如,iOS 7+中提供了原生base64编码,所以我做了一个看起来像这样的检查(我从另一个SO问题中提取):
if([NSData respondsToSelector:@selector(base64EncodedStringWithOptions:)]) {
// Do iOS 7 stuff
} else {
// Break my head over iOS 6 compatibility
}
这似乎工作正常,但我如何编写单元测试来检查这两种情况?如果我在我的单元测试中使用相同的if-else检查,那将会破坏单元测试的目的,不是吗?
答案 0 :(得分:1)
因此,您可以测试它在iOS 6和iOS 7上运行的唯一真实方法是在两个版本上运行测试。鉴于此,编写一个测试方法的单元测试,然后让您的CI基础结构(Xcode Bots,Travis CI等)运行您支持的所有iOS版本的所有测试。一个以这种方式进行测试的项目是Subliminal,它目前在iPhone和iPad上运行iOS 6和7上的测试。
编辑:
在此示例中,您有一个测试可以检查base64解码是否正确完成。这个方法不知道它运行的iOS版本 - 它只知道解码是否正常工作。您将设置CI基础结构以在iOS 6和7设备上运行此方法。当它在iOS 7设备上运行时,if会测试if语句的YES
分支,而在iOS 6上它会测试if语句的NO
分支。
- (void)testEncoding
{
NSData *base64EncodedData = [@"aGVsbG8=" dataUsingEncoding:NSUTF8StringEncoding];
NSString *decodedString = [self decodeData:base64EncodedData];
XCTAssert([decodedString isEqualToString:@"hello"], @"The base64 encoded string should decode to the word `hello`");
}
- (NSString *)decodeData:(NSData *)data
{
if ([data respondsToSelector:@selector(base64EncodedDataWithOptions:)]) {
return [[NSString alloc] initWithData:[[NSData alloc] initWithBase64EncodedData:data options:0]
encoding:NSUTF8StringEncoding];
} else {
// Whatever method you use on iOS 6 to decode the base 64 data.
return nil;
}
}