次の関数を持つクラスがあります:
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を使用)から取得されます
提案されているように使用する方が良いと思います http://docs.guzzlephp.org/en/stable/testing.html#mock-handler
それを適切に行うための最もエレガントな方法のように見えるので。
皆さん、ありがとうございました
モックされた応答は特に何かである必要はありません。コードは、それが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);