解決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();

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

查看所有标签

猜你喜欢:

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

Data Structures and Algorithm Analysis in Java

Data Structures and Algorithm Analysis in Java

Mark A. Weiss / Pearson / 2011-11-18 / GBP 129.99

Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course wa......一起来看看 《Data Structures and Algorithm Analysis in Java》 这本书的介绍吧!

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

RGB HSV 转换
RGB HSV 转换

RGB HSV 互转工具

RGB CMYK 转换工具
RGB CMYK 转换工具

RGB CMYK 互转工具