2013-02-12 74 views
1

我試圖存根亞馬遜的實例元數據類,因爲它調用的內部URL只能在EC2實例內工作,不能從外部調用。我的問題是,「發送」方法無法識別。 「get」方法雖然工作正常。這是錯誤Fatal error: Call to undefined method Stub\Amazon\StubInstanceMetadata::send() in ...etc, etcPHPUnit存根只適用於第一種方法

$stub = $this->getMockBuilder('Aws\Common\InstanceMetadata\InstanceMetadataClient') 
       ->disableOriginalConstructor() 
       ->getMock(); 

    $stub->expects($this->any()) 
     ->method('get') 
     ->will($this->returnValue($this)); 

    $stub->expects($this->any()) 
     ->method('send') 
     ->will($this->returnValue(json_encode(array('test' => 'value')))); 

編輯:這最終是兩個不同的問題的組合。第一個是@fab指出的那個。第二個是,要參考返回$此,PHPUnit的有它自己的方法,所以我應該這樣做:

$stub->expects($this->any()) 
     ->method('get') 
     ->will($this->returnSelf()); // don't use returnValue() here 

回答

1

我不知道原來的班級做,但它看起來像send實際上不是它的方法,而是通過魔術__call調用。所以,如果你想嘲笑它,你將不得不這樣做:

...->getMock(array('get', 'send')); 
+0

你是對的!這不是一個真正的方法,但是這個解決方案也不能工作:(我也試過通過'$ this-> setMethods(array('get','send'))'手動指定方法無濟於事。非常令人沮喪! – Julian 2013-02-12 19:41:32

+0

對,使用'MockBuilder'應該是'setMethods()'。如果這不起作用,我不知道,對不起。 – 2013-02-13 06:32:23

+0

使用setMethods()或 - > getMock(array('get', 'send'))只返回只有這些方法的類,如果你沒有提供setMethods()或者帶有方法的數組,默認情況下所有的公共方法都會被stubbed – qrazi 2013-02-13 07:37:28

相關問題