内容简介:解決Laravel的Facade在被Mock時不自動注入依賴的一種方法
由於集成了Mockery,Laravel的Facade對單元測試非常友好,只需要一行代碼就能實現mocking。
例如,測試目標方法中調用了訂單 工具 類的一個方法,在使用依賴注入的方式時,需要用三行代碼實現對這個方法的mocking:
$fakeOrderTool = m::mock(\App\Tool\Order::class); $fakeOrderTool->shouldReceive('getById')->once()->with($id)->andReturn($fakeOrder); $this->app->instance(\App\Tool\Order::class, $fakeOrderTool);
而用Facade是這樣的:
OrderFacade::shouldReceive('getById')->once()->with($id)->andReturn($fakeOrder);
當測試目標方法也屬於訂單工具類時,需要部分mock這個類,所以還要加上一行:
OrderFacade::makePartial();
但如果訂單工具類的構造方法里有需要注入的依賴關係,這里並不會被執行。所以我在工具類基類里封裝了一個方法,用反射機制實現手工注入依賴關係:
/** * 注入依赖,用于单元测试 * * @return void * @author donieli * @since 5 * @version 5 */ public function injectDependencies() { $reflector = new \ReflectionClass(get_class($this)); $params = $reflector->getConstructor()->getParameters(); $args = []; foreach ($params as $param) { $paramClass = $param->getClass(); if (empty($paramClass)) { throw new \Exception('Dependency named '.$param->getName().' cannot be injected.'); } $instance = app()->make($paramClass->getName()); $args[] = $instance; } call_user_func_array([$this, '__construct'], $args); }
然後就可以這樣處理:
OrderFacade::shouldReceive('getById')->with($id)->once()->andReturn($fakeOrder); OrderFacade::makePartial(); OrderFacade::injectDependencies();
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- MySQL 及 SQL 注入与防范方法
- WAF机制及绕过方法总结:注入篇
- MSSQL注入两种执行命令的方法
- Spring注入Date类型的三种方法总结
- Nginx 防止SQL注入、XSS攻击的实践配置方法
- 技术分享 | 一种针对PHP对象注入漏洞的新型利用方法
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
博客秘诀:超人气博客是怎样炼成的
Darren Rowse、Chris Garrett / 向怡宁 / 人民邮电出版社 / 201005 / 39.00元
作为Web 2.0的新生事物的博客,如今已蓬勃发展,呈燎原之势,业已成为许多人的一种生活方式。中国从事博客写作的人数已达千万级,各类博客网站不可胜数。 然而,为什么有的博客人气鼎盛,拥趸众多,有的博客却门前冷落,少人问津呢?究竟应该怎样写好自己的博客,才能让它吸引更多访客的关注呢?博客网站还能为我做什么呢? 本书的两位作者长期主持知名博客站点ProBlogger.net,指导了成千上万......一起来看看 《博客秘诀:超人气博客是怎样炼成的》 这本书的介绍吧!
JS 压缩/解压工具
在线压缩/解压 JS 代码
RGB HSV 转换
RGB HSV 互转工具