2

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

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

$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. 我希望它返回“作者姓名”,但测试错误表明这$signature是一个未定义的属性。

我尝试如上所述配置模拟但没有method()调用(认为expects()andwill()调用将应用于所有模拟方法)但仍然没有成功。

有任何想法吗?

此外,如果您知道关于 PHPUnit 模拟的好教程,我会很想看到它 - 该手册似乎假定了该特定领域的先前测试知识。

4

1 回答 1

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"
于 2013-02-19T20:22:18.480 回答