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

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

查看所有标签

猜你喜欢:

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

暗网

暗网

杰米·巴特利特 / 刘丹丹 / 北京时代华文书局 / 2018-7 / 59.00

全面深入揭秘“黑暗版淘宝”暗网的幕后世界和操纵者 现实中所有的罪恶,在暗网中,都是明码标价的商品。 暗杀、色情、恋童癖、比特币犯罪、毒品交易…… TED演讲、谷歌特邀专家、英国智库网络专家杰米•巴特利特代表作! 1、 被大家戏称为“黑暗版淘宝”的暗网究竟是什么?微信猎奇 文不能告诉你的真相都在这里了! 2、 因章莹颖一案、Facebook信息泄露危机而被国人所知的暗网......一起来看看 《暗网》 这本书的介绍吧!

XML 在线格式化
XML 在线格式化

在线 XML 格式化压缩工具

RGB HSV 转换
RGB HSV 转换

RGB HSV 互转工具