用 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