Laravel 在控制器内模拟服务类

Laravel 在控制器内模拟服务类,laravel,testing,mocking,laravel-8,Laravel,Testing,Mocking,Laravel 8,我正在尝试为我的控制器编写一个功能测试。为了简化我的当前情况,假设我的控制器如下所示: public function store(Business $business) { try { (new CreateApplicationAction())->execute($business); } catch (Exception $e) { return response()->json(['message' => 'error'], 500

我正在尝试为我的控制器编写一个功能测试。为了简化我的当前情况,假设我的控制器如下所示:

public function store(Business $business)
{
   try {
      (new CreateApplicationAction())->execute($business);
   } catch (Exception $e) {
      return response()->json(['message' => 'error'], 500);
   }

   return response()->json(['message' => 'success']);
}
我试图实现的是,我不想在集成测试中测试CreateApplication类逻辑,而是想专门为它编写另一个单元测试

有没有一种方法可以简单地说
CreateApplicationAction
期望
execute()
并绕过它内部的测试?(不执行
execute()
中的代码)


我在网上看到人们创建了“MockCreateApplicationAction”类,但如果可能的话,我不想创建另一个类,因为我根本不想在其中包含任何逻辑

可能吗

class CreateApplicationAction
{
    public function execute($business) {
        dd("A");

        // Business Logic...
    }
}

因此,当我进行模拟时,永远不应该调用
dd()
。或者我走错了方向?

您需要使用
Laravels
容器来解析您的类。基本方法是使用
resolve()
方法助手。PHP没有依赖注入,因此您需要使用依赖注入,在
Laravel
中,容器解决了这一问题

resolve(CreateApplicationAction::class)->execute($business);
在构造函数、控制器方法、作业、事件、侦听器和命令(如果方法名为handle,则为经验法则)上,可以将类注入到参数中,它们将通过容器解析

public function store(Business $business, CreateApplicationAction $applicationAction)
{
    try {
        $applicationAction->execute($business);
  
public function store(Business $business, CreateApplicationAction $applicationAction)
{
    try {
        $applicationAction->execute($business);