ios - 如何针对随 SDK 变化的方法创建单元测试?

标签 ios objective-c unit-testing compatibility backwards-compatibility

我需要让我的 iOS 库与 iOS 6+ 兼容,所以我要使其与 iOS 7 中可用的库向前兼容,这让我的生活更轻松(这最终会让我删除旧代码)。

例如,原生 base64 编码在 iOS 7+ 中可用,所以我做了一个看起来像这样的检查(我从另一个 SO 问题中提取):

if([NSData respondsToSelector:@selector(base64EncodedStringWithOptions:)]) {
     // Do iOS 7 stuff
} else {
     // Break my head over iOS 6 compatibility
}

这似乎工作正常,但我如何编写单元测试来检查这两种情况?如果我在我的单元测试中使用相同的 if-else 检查,那会破坏单元测试的目的,不是吗?

最佳答案

因此,您能够测试它是否适用于 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;
    }
}

关于ios - 如何针对随 SDK 变化的方法创建单元测试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23621288/

相关文章:

android - 如何通过 Robolectric 对位置提供程序进行单元测试?

php - 有没有办法只为给定的 PHPUnit 测试加载特定的装置?

iOS:使用终端搜索 cocoapods

ios - 我是否同时需要变量和属性?

ios - 用于分析和登录的 GoogleService-Info.plist

ios - UIPrintInteractionController 打印到多台 AirPrint 打印机

iphone - -[NSCFString objectAtIndex :]: unrecognized selector

iOS:使用你的 Appdelegate 作为小东西的模型是好的设计模式吗?

ios - 将值从 UIView 传递到 UIVIewController

postgresql - CakePHP 3 : Model Unit Test fails - "duplicate key value"