Laravel 5.6 模拟 Guzzle 响应

Rob*_*tin 3 phpunit laravel-5 guzzle6

我正在尝试模拟来自特定 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;
    }
}
Run Code Online (Sandbox Code Playgroud)

测试看起来像这样(再次编辑)......

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

     ...
}
Run Code Online (Sandbox Code Playgroud)

此时测试返回“Call to a member function getBody on null”;

如何测试 guzzle 调用的 getBody 响应?

先感谢您...

Har*_*rry 5

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

http://docs.guzzlephp.org/en/stable/testing.html

因此,您不必嘲笑 guzzle 客户端,而是创建一个如下所示的客户端:

public function someTest() {

    $mock = new MockHandler([
        new Response(200, [], 'The body!'),
        // Add more responses for each response you need
    ]);

    $handler = HandlerStack::create($mock);
    $client = new Client(['handler' => $handler]);

    $someClass = new SomeClass($client);

    $response = $someClass->makeRequest();

    $body = $response->getBody();

    $this->assertSame('The body!', $body);
}
Run Code Online (Sandbox Code Playgroud)