内容简介:解決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();
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
我用微软改变世界
保罗·艾伦 / 吴果锦 / 浙江人民出版社 / 2012-3 / 46.00元
《我用微软改变世界(微软联合创始人保罗•艾伦回忆录)》内容简介:1975年,两个从大学退学的男孩夜以继日地设计一款软件。其中一个男孩就是后来的世界首富比尔盖茨,而另外一个则作为盖茨背后的男人,一直生活在盖茨的阴影里,其实,他的人生经历远比盖茨更为传奇和丰富。 16岁,与比尔盖茨在顶级名校湖畔中学相遇,成为最佳拍档,无数趣事,无数闹腾,高呼“处男万岁”还不够,还得意扬扬把这话刻在碑上留给学弟们......一起来看看 《我用微软改变世界》 这本书的介绍吧!