web-dev-qa-db-ja.com

PHPUnitとGuzzleからのモックリクエスト

次の関数を持つクラスがあります:

public function get(string $uri) : stdClass
{
    $this->client = new Client;
    $response = $this->client->request(
        'GET',
        $uri,
        $this->headers
    );

    return json_decode($response->getBody());
}

PHPUnitからリクエストメソッドをモックするにはどうすればよいですか?さまざまな方法を試しましたが、常に指定されたURIに接続しようとします。

私はで試しました:

    $clientMock = $this->getMockBuilder('GuzzleHttp\Client')
        ->setMethods('request')
        ->getMock();

    $clientMock->expects($this->once())
        ->method('request')
        ->willReturn('{}');

しかし、これはうまくいきませんでした。私に何ができる?空になるように応答をモックする必要があります。

ありがとう

PD:クライアントは(GuzzleHttp\Clientを使用)から取得されます

5
themazz

提案されているように使用する方が良いと思います http://docs.guzzlephp.org/en/stable/testing.html#mock-handler

それを適切に行うための最もエレガントな方法のように見えるので。

皆さん、ありがとうございました

5
themazz

モックされた応答は特に何かである必要はありません。コードは、それがgetBodyメソッドを持つオブジェクトであることを想定しているだけです。したがって、stdClassを使用して、json_encodedオブジェクトを返すgetBodyメソッドを使用できます。何かのようなもの:

$jsonObject = json_encode(['foo']);
$uri = '/foo/bar/';

$mockResponse = $this->getMockBuilder(\stdClass::class)->getMock();

mockResponse->method('getBody')->willReturn($jsonObject);

$clientMock = $this->getMockBuilder('GuzzleHttp\Client')->getMock();

$clientMock->expects($this->once())
    ->method('request')
    ->with(
        'GET', 
        $uri,
        $this->anything()
    )
    ->willReturn($mockResponse);

$result = $yourClass->get($uri);

$expected = json_decode($jsonObject);

$this->assertSame($expected, $result);
0
duncan