PHPUnit和Abstract类:如何测试接受参数和其他具体方法的具体构造函数

时间:2015-01-07 20:13:53

标签: php unit-testing phpunit abstract-class

我有一个非常简单的类,如下所示:

abstract class Person
{
    private $id;
    private $createdOn;

    // ... More private properties

    protected $unfound = array();

构造函数对传递的数组$ data执行foreach,并使用正确的方法将值分配给属性。 如果该方法不存在,那么将密钥添加到受保护的数组中以保留它的跟踪(我称之为$ unfound,只是为了原始!)。

    public function __construct($data)
    {
        foreach ($data as $field => $value)
        {
            $method = 'set' . ucfirst($field);

            if (method_exists($this, $method))
            {
                $this->$method($value);
            }
            else
            {
                $this->unfound[] = $field;
            }
        }
    }

设置属性值的方法列表

    public function setId($id) {
        $this->id = $id;
    }

    public function setCreatedOn($createdOn) {
        $this->createdOn = $createdOn;
    }

获取这些指定值的方法列表

    public function getId() {
        return $this->id;
    }

    public function getCreatedOn() {
        return $this->createdOn;
    }
} // END of the class

如您所见,该类没有执行任何复杂的任务:它接受类似

的数组
array(
    'id' => 4,
    'createdOn' => '2015-01-07 20:50:00',
    'unknownVar' => 'mah'
    // ... Other properties to set
    );

因此,类循环遍历数组并使用键调用正确的方法来设置值。我认为没有什么复杂的。

相反,更复杂的是测试它。

由于它是一个抽象类,我不能直接实例化它,但我必须嘲笑它​​。

我的问题是我无法向构造函数传递正确的参数来测试值分配是否正确完成。

我试过使用类似的东西:

public function testPerson()
{
   $abstractClass = '\My\Namespace\Person';

    $testData = array(
        'id' => 1,
        'createdOn' => '2015-01-07 19:52:00',
        'unfound' => 'Inexistent method'
        );

   $methods = array(
      'getId',
      'setId'
      );

    $mock = $this->getMockBuilder($abstractClass)
        ->setConstructorArgs(array($testData))
        ->setMethods($methods)
        ->getMockForAbstractClass();

    $this->assertEquals($testData['id'], $mock->getId());
}

在testPerson()中,$ methods变量不包含我需要的所有方法,但是对于测试的测试(请原谅我玩文字!:))我认为它们已经足够了。

但PHPUnit告诉我:

Failed asserting that null matches expected 1.

似乎没有调用构造函数,如果代码覆盖率告诉我方法被调用。

是否有人可以帮助我了解正在发生的事情以及如何测试这门课程?

谢谢!

1 个答案:

答案 0 :(得分:3)

解决方案非常简单:删除$methods变量并调用setMethods($methods)解决了问题!

实际上,调用setMethods()“存根”那些没有设置正确固定值的方法被设置为null(我从测试结果中收到的值)。 / p>

我测试的方法是残留的而其他方法没有。

因此print_r($mock)显示其他值已正确设置。

这么简单但很难找到! 无论如何,谢谢你让我思考,所以我解决了问题并提出了问题!