解決Laravel的Facade在被Mock時不自動注入依賴的一種方法

栏目: PHP · 发布时间: 8年前

内容简介:解決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();

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

总开关

总开关

[美] 吴修铭 / 顾佳 / 中信出版社 / 2011-8 / 49.00元

当收音机经历从真空管收音机到半导体收音机,再到电晶体收音机的发展升级时,人们觉得自己的资讯来源美满得无可复加了。当约翰.洛吉.贝尔德发明了电视以后,在很长一段时间内,人们都认为电视就是他们所拥有的﹑也是所愿意拥有的最好的资讯媒介。 时至今日,互联网的震撼不亚于以往任何媒介,它给我们带来了最大的信息量,最便捷的自我表达,最迅速的沟通。互联网似乎比以往任何媒介都具有优越性。在互联网成为这个时代主......一起来看看 《总开关》 这本书的介绍吧!

HTML 压缩/解压工具
HTML 压缩/解压工具

在线压缩/解压 HTML 代码

Markdown 在线编辑器
Markdown 在线编辑器

Markdown 在线编辑器

HEX CMYK 转换工具
HEX CMYK 转换工具

HEX CMYK 互转工具