基于iOS版本的条件单元测试

hpi*_*que 6 unit-testing objective-c ocunit ios sentestingkit

我的单元测试套件包含一些仅适用于最新iOS版本的测试用例.预计,在较旧的iOS版本上运行套件时,这些测试会失败.

是否有标准方法来指示这些测试用例应仅在特定的iOS版本上运行?

我想到的一个选择:

- (void) testSomethingThatOnlyWorksOniOS7
{
    const BOOL iOS7OrHigher = floor(NSFoundationVersionNumber) > NSFoundationVersionNumber_iOS_6_1;
    if (!iOS7OrHigher) return;

    // Actual test goes here
}
Run Code Online (Sandbox Code Playgroud)

或者,我可以告诉SenTestCase您动态跳过某些测试吗?

ser*_*gio 5

你的方法对我来说似乎很好。

一般来说,我不认为有一种“标准方式”可以根据 iOS 版本有选择地执行单元测试。

一方面,您的方法是相同的,可用于根据 iOS 版本有选择地或以不同方式实现一个功能。可能您已经知道 CocoaWithLove: Tips and Tricks from conditional... 的讨论。它已经很老了,但这里描述的方法仍然保持不变。

您没有指定单元测试的执行方式,但处理这个问题的真正酷方法,IMO,是能够指定在实现之外执行哪些测试,以便您说明哪些测试仅适用于 iOS7 和不要污染你的测试实现。

例如,这可以通过与每个测试相关联的版本号来完成;在调用单元测试实现之前,您检查函数调用中的版本号,例如testSomethingThatOnlyWorksOniOS7.

编辑:

实际上,事情可能比我最初想的要容易。现在我要有点hacky了...

您可以修改 OCUnit 中完成实际测试方法调用的位置(不知道这一点,抱歉,但我认为应该不难找到...),以便它检查选择器名称:您转换将选择器名称转换为字符串 ( NSStringFromSelector),如果它与某个正则表达式匹配,则采用某个特定分支(这只是在您的情况下,忽略该测试)。

If you are worried by modifying OCUnit, which might not be sensible, what I said above could be done through method swizzling: only if the selector name does not match your expression, you call the original implementation, otherwise do nothing.