如何访问PHPUnit模拟对象上的重载属性?

时间:2013-02-12 04:43:42

标签: unit-testing mocking phpunit

使用PHPUnit模拟对象时,如何访问通常通过重载访问的对象属性,即通过__get()

例如,在下面的代码中,我正在测试一个Post对象。每个帖子都有一个作者,类型为Role。每个角色都有一个Signature属性。

$author = $this->getMockBuilder('App_Model_Domain_Role')
        ->disableOriginalConstructor()
        ->getMock();        

$author->expects($this->any())
        ->method('__get')
        ->will($this->returnValue('authorname'));

如您所见,我模拟了Role对象,然后将其配置为在调用__get()时返回一个字符串('authorname')。我正在测试的Post对象引用$this->author->signature。我希望它返回'authorname',但是测试错误说明$signature是一个未定义的属性。

我尝试配置上面的模拟,但没有method()调用(认为expects()will()调用将适用于所有模拟方法)但仍然没有成功。< / p>

有什么想法吗?

另外,如果你知道关于PHPUnit模拟的一个很好的教程我很想看到它 - 手册似乎假设在这个特定领域的先前的测试知识。

1 个答案:

答案 0 :(得分:2)

我尝试了与你相同的代码,它对我有用。我的PHPUnit版本是3.7.12。你使用的是哪个版本?如果您运行的是旧版本,则可以尝试升级。

public function testMockingMagicGetter()
{
    $myMock = $this->getMockBuilder('MyClass')
        ->disableOriginalConstructor()
        ->getMock();
    $myMock
        ->expects($this->any())
        ->method('__get')
        ->will($this->returnValue('authorname'));
    var_dump($myMock->signature);
    var_dump($myMock->dummy);
    var_dump($myMock->someprop);
}

结果:

string(10) "authorname"
string(10) "authorname"
string(10) "authorname"