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

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

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

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

查看所有标签

猜你喜欢:

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

Wireshark网络分析就这么简单

Wireshark网络分析就这么简单

林沛满 / 人民邮电出版社 / 2014-11-6 / 39.00

Wireshark可能是世界上最好的开源网络包分析器,能在多种平台上(比如Windows、Linux和Mac)抓取和分析网络包,在IT业界有着广泛的应用。 《Wireshark网络分析就这么简单》采用诙谐风趣的手法,由浅入深地用Wireshark分析了常见的网络协议,读者在学习Wireshark的同时,也会在不知不觉中理解这些协议。作者还通过身边发生的一些真实案例,分享了Wireshark的......一起来看看 《Wireshark网络分析就这么简单》 这本书的介绍吧!

CSS 压缩/解压工具
CSS 压缩/解压工具

在线压缩/解压 CSS 代码

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

html转js在线工具
html转js在线工具

html转js在线工具