返回参数被发送到 Mockery 模拟函数?

Posted

技术标签:

【中文标题】返回参数被发送到 Mockery 模拟函数?【英文标题】:Return arguments being sent to a Mockery mocked function? 【发布时间】:2016-09-11 03:14:12 【问题描述】:

我对 php Mockery 框架相当陌生,并尝试在模拟的服务请求函数上测试多个函数。不同的函数发送具有不同值的相同变量名。我想测试以确保每个案例都在模拟类中。我可以使用我的模拟函数接收多个参数并将它们中的每一个都返回给测试器函数吗?

要测试的功能:

    public function doSomething() 
    $result = $this->serviceRequest('stuff', '/url', []);
    return $result;

测试功能的伪代码:

public function testDoSomething() 

    $service_mock = $this->mockService();
    $this->assertEquals($service_mock->doSomething(), $returnedArgs);

理想情况下,我希望将这三个参数发送到模拟,将它们与模拟的andReturn() 或类似的东西一起在原始测试方法中断言(以验证它们被发送到模拟)。有没有一种好方法可以做到这一点,或者我缺少一种常见的做法?

现在,我的模拟看起来类似于这个伪代码(并且这 3 个参数正在关闭 $args 中进行验证):

        $client->shouldReceive('serviceRequest')->withArgs($args)->once()->andReturnUsing($args)->getMock();

谢谢!

【问题讨论】:

【参考方案1】:

您可以使用回调来执行此操作: 下面的示例改编自 Mockery 文档,虽然它使用它作为引用传递的示例,但它可以用于任何自定义期望。

   $m->shouldReceive('insert')->with(
    \Mockery::on(function(&$data) use($logger) 
        if (!is_array($data)) return false;
        $data['_id'] = 123;
        $logger->logParameters('insert', $data);
        return true;
    ),
    \Mockery::any()
);

http://docs.mockery.io/en/latest/reference/pass_by_reference_behaviours.htm

【讨论】:

如果您需要模拟基于参数返回值的东西,而不仅仅是测试参数是否是您所期望的,请记住andReturnUsing() 确实接受像提问者提到的那样的闭包。它传递了给方法的参数。

以上是关于返回参数被发送到 Mockery 模拟函数?的主要内容,如果未能解决你的问题,请参考以下文章

Mockery 的 andReturn() 执行方法,而不是模拟返回值

如何使用 Mockery 模拟构造函数

回调函数

如何使用 mockery 来模拟 httpclient

你如何在 GoLang 的模拟中模拟错误返回值?

什么是形参和实参?参数传递的方式都有哪些?