内容简介:解決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对象注入漏洞的新型利用方法
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
银行3.0:移动互联时代的银行转型之道
[澳]布莱特·金(Brett King) / 白 宫 施 轶 / 广东经济出版社 / 2014-12 / 88.00元
银行未来会怎样,银行下一步该怎么做?银行如何在客户行为变化、科技变化,以及新的非银行竞争者不断涌入等时代变化的形势下,在未来取得成功? 这是第一本透彻深入地全面呈现当今银行业的内外形势与状况的书,内容涉及技术变化、客户行为变化、涌现的外部竞争者,银行现有组织架构、流程模式、制度思维、人员结构、互动渠道、营销方式等。具体包括低网点化,ATM、网站、呼叫中心的落伍,以及智能手机、社交媒体、移动支......一起来看看 《银行3.0:移动互联时代的银行转型之道》 这本书的介绍吧!