19

私はモックする必要があるクラスを持っています:

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

Mockery 0.7.2 を使用しています

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

残念ながら、このエラーのために私のテストは失敗しました

call_user_func_array() は、パラメーター 1 が有効なコールバックであることを期待します。クラス 'Mockery\Expectation' には、54 行目の /vendor/mockery/mockery/library/Mockery/CompositeExpectation.php にメソッド 'publish' がありません。

デバッグしようとしましたが、このコードでテストが失敗することがわかりました

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


$method = 'publish'
$args = array()
$expectation は Mockery\Expectation オブジェクトのインスタンス ( )

私はphp 5.3.10を使用しています - 何が問題なのですか?

4

3 に答える 3

59

これは$mediaPublisherMock、モック自体ではなく、モックの期待値を に割り当てているために発生しています。getMock次のように、その呼び出しの最後にメソッドを追加してみてください。

$mediaPublisherMock = \Mockery::mock('MessagePublisher')
    ->shouldReceive('publish')
    ->withAnyArgs()
    ->times(3)
    ->andReturn(null)
    ->getMock();
于 2012-10-17T10:07:18.280 に答える
2

標準の PhpUnit Mock ライブラリを使用して問題を解決しました

これは機能します:

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

なぜ私はこれから始めなかったのですか;)

于 2012-10-13T21:26:21.577 に答える
0

$expectation はあなたのクラス、MessagePublisher であるべきだと思います

于 2012-10-13T20:52:22.857 に答える