如何对继承对象进行单元测试?
使用合成时,我们可以模拟其他对象
被测课程取决于哪个,但何时使用
继承,我们不能模拟基类。 (或者可以吗?)
我通常会尝试使用组合而不是继承,
但是有时候,继承似乎确实是最好的工具
至少在进行单元测试之前
那么,如何测试继承?还是只是将其作为垃圾
无法测试,而是使用合成?
注意:我主要使用PHP和PHPUnit,因此请提供帮助
非常感谢。但这也很有趣
是否有其他语言的解决方案。
解决方案
只要我们不重写父类的公共方法,我就看不到为什么需要在其所有子类上对其进行测试。对父类上的方法进行单元测试,并仅对子类上的新方法或者重写的方法进行测试。
为什么要嘲笑基类?
如何从不存在的父类创建派生类?
像往常一样测试它,但是有父类。
我想我们还没有讲完整的故事。
此外,语言功能应该可以正常工作(除非我们正在使用Beta版本或者类似版本),因此我们无需测试该方法是否确实存在于派生类中。
我们在合成中使用模拟对象的原因是,真实对象是否执行了我们不想设置的操作(例如使用套接字,串行端口,获取用户输入,检索大量数据等)。我们应该尽可能使用真实的对象。模拟对象仅适用于使用实际对象实现和维护测试的估计工作量大于使用模拟对象实现和维护测试的工作量。你的基类不应该做任何花哨的事!
因此,我们不必测试继承。大概我们正在使用基类的行为,因此只需测试派生类就可以像通常在测试时在基类和派生类上调用方法一样进行测试。这样可以确保测试派生类的所有预期行为。
本质上,(大多数时候)我们将派生类测试为好像基类是不可见的。
不,你没有。我们只需要检查重写的方法是否可以执行应做的工作即可。它绝不会影响父方法的行为。如果父方法开始失败,则意味着我们在父级别测试绑定条件时错过了绑定条件。
使用一组反映类层次结构的单元测试。如果我们有一个基类Base和一个派生类Derived,则有测试类BaseTests并从该DerivedTests派生。 BaseTests负责测试Base中定义的所有内容。 DerivedTests继承了这些测试,并且还负责测试Derived中的所有内容。
如果要在Base中测试受保护的虚拟方法(即Base及其子孙类之间的接口),则使仅用于测试该接口的仅测试派生类也有意义。