我的单元测试套件包含一些仅适用于最新iOS版本的测试用例.预计,在较旧的iOS版本上运行套件时,这些测试会失败.
是否有标准方法来指示这些测试用例应仅在特定的iOS版本上运行?
我想到的一个选择:
- (void) testSomethingThatOnlyWorksOniOS7 { const BOOL iOS7OrHigher = floor(NSFoundationVersionNumber) > NSFoundationVersionNumber_iOS_6_1; if (!iOS7OrHigher) return; // Actual test goes here }
或者,我可以告诉SenTestCase动态跳过某些测试吗?
解决方法
你的方法对我来说似乎很好.
一般来说,我认为没有像“标准方式”那样有选择地执行基于iOS版本的单元测试.
一方面,根据iOS版本,您的方法可以选择性地或以不同方式实现一个功能.可能你已经知道关于CocoaWithLove:Tips and Tricks from conditional…的这个讨论.它已经很老了,但是这里描述的方法仍然保持不变.
你没有指定单元测试的执行方式,但处理这个问题的真正酷的方法是IMO,它能够指定在实现之外执行哪些测试,以便你说明哪些只适用于iOS7和不要污染你的测试实现.
这可以通过例如与每个测试相关联的版本号来完成;在调用单元测试实现之前,请检查函数调用中的版本号,例如testSomethingThatOnlyWorksOniOS7.
编辑:
实际上,事情可能比我想到的更容易.现在我有点hacky ……
您可以在OCUnit中修改实际测试方法调用的位置(不知道这个,对不起,但我不认为应该很难找到…)以便它检查选择器名称:您转换将选择器名称转换为字符串(NSStringFromSelector),如果它匹配某个正则表达式,则需要一些特定的分支(在您的情况下,这将忽略该测试).
如果您担心修改OCUnit,这可能不合理,我上面所说的可以通过方法调配来完成:只有当选择器名称与您的表达式不匹配时,才调用原始实现,否则什么都不做.