首页 > 解决方案 > Laravel Lucid 模拟工作

问题描述

在我的应用程序中使用出色的软件架构Lucid,我需要提供一些授权逻辑。

我有一个操作,其中包含 作业调用AuthorizeOperation的逐步流程。

操作内容示意图如下:

GetRemoteAuthorizationDataJob@handle方法最终返回远程数据源请求的结果。假设结果是一个数组。

问题是如何在我的单元测试中使用所需数据来模拟这个结果?

我试图GetRemoteAuthorizationDataJob@handle像往常一样模拟该方法:

    $this->instance(
        GetRemoteAuthorizationDataJob::class,
        \Mockery::mock(
            GetRemoteAuthorizationDataJob::class,
            function ($mock) {
                $mock->shouldReceive('handle')->andReturn([
                    'key_1' => 'required_value_1',
                     //...
                    'key_n' => 'required_value_n',
                ]);
            }
        )
    );

但在我的情况下它没有帮助。

标签: phplaravellaravel-6

解决方案


当前实现的唯一解决方案是部分模拟调用操作的功能,或部分模拟调用作业的操作。

功能模拟

仅在操作本身具有保证其工作的测试时才建议这样做。


$mFeature = m::mock(CustomFeature::class)->makePartial();
$mFeature->shouldReceive('run')
  ->with(AuthorizeOperation::class, $params)
  ->andReturn($result);

工作调用模拟

$mOperation = m::mock(AuthorizeOperation::class)->makePartial();
$mOperation->shouldReceive('run')
  ->with(GetRemoteAuthorizationDataJob::class, $params)
  ->andReturn($result);

部分模拟允许非模拟方法使用模拟方法调用中返回的结果实际执行,尽管参数 in必须与调度类with()中传递的内容完全匹配。$this->run


在内部,我们一直在讨论一种比这更好的方法,它可以让您的方法正常工作(替换容器中的单元实例),一旦发布,我们会及时通知您!


推荐阅读