2016-05-15 86 views
0

我对PHP Mockery框架颇为陌生,并试图在模拟的服务请求函数上测试多个函数。不同的函数使用不同的值发送相同的变量名称。我想测试一下,以确保每个案例都打到嘲笑类。我可以用我的模拟函数接收多个参数,并将它们中的每一个返回到测试函数?返回参数被发送到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(); 

谢谢!

回答

2

您可以使用回调来执行此操作: 以下示例适用于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

+1

如果您需要模拟的东西,返回基于参数值,而不仅仅是测试参数是你所期望记得'andReturnUsing()'不会接受像提到的提问者封闭。它传递给了该方法的参数。 – ToothlessRebel