摘要:本文主要聊一聊寫測試時如何第三方數據。其實很簡單,只需運用庫請求代碼,從本地讀取數據。寫測試是非常重要的,需要會使用和這兩個基本庫,官網是手冊和手冊。
本文主要聊一聊寫測試時如何mock第三方json api數據。
在開發時經常會調用第三方API接口,抓取json api data后進行加工處理,那如何寫測試呢?如何mock數據呢?
這里舉一個簡單例子,AccountController::class調用Connector::class, Connector::class 會調用第三方 json api來讀取數據,代碼如下:
getConnector(); return $connector->call("accounts"); } public function show(string $id) { $connector = $this->getConnector(); return $connector->call("accounts/" . $id); } private function getConnector() { if (!$this->connector) { $this->connector = new Connector(); } return $this->connector; } } namespace AppHttpControllers; use GuzzleHttpClient; use IlluminateHttpRequest; class Connector { public function call(string $path): array { $client = new Client(); $response = $client->request(Request::METHOD_GET, config("app.url") . DIRECTORY_SEPARATOR . $path); return GuzzleHttpjson_decode($response); } }
代碼很簡單,但是場景卻經常會遇到,關鍵是如何mock數據而不是發送真實http請求數據。其實很簡單,只需運用Mockery庫mock請求代碼,從本地讀取fixtures數據。
首先是在tests/fixtures文件夾下準備下fixtures數據,這些json文件的數據都是真實的接口返回的數據,可以先用postman或其他工具拿到真實數據, simple_dataset 是dataset的名稱,可以自定義,一般項目里都會有一個或多個dataset數據集,vendor 是第三方名稱,自定義:
然后寫上AccountControllerTest::class:
call(Request::METHOD_GET, "api/v1/accounts"); dump($response->json()); } public function testShow() { $response = $this->call(Request::METHOD_GET, "api/v1/accounts/1"); dump($response->json()); } }
然后寫上路由:
Route::group(["prefix" => "v1"], function () { $resources = [ "accounts" => [AppHttpControllersAccountController::class => ["index", "show"]], ]; foreach ($resources as $name => $controllers) { foreach ($controllers as $fqcn => $actions) { Route::resource($name, $fqcn, ["only" => $actions]); } } });
既然用了全局類名AppHttpControllersAccountController::class,那就別忘了在app/Providers/RouteServiceProvider::mapApiRoutes 抹掉namespace:
protected function mapApiRoutes() { Route::prefix("api") ->middleware("api") ->group(base_path("routes/api.php")); }
最后同時在TestCase::class寫上mock數據代碼:
getRelativePathname(), 0, -5); // remove ".json" // mock Connector::call("accounts/1") && Connector::call("accounts") $mock->shouldReceive("call")->with($api_name)->andReturn(GuzzleHttpjson_decode(file_get_contents($file->getRealPath()), true)); } } }
這樣執行測試時就實現了讀取本地的真實json數據,而不用發起真實的http請求。兩個測試的response數據的確來源于本地json文件的數據:
其實,就是一句話,寫測試時如果調用了第三方 json api 讀取數據時,使用Mockery庫去mock數據,數據來源于本地文件夾的數據,且是真實有效的數據。至于mock部分的代碼想咋寫就咋寫。同時,上面代碼里還需要注意一點是,由于Connector::class是AccountController::class 的 hard dependency,別忘了加上 overload, 代碼里已經添加鏈接,可看官網介紹。
寫測試是非常重要的,需要會使用PHPUnit和Mockery這兩個基本庫,官網是PHP手冊和Mockery手冊。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/25564.html
摘要:最近在維護一個三年前的舊代碼,用的是框架。單元測試和語言并發控制實際上是個蛋疼的問題,夸張一點說,當時的并不能特別輕松地實現并發,甚至不能實現并發。語言的功能之一就是自帶單元測試。用語言之前,我的習慣是不寫單元測試。 最近在維護一個三年前的舊代碼,用的是laravel框架。 從某些方面來講,這個代碼算是比較標準為了實現在規定的時間內完成相關功能,同時程序員水平不高、經過大量優化之后,變...
摘要:寫一個,的是,的內容參照寫測試代碼三,然后寫上很明顯,這里測試的是,即和,是一個自定義的,主要功能就是實現了全部,并保存在文件里作為。 本文主要探討寫laravel integration/functional test cases時候,如何assert。前面幾篇文章主要聊了如何reseed測試數據,mock數據,本篇主要聊下assert的可行實踐,盡管laravel官方文檔聊了Tes...
摘要:用也有三四個月了,雖然是兼職開發,但是使用的頻率非常之高,畢竟是產品化的一個項目。第二階段數據庫和開發了比較多的功能之后,會發現需要大量的測試數據,這時候和就該大顯身手了。 用Laravel也有三四個月了,雖然是兼職開發,但是使用的頻率非常之高,畢竟是產品化的一個項目。在這期間,也踩了無數的坑,走了很多彎路,所以準備把最近的感悟記錄下來,方便后來者。 第一階段:簡單的增刪改查 這是最...
摘要:如何在實戰中能應用上設計模式,我思考了接近兩年。最開始我接觸設計模式,出發點就是為了重構代碼,以便更好的復用和測試。也就是說基本是被當成一組靜態函數使用的。 MVC是Laravel自帶的,大家也多少都會用一些。今天我們不談MVC,談一些大中型項目的設計思路。 前言 雖然標題說是設計模式,但是我并不打算去講什么singleton、strategy、factory,不知道為什么,每次看到...
摘要:上次的訪談,介紹了下可愛的依云醬,回憶傳送門。這里簡單地介紹下龍女仆,全名小林家的龍女仆,為什么介紹這部劇呢因為設計獅顏值同學也安利了這部。劇情簡介在獨身又勞累的小林劃重點一名程序員身邊突然出現的穿著女仆服裝的美少女托爾。 showImg(https://segmentfault.com/img/bVR6p5?w=900&h=385); 上次的訪談,介紹了下可愛的依云醬,回憶傳送門。不...
閱讀 3920·2021-11-24 10:46
閱讀 1816·2021-11-16 11:44
閱讀 2289·2021-09-22 16:02
閱讀 1401·2019-08-30 15:55
閱讀 1131·2019-08-30 12:46
閱讀 566·2019-08-28 18:31
閱讀 2762·2019-08-26 18:38
閱讀 1094·2019-08-23 16:51