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

时间:2011-03-23 14:07:04

标签: php unit-testing phpunit abstract-class

我知道三种方法:

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

2 个答案:

答案 0 :(得分:4)

我只会为从抽象类派生的具体类编写测试。如果您发现它们正在重复测试,请编写一个超类并在那里移动重复的测试,或者使用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实现的Mechanic和Engineer,但不测试他们的getName功能,因为它是由抽象类继承的。为此,我会编写一个自定义类或使用getMockForAbstractClass,如PHPUnit手册中的示例所示:

答案 1 :(得分:1)

这取决于抽象类的功能。当抽象类只是为了提供一些模板方法的基本样板文件时,我将测试限制在具体的子类中。

当抽象类大部分完成时,我将在与测试用例相同的文件中为测试创建一个具体的子类,或者我将使用mock。请注意,getMockForAbstractClass()只是一个帮助程序,可以为您找到所有抽象方法。没有什么可以阻止你宣布所有抽象方法加上getMock()的具体方法。出于这个原因,我在基本测试用例中覆盖getMock()以在调用父项之前合并所有抽象方法。