2013-02-12 77 views
2

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

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

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

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

正如你可以看到我嘲笑的作用对象,然后将其配置为返回一个字符串(“AUTHORNAME”)时__get()被调用。我测试的Post对象是指$this->author->signature。我期待它返回'authorname',但是测试错误出来说$signature是一个未定义的属性。

我尝试配置上述模拟,但没有拨打method()(认为expects()will()调用将适用于所有模拟方法),但仍然没有成功。

任何想法?另外,如果你知道关于PHPUnit mocks的一个很好的教程,我会热衷于看到它 - 手册似乎假设在这个特定领域中有先验知识。

+0

或许将签名法作为一个匿名函数,你模仿的对象,然后从该匿名函数返回“AUTHORNAME”。这最终会与使用我认为的will()方法相同。 – qrazi 2013-02-12 08:21:09

回答

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" 
+0

谢谢布拉姆,不错。 – 2013-07-05 02:41:13