应该使用哪种技术来测试 PHPUnit 中的抽象类功能?

发布于 2024-10-25 22:04:30 字数 157 浏览 2 评论 0原文

我知道三种方法:

  1. 创建假子类(看起来很难看)
  2. 测试真正的子类之一
  3. 使用 getMockForAbstractClass() (与模拟的任务相矛盾;也不能存根非抽象方法)

根据单元测试概念,最好的方法是什么?

I know three approaches:

  1. Create fake subclass (looks ugly)
  2. Test one of real subclasses
  3. Use getMockForAbstractClass() (contradicts with mocks' mission; also can't stub not-abstract methods)

What the best way according unit test concept?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

岛徒 2024-11-01 22:04:30

我只会为从抽象类派生的具体类编写测试。如果您发现在其中重复测试,请编写一个超类并将重复的测试移动到那里,或者使用 getMockForAbstract 类来进行这些测试。

因此,如果您有这样的事情:

abstract class Employee
{
    protected $name;
    public function getName()
    {
        return $this->name;
    }
    abstract function doWork();
    …
}

class Mechanic extends Employee
{
    public function doWork()
    {
        return // specific to Mechanic
    }
}

class Engineer extends Employee
{
    public function doWork()
    {
        return // specific to Engineer
    }
}

我会为机械师和工程师提供一个测试类来测试他们的 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:

abstract class Employee
{
    protected $name;
    public function getName()
    {
        return $this->name;
    }
    abstract function doWork();
    …
}

class Mechanic extends Employee
{
    public function doWork()
    {
        return // specific to Mechanic
    }
}

class Engineer extends Employee
{
    public function doWork()
    {
        return // specific to Engineer
    }
}

I'd have a test class for Mechanic and Engineer testing their doWork implementation, but not their getName functionality, because that is inherited by the abstract class. For that, I'd write a custom class then or use getMockForAbstractClass, as shown in the example in the PHPUnit Manual:

追星践月 2024-11-01 22:04:30

这取决于抽象类的功能。当抽象类仅仅提供一些带有一堆模板方法的基本样板时,我将测试限制在具体的子类上。

当抽象类基本完成时,我将在与测试用例相同的文件中为测试创建一个具体的子类,或者使用模拟。请注意,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 with getMock(). For this very reason I override getMock() in our base test case to merge in all the abstract methods before calling the parent.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文