应该使用哪种技术来测试 PHPUnit 中的抽象类功能?
我知道三种方法:
- 创建假子类(看起来很难看)
- 测试真正的子类之一
- 使用 getMockForAbstractClass() (与模拟的任务相矛盾;也不能存根非抽象方法)
根据单元测试概念,最好的方法是什么?
I know three approaches:
- Create fake subclass (looks ugly)
- Test one of real subclasses
- Use getMockForAbstractClass() (contradicts with mocks' mission; also can't stub not-abstract methods)
What the best way according unit test concept?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
我只会为从抽象类派生的具体类编写测试。如果您发现在其中重复测试,请编写一个超类并将重复的测试移动到那里,或者使用
getMockForAbstract
类来进行这些测试。因此,如果您有这样的事情:
我会为机械师和工程师提供一个测试类来测试他们的
doWork
实现,而不是他们的getName
功能,因为这是由抽象类。为此,我将编写一个自定义类,或者使用getMockForAbstractClass
,如 PHPUnit 手册中的示例所示:I would only write tests for concrete classes derived from the abstract class. If you find you are duplicating tests among them, write a superclass and move the duplicated tests there or use
getMockForAbstract
class for these.So if you had something like this:
I'd have a test class for Mechanic and Engineer testing their
doWork
implementation, but not theirgetName
functionality, because that is inherited by the abstract class. For that, I'd write a custom class then or usegetMockForAbstractClass
, as shown in the example in the PHPUnit Manual:这取决于抽象类的功能。当抽象类仅仅提供一些带有一堆模板方法的基本样板时,我将测试限制在具体的子类上。
当抽象类基本完成时,我将在与测试用例相同的文件中为测试创建一个具体的子类,或者使用模拟。请注意,
getMockForAbstractClass()
只是一个为您查找所有抽象方法的助手。没有什么可以阻止您使用getMock()
声明所有抽象方法和一些具体方法。正是出于这个原因,我在基本测试用例中重写了getMock()
,以便在调用父级方法之前合并所有抽象方法。It depends on how functional the abstract class is. When the abstract class is merely there to provide some basic boilerplate with a bunch of template methods, I limit my testing to the concrete subclasses.
When the abstract class is mostly complete I will either create a concrete subclass for the test in the same file as the test case or I will use a mock. Note that
getMockForAbstractClass()
is just a helper that finds all the abstract methods for you. There's nothing stopping you from declaring all the abstract methods plus some concrete ones withgetMock()
. For this very reason I overridegetMock()
in our base test case to merge in all the abstract methods before calling the parent.