php - Laravel Lucid 模拟工作
问题描述
在我的应用程序中使用出色的软件架构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);
部分模拟允许非模拟方法使用模拟方法调用中返回的结果实际执行,尽管参数 in必须与调度类with()
中传递的内容完全匹配。$this->run
在内部,我们一直在讨论一种比这更好的方法,它可以让您的方法正常工作(替换容器中的单元实例),一旦发布,我们会及时通知您!
推荐阅读
- oop - 子类的关联类是否继承超类?
- django - 我如何在谷歌云上托管我用 {django & react} 构建的全栈应用程序
- xcode11 - 为 UIKitForMac 构建,但在为 macOS 构建的 .tbd 中链接
- java - 将项目垂直拖放到 RecyclerView 后,如何在 Firestore 中保留项目位置
- php - 查看购物车问题
- android - 使用插件 cordova-plugin-camera-preview 将控件放置在预览中的图层上方
- typescript - 保证数组/集合具有来自 Typescript 中字符串联合的所有值
- spring-security - MUnit 和 Spring 安全模式的问题
- android - 当其他用户使用我的应用程序(Firebase,android)时,我的列表视图会自动填充
- python - 如何构建 gremlin 查询以添加和删除顶点作为第一部分事务