php - 在 symfony 4.4 的控制器中测试模拟服务
问题描述
我想在我的 symfony 4.4 项目上测试这个控制器:
final class WebhookController extends AbstractController
{
private CustomLoggerService $customLogger;
private EntityManagerInterface $entityManager;
private MyService $myService;
private UserMailer $userMailer;
private AdminMailer $adminMailer;
public function __construct
(
CustomLoggerService $customLogger,
EntityManagerInterface $entityManager,
MyService $myService,
UserMailer $userMailer,
AdminMailer $adminMailer
)
{
$this->customLogger = $customLogger;
$this->myService = $myService;
$this->userMailer = $userMailer;
$this->adminMailer = $adminMailer;
$this->entityManager = $entityManager;
}
/**
* @Route("/webhook/new", name="webhook_new")
* @param Request $request
* @return Response
*/
public function new(Request $request)
{
$uri = $request->getUri();
$this->customLogger->info("new event uri ".$uri);
$query = $request->query->all();
if(isset($query['RessourceId']))
{
//infos
$id = $query['RessourceId'];
$event = $this->myService->getInfos($id);
$infoId = $event->infoId;
$this->customLogger->info("new info id ".$infoId);
$userRepo = $this->entityManager->getRepository(User::class);
$user = $userRepo->findOneByEventUserId((int)$event->owners[0]);
//mail sent
$this->userMailer->sendAdminEvent($event, $user);
$this->customLogger->info("new mail sent");
}
else
{
$this->adminMailer->sendSimpleMessageToAdmin("no ressource id", "no ressource id");
}
return new JsonResponse();
}
}
我需要模拟 MyService 因为它调用外部 API
这是我的测试:
class WebhookControllerTest extends WebTestCase
{
use LoginTrait;
public function testNewPayinIRessourceIdExists()
{
self::ensureKernelShutdown();
/** @var KernelBrowser $client */
$client = $this->startClient();
$client->enableProfiler();
$myService = $this->createMock(MyService::class);
$myService->expects($this->once())->method("getInfos")->willReturn([
[
'hi'=>'hi'
]
]);
// if I do this, I can't inject my mocked service
$client->request('GET', '/webhook/new/?RessourceId=1111');
// if I do this, I can't autowire all my dependencies of my controller
$controller = new WebhookController(xxxx);
$controller->new(xxx);
}
}
测试我的控制器的最佳方法是什么?如果我这样做new WebhookController(xxxx)
了,我有很多依赖项需要其他依赖项并且它是不可维护的。或者我应该移动自定义日志并在其他服务中发送电子邮件并保持控制器没有这些依赖关系?
解决方案
您不需要自己实例化控制器。
您可以将需要模拟的服务公开以用于测试环境,在容器中创建模拟和覆盖。
在
config/services_test.yaml
添加以下配置App\Service\MyService: public: true
模拟服务
$myService = $this->createMock(MyService::class); $myService->expects($this->once())->method("getInfos")->willReturn([ [ 'hi'=>'hi' ] ]); self::$container->set(MyService::class, $myService);
并发出 HTTP 请求
$client->request('GET', '/webhook/new/?RessourceId=1111');
推荐阅读
- azure - 停止 azure 函数应用程序是否会终止执行计时器触发函数或让它完成其运行并且在之后不重新安排
- c - 工作控制中的 tcgetattr 和 tcsetattr 似乎打破了 termcaps
- model-view-controller - 通过 datepicker 选择时面临 mvc 中的 day 问题
- ios - AR 工具包 3:SupportsFrameSemantics() 在支持的 iOS 设备上返回 false
- javascript - 计算另一个平面中点的坐标
- c# - 返回参数而不是通过 Ref 传递它
- reactjs - React 钩子、reducer、上下文和初始状态对象。如何进行 API 调用?
- html - 移动宽度视图未正确呈现
- google-sheets - 从服务帐号重新获得所有权
- java - 通过字段“springSecurityFilterChain”表示的不满足的依赖关系