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

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

查看所有标签

猜你喜欢:

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

游戏化实战

游戏化实战

[美]Yu-kai Chou / 杨国庆 / 华中科技大学出版社 / 2017-1 / 59.00

TED演讲人作品,罗辑思维、华为首席用户体验架构师、思科网络体验CTO推荐。 随书附有TED演讲中文视频及作者开设的游戏化初学者课程。作者为Google、乐高、华为、思科、斯坦福大学、丹麦创新中心等多家企业、机构提供高层培训与合作。 ********************** “我长期以来都在密切关注Yu-kai的研究成果。任何想要让工作、生活变美好的人都应该阅读这本书。” ......一起来看看 《游戏化实战》 这本书的介绍吧!

随机密码生成器
随机密码生成器

多种字符组合密码

HTML 编码/解码
HTML 编码/解码

HTML 编码/解码

MD5 加密
MD5 加密

MD5 加密工具