【问题标题】:Mockery - call_user_func_array() expects parameter 1 to be a valid callback嘲弄 - call_user_func_array() 期望参数 1 是一个有效的回调
【发布时间】:2012-10-04 07:38:58
【问题描述】:

我有一个需要模拟的课程:

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' 中没有方法 'publish' /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;
}

在哪里
$method = '发布'
$args = 数组()
$expectation 是 Mockery\Expectation 对象的实例 ()

我正在使用 php 5.3.10 - 知道有什么问题吗?

【问题讨论】:

    标签: php mocking phpunit silex


    【解决方案1】:

    发生这种情况是因为您将模拟期望分配给 $mediaPublisherMock,而不是模拟本身。尝试将 getMock 方法添加到该调用的末尾,例如:

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

    【讨论】:

    • 或将代码分成两行: $mediaPublisherMock = \Mockery::mock('MessagePublisher'); $mediaPublisherMock>shouldReceive('publish') ->withAnyArgs() ->times(3) ->andReturn(null);这是我的解决方案。
    【解决方案2】:

    使用标准 PhpUnit Mock 库解决的问题

    这行得通:

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

    为什么我没有从这个开始;)

    【讨论】:

      【解决方案3】:

      我相信 $expectation 应该是你的课程,MessagePublisher

      【讨论】:

      • 我检查了两次 - 它是 Mockery\Expectation,它包含属性 _mock (Mockery\Mock) 和 _name = string "publish"
      猜你喜欢
      • 2013-08-01
      • 1970-01-01
      • 2016-06-06
      • 1970-01-01
      • 2021-04-18
      • 2015-10-18
      • 2014-03-15
      • 1970-01-01
      • 2020-02-21
      相关资源
      最近更新 更多