如何单元测试继承的对象?(How do I unit-test inheriting objects

2019-09-16 10:39发布

当您使用成分,那么你可以模拟从你的类被测依赖于其他对象,但是当你使用继承,你不能嘲笑的基类。 (或者你能吗?)

我一般都尽量倾向于组成了继承 ,但有时确实继承好像这个职位的最佳工具-好吧,至少直到它的单元测试。

那么,你怎么测试继承? 或者你只是垃圾作为不可测和使用成分呢?

注:我主要使用PHP和PHPUnit的,所以在那边帮助最赞赏。 但是,这也将是有趣的知道是否有其他语言这个问题的解决方案。

Answer 1:

使用一套单元测试,反映了类层次结构。 如果你有一个基类基类和派生派生类中,则有测试类BaseTests并从DerivedTests的。 BaseTests负责测试的基本定义的一切。 DerivedTests继承了这些测试,并且还负责在派生测试一切。

如果你想测试在基地受保护的虚拟方法(即碱及其派生类之间的接口),它也可能是有意义的做一个测试,仅派生的类测试该接口。



Answer 2:

只要你不重写父类的公共方法,我不明白为什么你需要测试他们对所有的子类。 单元测试父类的方法和测试只有新的方法或在子类中被覆盖的人。



Answer 3:

您在成分使用模拟对象的原因是,如果真正的对象做一些你不想设置(如使用的插座,串口,获取用户输入,检索庞大的数据等)。 你应该总是在可能使用真实对象。 Mock对象只对当预计的努力实现和维护使用真实对象的测试是大于,要实现和使用模拟对象保持一个考验。 你的基类不应该做任何幻想这样的!

所以你不要有测试继承。 大概你正在使用的基类的行为,所以只是测试的派生类中,你通常会 - 调用基类和派生类为适用于这两种测试方法上。 这确保了派生类的所有预期行为测试。

从本质上讲,(大部分时间),你测试一个派生类仿佛基类是不可见的。



Answer 4:

为什么要嘲笑的基类?

如何创建派生类从一个不存在的父类?

只是测试它像往常一样,但有父类。

我想你还没有告诉整个故事。

此外,语言特征理应工作(除非你用的测试版本或使工作),所以你不需要测试方法是否在派生类中实际存在。



Answer 5:

不,你不知道。 你只需要检查被覆盖的方法做他们应该。 它绝不应影响您的父方法的行为。 如果你的父母方法开始失效,那么就意味着你在母公司层面进行测试时,他们错过了约束条件。



文章来源: How do I unit-test inheriting objects?