摘要:本文主要聊一聊写测试时如何第三方数据。其实很简单,只需运用库请求代码,从本地读取数据。写测试是非常重要的,需要会使用和这两个基本库,官网是手册和手册。
本文主要聊一聊写测试时如何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手册。
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/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); 上次的访谈,介绍了下可爱的依云酱,回忆传送门。不...
阅读 3925·2021-11-24 10:46
阅读 1817·2021-11-16 11:44
阅读 2291·2021-09-22 16:02
阅读 1404·2019-08-30 15:55
阅读 1133·2019-08-30 12:46
阅读 568·2019-08-28 18:31
阅读 2764·2019-08-26 18:38
阅读 1096·2019-08-23 16:51