【问题标题】:How do I create a unit test on a method that changes depending on SDK?如何在根据 SDK 更改的方法上创建单元测试?
【发布时间】:2014-05-13 01:05:26
【问题描述】:

我需要使我的 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 objective-c unit-testing compatibility backwards-compatibility


    【解决方案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;
        }
    }
    

    【讨论】:

    • 这不是意味着在这两种情况下,我总会有一个测试失败吗? (即 7 环境中的 6 兼容性会失败,反之亦然)
    • 我可能有点误解了你的问题——你的单元测试到底是什么?
    • 很抱歉 - 它会测试“if”部分和“else”部分中的两个代码块。这两个部分总体上做同样的事情,但不确定如何断言“if”或“else”部分已运行。
    • 我用一个例子编辑了我的答案——如果你能解释这不能回答你的问题,那应该有助于我更好地理解你的问题,以便我能更好地回答
    • 似乎是对的。我脑子里的情况可能过于复杂了。感谢您的帮助!
    猜你喜欢
    • 2016-10-18
    • 1970-01-01
    • 2013-11-01
    • 1970-01-01
    • 2012-12-01
    • 2010-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多