【发布时间】:2011-01-24 01:08:45
【问题描述】:
我有许多按继承层次组织的 Objective-C 类。它们都有一个共同的父级,该父级实现了子级之间共享的所有行为。每个子类都定义了一些使其工作的方法,并且父类为旨在由其子类实现/覆盖的方法引发异常。这有效地使父类成为伪抽象类(因为它本身没有用),即使 Objective-C 没有明确支持抽象类。
这个问题的症结在于我正在使用 OCUnit 对这个类层次结构进行单元测试,并且测试的结构类似:一个测试常见行为的测试类,其子类对应于每个被测子类。然而,在(有效抽象的)父类上运行测试用例是有问题的,因为如果没有关键方法,单元测试将以惊人的方式失败。 (在 5 个测试类中重复常见测试的替代方法并不是真正可接受的选择。)
我一直在使用的非理想解决方案是检查(在每个测试方法中)实例是否是父测试类,如果是则退出。这会导致在每个测试方法中重复代码,如果一个人的单元测试非常精细,这个问题会变得越来越烦人。此外,所有此类测试仍会执行并报告为成功,这会影响实际运行的有意义测试的数量。
我更喜欢向 OCUnit 发出信号“不要在这个类中运行任何测试,只在它的子类中运行它们。”据我所知,(还)没有一种方法可以做到这一点,类似于我可以实现/覆盖的+(BOOL)isAbstractTest 方法。关于以最少重复次数解决此问题的更好方法的任何想法? OCUnit 是否有能力以这种方式标记测试类,或者是时候提交 Radar 了吗?
编辑:这是link to the test code in question。注意if (...) return; 的频繁重复来启动一个方法,包括使用NonConcreteClass() 宏来简洁。
【问题讨论】:
-
所以您的非理想解决方案包括使用
if ([self isMemberOfClass:[ParentTest class]]) return;? 之类的东西开始测试? -
粗略地说,是的。我已经编辑了我的问题以包含指向相关测试课程的链接。
标签: objective-c unit-testing dry ocunit class-hierarchy