2013-02-12 92 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