用 Mockery 模擬 Guzzle Response

平民百姓
4 min readMay 7, 2021

--

紀錄一下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

--

--