【问题标题】:PHPUnit Test child class conforms to an interfacePHPUnit 测试子类是否符合接口
【发布时间】:2015-01-19 00:43:51
【问题描述】:

我有一个包含一些具体和抽象受保护方法的抽象类,并且我对这个抽象类进行了 PHPUnit 测试。

然后我有扩展抽象类并实现抽象受保护方法的类。

我很好奇测试子类是否返回他们需要从其他抽象的受保护方法返回的最聪明的方法。

我读过很多关于你不应该测试私有/受保护方法的文章,但我觉得这很尴尬,因为要获得整个受保护方法的代码覆盖率,我必须从抽象类测试中复制许多测试,这涉及生成许多​​模拟对象并设置它们的方法以返回特定值。

最终结果将是大量与其他类紧密耦合的测试。如果我更改了一个类,则对类的测试需要更改(完全可以),然后该类的无数模拟实现也需要更改。

归根结底,如果抽象类有效,那么我知道我的子对象也会有效,只要它的抽象受保护方法的实现返回预期值。

所以我想知道我是否忽略了一个模式。

在每个子类中重复测试似乎并不比测试子类是否正确实现了它们的接口更好。

【问题讨论】:

  • 我已经按照您的建议做了,实际上将测试移到了可以包含/需要到我的测试中的通用代码中。出于您提到的相同原因,我测试了抽象类。我只是做了相同的测试提取,而不必复制进行测试的代码。只需 REQUIRE() 包含测试的 PHP 文件,然后调用它们。
  • 那是建议。我从没想过拆分可重用的测试。我认为这可能是最明智的做法。

标签: unit-testing phpunit abstract-class


【解决方案1】:

您正在忽略一个模式。这将是Strategy Pattern。子对象的受保护方法应重构为它们自己的对象,并将受保护方法作为公共方法。然后,您将能够测试这些公共方法是否返回正确的内容。

您对基类的测试只需要更改以传入模拟对象。如果您的子类仅实现基抽象类的受保护方法。您可以从基类中删除抽象并让子类实现策略接口。

这将使您的设计更加灵活。由于其他原因,您可以轻松扩展基类,并且仍然可以使用所有以前的功能。

【讨论】:

  • 这不是我想的,但正是正确的答案。测试很尴尬,因为我的设计很差。谢谢。
猜你喜欢
  • 2013-12-05
  • 2012-01-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-20
  • 1970-01-01
相关资源
最近更新 更多