Mockery
先建立一個服務
- 先於
app
底下建立一個Services
資料夾
建立測試資料
- 於
Tests\Unit
底下建立一個Services
資料夾,在建立一個ClientTest.php
的檔案 - 建立一個
test_query()
的function - function 內建立連線且設定需送出與回傳的值
1 | $guzzleClient->shouldReceive('request')->andReturn( |
- 確認建立連線後,檢視所需得到的資料格式,在建立
ClientTest.php
的檔案同層建立result.txt
假資料 - 而後於檔案上方引入,並使用
1 | use Mockery as m; |
1 | $guzzleClient = m::mock(GuzzleClient::class); |
- 最後放入測試資料的格式驗證
1 | $this->assertArraySubset([ |
回到服務資料夾內建立連線檔案
- 建立連線的
Client
檔案,使用GuzzleHttp連線,並於建構子中依賴注入 - 建立
query()
透過key去發出request
,並將取回的資料進行json_decode()
,於最後透過laravel collection的方法,filter 出符合的值
1 | public function __construct(GuzzleClient $client) |
想要紀錄呼叫api次數
- 由於紀錄log是呼出去,因此需使用
spy
去監測紀錄 - 於服務資料夾下建立
Log.php
檔案,並建立info()
function
1 |
|
- 在測試檔案中加上log , 也於連線方法上引入
1 | $log = m::spy(Log::class); |
- 需在驗證連線上加上
once()
1 | $guzzleClient->shouldReceive('request')->andReturn( |
- 於測試程式最後加上
1 | $log->shouldHaveReceived('info')->with('xxxxxxxx')->once(); |
- 最後需在此方法之上加入
teardown()
function - 此意思是代表 在每個測試後執行,另外也可以只在整個測試類別執行一次的
1 | protected function tearDown():void |
- 最後在連線的建構子上加上
1 | public function __construct(GuzzleClient $client, Log $log) |
- query()加上
1 | $this->log->info('xxxxxxxx'); |
加上環境檔的key,使用依賴注入
- 於
Providers
資料夾內的AppServiceProvider
加上
1 | public function register() |
- 連線檔案的建構子加上key依賴注入
1 | public function __construct(GuzzleClient $client, Log $log, $key = null) |
- query()內也更改key的引入
1 | $this->log->info($this->key); |
- 測試檔案key的更改
1 | public function test_query() //this test failed |
為何要使用測試
- 寫測試不是為了驗證結果,而是為了驗證過程
- 要用什麼測試,假資料或是等等等,須自行摸索