2012-10-13 32 views
14

Tôi có một lớp học tôi cần phải thử:mockery - call_user_func_array() dự kiến ​​tham số 1 là một callback hợp lệ

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); 
    } 
} 

Tôi đang sử dụng mockery 0.7.2

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

may thử nghiệm của tôi thất bại , do lỗi này

call_user_func_array() hy vọng tham số 1 là cuộc gọi lại hợp lệ, lớp 'Mockery \ Expec tation' không có một phương pháp 'xuất bản' trong /vendor/mockery/mockery/library/Mockery/CompositeExpectation.php trên đường dây 54

Tôi đã cố gắng để gỡ lỗi tôi thấy rằng các bài kiểm tra bị lỗi trong mã này

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

nơi
$ method = 'xuất bản'
$ args = array()
$ vọng là thể hiện của mockery \ đối tượng vọng()

Tôi đang sử dụng php 5.3.10 - bất kỳ ý tưởng gì là sai?

Trả lời

37

Điều này đang xảy ra vì bạn đang gán một kỳ vọng giả định cho $mediaPublisherMock, thay vì bản thân mô hình. Hãy thử thêm các phương pháp getMock đến cuối cuộc gọi đó, như:

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

hoặc chia mã thành hai dòng: $ mediaPublisherMock = \ Mockery :: mock ('MessagePublisher'); $ mediaPublisherMock> shouldReceive ('publish') -> withAnyArgs() -> times (3) -> andReturn (null); Đây là giải pháp của tôi. –

+0

Người đàn ông .... bạn là một người tiết kiệm cuộc sống. -> getMock() chính xác là những gì tôi đang thiếu trong 2 ngày –

0

Tôi tin rằng $ vọng nên lớp học của bạn, MessagePublisher

+0

Tôi đã kiểm tra hai lần - đó là mockery \ vọng, nó chứa _mock tài sản (mockery \ Mock) và _name = chuỗi "xuất bản" – mrok

2

vấn đề Ok giải quyết bằng cách sử dụng tiêu chuẩn PHPUnit Mock thư viện

này hoạt động:

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

Tại sao tôi đã không bắt đầu từ này;)

Các vấn đề liên quan