我在继承层次结构中组织了许多Objective-C类.他们都共享一个共同的父母,实现孩子们共享的所有行为.每个子类定义了一些使其工作的方法,并且父类为设计为由其子项实现/覆盖的方法引发
这个问题的关键在于我使用OCUnit对这个类层次结构进行单元测试,并且测试的结构类似:一个测试类,它运行公共行为,子类对应于每个被测试的子类.但是,在(有效抽象)父类上运行测试用例是有问题的,因为如果没有关键方法,单元测试将以惊人的方式失败. (在5个测试类中重复常见测试的替代方案实际上不是一个可接受的选项.)
我一直在使用的非理想解决方案是检查(在每个测试方法中)实例是否是父测试类,如果是,则进行挽救.这导致每个测试方法中的重复代码,如果一个单元测试是高度精细的,这个问题变得越来越烦人.此外,所有这些测试仍然执行并报告为成功,扭曲了实际运行的有意义测试的数量.
我更喜欢的是向OCUnit发出信号的方法“不要在这个类中运行任何测试,只在它的子类中运行它们.”据我所知,还没有一种方法可以做到这一点,类似于(BOOL)isAbstractTest方法,我可以实现/覆盖.有关更好地解决这个问题的最小重复的任何想法? OCUnit是否有能力以这种方式标记测试类,或者是时候提交Radar了?
编辑:这是一个link to the test code in question.注意频繁重复if(…)return;启动一个方法,包括使用NonConcreteClass()宏以简洁起见.
如果不深入研究OCUnit本身,特别是-performTest的SenTestCase实现,我没有看到改进你当前正在做的事情的方法.如果它调用了一个方法来确定“我应该运行这个测试吗?”,你将被设置.默认实现将返回YES,而您的版本将类似于if语句.我要提交雷达.最糟糕的情况是你的代码保持现在的状态.