2012-10-13 31 views
14

我有一個類我需要模擬:嘲弄 - call_user_func_array()預計參數1是一個有效的回調

class MessagePublisher 
{ 
    /** 
    * @param \PhpAmqpLib\Message\AMQPMessage $msg 
    * @param string $exchange - if not provided then one passed in constructor is used 
    * @param string $routing_key 
    * @param bool $mandatory 
    * @param bool $immediate 
    * @param null $ticket 
    */ 
    public function publish(AMQPMessage $msg, $exchange = "", $routing_key = "", $mandatory = false, $immediate = false, $ticket = null) 
    { 
     if (empty($exchange)) { 
      $exchange = $this->exchangeName; 
     } 

     $this->channel->basic_publish($msg, $exchange, $routing_key, $mandatory, $immediate, $ticket); 
    } 
} 

我使用嘲弄0.7.2

$mediaPublisherMock = \Mockery::mock('MessagePublisher') 
    ->shouldReceive('publish') 
    ->withAnyArgs() 
    ->times(3) 
    ->andReturn(null); 

不幸的是我的測試失敗,由於這種錯誤

call_user_func_array()預計參數1是一個有效的回調, 類「嘲笑\ EXPEC塔季翁」沒有一個方法‘在 發佈’/vendor/mockery/mockery/library/Mockery/CompositeExpectation.php 上線54

我試圖調試我發現,測試,在此代碼

失敗
public function __call($method, array $args) 
{ 
    foreach ($this->_expectations as $expectation) { 
     call_user_func_array(array($expectation, $method), $args); 
    } 
    return $this; 
} 

其中
$方法= '發佈'
的$ args =陣列()
$期望是嘲笑\期望對象()

的實例

我使用PHP 5.3.10 - 任何想法是什麼錯?

回答

37

發生這種情況是因爲您正在爲$mediaPublisherMock指定一個模擬期望值,而不是模擬本身。嘗試添加getMock方法是調用結束,如:

$mediaPublisherMock = \Mockery::mock('MessagePublisher') 
    ->shouldReceive('publish') 
    ->withAnyArgs() 
    ->times(3) 
    ->andReturn(null) 
    ->getMock(); 
+2

或拆分代碼分成兩行: $ mediaPublisherMock = \ Mockery :: mock('MessagePublisher'); $ mediaPublisherMock> shouldReceive('publish') - > withAnyArgs() - > times(3) - > andReturn(null); 這是我的解決方案。 –

+0

男人....你是一個救星。 - > getMock()正是我錯過了2天 –

0

我相信$預期應該是你的類,MessagePublisher

+0

我查了兩次 - 這是嘲弄\期望,它包含屬性_mock(嘲弄\模擬)和_name =字符串「發佈」 – mrok

2

使用標準PHPUnit的模擬庫

這個工程解決好的問題:

$mediaPublisherMock = $this->getMock('Mrok\Model\MessagePublisher', array('publish'), array(), '', false); 
$mediaPublisherMock->expects($this->once()) 
    ->method('publish'); 

爲什麼我沒想到從此開始;)

相關問題