在我的应用程序中使用出色的软件架构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);