拉拉维尔·卢西德模仿工作



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

我有一个操作AuthorizeOperation,它包含带有作业调用的逐步流。

操作内容示意图如下:

  • 运行GetLocalAuthorizationDataJob
  • 运行GetRemoteAuthorizationDataJob
  • 运行CalculateJob

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',
]);
}
)
);

但这对我的情况没有帮助。

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

功能模拟

只有在操作本身具有保证其工作的测试的情况下,才建议这样做。


$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);

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


在内部,我们一直在讨论一种比这更好的方法,它将允许您的方法工作(替换容器中的单元实例(,一旦发布,就会立即发布!


更新

现在有一种更简单的方式来模拟单位!有关详细信息,请参阅测试文档。

总之,您可以在测试中的任何单元(功能、作业、操作(上使用Unit::mock($args)方法来模拟并返回预期结果。

GetUserByIDJob::mock(['id' => $id])->shouldReturn($user);

相关内容

  • 没有找到相关文章

最新更新