Laravel 5 Laravel 5.6模拟狂饮反应

Laravel 5 Laravel 5.6模拟狂饮反应,laravel-5,phpunit,guzzle6,Laravel 5,Phpunit,Guzzle6,我试图模仿来自特定api的狂饮响应 为简洁起见,我的控制器代码如下所示: class SomeClass { private $guzzle; public function __construct(\GuzzleHttp\Client $guzzle) { $this->guzzle = new $guzzle(); } public function makeRequest(){ $client = $this-&

我试图模仿来自特定api的狂饮响应

为简洁起见,我的控制器代码如下所示:

class SomeClass
{

    private $guzzle;

    public function __construct(\GuzzleHttp\Client $guzzle) {
        $this->guzzle = new $guzzle();
    }

    public function makeRequest(){

        $client = $this->guzzle;

        $url = 'http//somerurl';
        $options = [];

        $response = $client->request('POST', $url, $options);    

        return $response;
    }
}
这个测试看起来又像这样了

public function someTest(){

     $mock = $this->createMock(\GuzzleHttp\Client::class);

     $mock->method('request')->willReturn([
         'response' => 'somedata'
     ]);

     $someClass = new $SomeClass($mock);

     $response = $someClass->makeRequest();

     $body = $response->getBody();

     ...
}
此时,测试返回对成员函数getBody的调用,返回null

如何测试guzzle调用的getBody响应


提前感谢您…

使用Guzzle进行测试的一种方法是配置MockHandler

因此,您不必嘲笑guzzle客户端,而是创建了这样一个客户端:

公共功能测试{ $mock=新的MockHandler[ 新的回应200,[],“身体!”, //为您需要的每个响应添加更多响应 ]; $handler=HandlerStack::创建$mock; $client=新客户端['handler'=>$handler]; $someClass=新的someClass$客户端; $response=$someClass->makeRequest; $body=$response->getBody; $this->assertSame'thebody!',$body; }
使用Guzzle进行测试的一种方法是配置MockHandler

因此,您不必嘲笑guzzle客户端,而是创建了这样一个客户端:

公共功能测试{ $mock=新的MockHandler[ 新的回应200,[],“身体!”, //为您需要的每个响应添加更多响应 ]; $handler=HandlerStack::创建$mock; $client=新客户端['handler'=>$handler]; $someClass=新的someClass$客户端; $response=$someClass->makeRequest; $body=$response->getBody; $this->assertSame'thebody!',$body; } MockHandler要求您“排队”响应,这意味着您需要知道外部API调用的顺序。我更进一步,将MockHandler包装在另一个处理程序中,如果没有人在等待的话,可以在最后一刻将虚拟响应塞进它。看

只需在测试中使用该特性,并调用$this->mockGuzzleResponses;来自测试类的设置方法。此时,所有打算通过Guzzle的请求都可以通过$guzzleRequestLog属性进行断言,所有响应都可以通过调用$this->guzzleHandler->appendRequestInterface进行模拟;在你考试的开始

只需确保代码中Guzzle的所有实现都是通过appClient::class helper而不是新客户机实例化的。否则绑定覆盖将不会生效。这可能是您之前遇到的问题。

MockHandler要求您“排队”响应,这意味着您需要知道外部API调用的顺序。我更进一步,将MockHandler包装在另一个处理程序中,如果没有人在等待的话,可以在最后一刻将虚拟响应塞进它。看

只需在测试中使用该特性,并调用$this->mockGuzzleResponses;来自测试类的设置方法。此时,所有打算通过Guzzle的请求都可以通过$guzzleRequestLog属性进行断言,所有响应都可以通过调用$this->guzzleHandler->appendRequestInterface进行模拟;在你考试的开始


只需确保代码中Guzzle的所有实现都是通过appClient::class helper而不是新客户机实例化的。否则绑定覆盖将不会生效。这可能是您之前的问题。

然后呢?这个代码到哪里去了?这与我试图在我编写的代码中实现的目标有什么关系?代码在测试中存在。您正在创建响应,而不是嘲笑它。如果您想使用phpunit进行模拟,那么您需要执行$mock->method'request'->willreturnnewresponse200,[],'hello';相反,它不起作用了。和以前一样的错误,然后呢?这个代码到哪里去了?这与我试图在我编写的代码中实现的目标有什么关系?代码在测试中存在。您正在创建响应,而不是嘲笑它。如果您想使用phpunit进行模拟,那么您需要执行$mock->method'request'->willreturnnewresponse200,[],'hello';相反,它不起作用了。与以前完全相同的错误。