内容简介:解決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对象注入漏洞的新型利用方法
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。