内容简介:解決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对象注入漏洞的新型利用方法
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
程序员的自我修养
陈逸鹤 / 清华大学出版社 / 2017-5 / 49.00
程序员作为一个职业、也作为一个群体,正逐渐从幕后走向前台,并以他们自己的能力加速改变着世界,也改变着人们生活的方方面面。然而,对于程序员,特别是年轻程序员们来说,如何理解自己的职业与发展,如何看待自己的工作与生活,这些问题往往比那些摆在面前的技术难题更让他们难以解答。 这本书从一个成熟程序员、一名IT管理者的角度,以杂记的形式为大家分享关于国内程序员职业生涯、个人发展、编程中的实践与认知乃至......一起来看看 《程序员的自我修养》 这本书的介绍吧!