用 Mockery 模擬 Guzzle Response
紀錄一下Mockey 使用的方法class MessageTest extends TestCase
{
public function testGetMessage()
{
// 先做一個假的 client
$client = \Mockery::mock('GuzzleHttp\Client');
$client->shouldReceive('request')->andReturn('Yo');$message = new Message();// 把mock的client放進要測試的class內
$message->setClient($client);...
}
}class Message
{
private $client;public function setClient($client)
{
return $this->client = $client;
}public function getMessage($id)
{
...$response = $this->client->request('GET', $url, [
'headers' => $header,
'query' => $query
]);...
}
}
假如是返回 Stream 也可以使用下面的方法來 mock// 需要 use 這兩個
use GuzzleHttp\Psr7;
use GuzzleHttp\Psr7\Response;class ImageTest extends TestCase
{
public function testGetImageList()
{
$data = [
'id' => '135',
'url' => 'https://path/file.jpg',
'createdAt' => '2010-01-01 08:00:00',
];$stream = Psr7\stream_for(json_encode($data));
$response = new Response(200, [
'Content-Type' => 'application/json;charset=utf-8',
'Content-Length' => '200' // 我沒有算上面有多少字
], $stream);// 先做一個假的 client
$client = \Mockery::mock('GuzzleHttp\Client');
$client->shouldReceive('request')->andReturn($response);$image= new Image();// 把mock的client放進要測試的class內
$image->setClient($client);...
}// 如果想返回一張圖片
public function testGetImage()
{
// 讀取在 public 路徑下的一張圖片 dog.jpg
$img = fopen(public_path('dog.'), 'r');
$stream = stream_get_contents($img);
fclose($img);$response = new Response(200, [
'Content-Type' => 'application/json;charset=utf-8',
'Content-Length' => '30304'
], $stream);// 下面就都一樣
$client = \Mockery::mock('GuzzleHttp\Client');
$client->shouldReceive('request')->andReturn($response);$image= new Image();
$image->setClient($client);...
}}
參考資料
https://stackoverflow.com/questions/27506568/guzzlephp-mock-response-content