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