2012-10-13 5 views
14

Ich habe eine Klasse I verspotten muß:Mockery - call_user_func_array() erwartet 1 Parameter ein gültiger Rückruf sein

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

Ich bin mit Mockery 0.7.2

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

leider meinen Tests nicht bestanden aufgrund dieses Fehlers

call_user_func_array() erwartet Parameter 1 ein gültiger Rückruf zu sein, Klasse ‚Mockery \ Expec tation in /vendor/mockery/mockery/library/Mockery/CompositeExpectation.php on line 54

Ich habe veröffentlichen '‘kein Verfahren hat' zu debuggen versuche ich festgestellt, dass Tests in diesem Code nicht

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

wo
$ method = 'veröffentlichen'
args $ = array()
$ Erwartung ist Instanz Mockery \ Expectation-Objekt()

Ich benutze PHP 5.3.10 - irgendeine Idee, was ist los?

Antwort

37

Dies passiert, weil Sie eine Scheinerwartung an $mediaPublisherMock statt der Mock selbst zuweisen. Versuchen Sie, die getMock Verfahren bis zum Ende dieses Anrufs, wie:

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

oder spaltete sich die Code in zwei Zeilen: $ mediaPublisherMock = \ Mothery :: mock ('MessagePublisher'); $ mediaPublisherMock> shouldReceive ('publish') -> withAnyArgs() -> mal (3) -> andReturn (null); Das war meine Lösung. –

+0

Man .... du bist ein Lebensretter. -> getMock() ist genau das, was ich seit 2 Tagen vermisse –

0

Ich glaube $ Erwartung Ihre Klasse sein sollte, MessagePublisher

+0

Ich habe zweimal - es ist Mockery \ Erwartung, es enthält Eigenschaft _mock (Mockery \ Mock) und _name = string „veröffentlichen“ – mrok

2

Ok Problem gelöst, indem unter Verwendung von Standard PHPUnit Mock Bibliothek

Dies funktioniert:

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

Warum ich nicht von diesem gestartet wurde;)

Verwandte Themen