单独接受$Request的Laravel测试类

单独接受$Request的Laravel测试类,laravel,phpunit,Laravel,Phpunit,如何在不使用端点的情况下单独测试类 这是我的班级: class ProfileService { /** * @param Request $request * * @return JsonResponse */ public function profile(Request $request): JsonResponse { $user = User::where('email', $request->ema

如何在不使用端点的情况下单独测试类

这是我的班级:

class ProfileService
{
    /**
     * @param Request $request
     *
     * @return JsonResponse
     */
    public function profile(Request $request): JsonResponse
    {
        $user = User::where('email', $request->email)->first();

        if ($user) {
            $squads = (new UserInfoService)->getUserInfo($request->email);

            return response()->json($squads, 200);
        }

        return response()->json(['error' => 'Invalid user supplied'], 422);
    }
}
这是在
api.php
中使用路由
/profile
调用的控制器

class PageController extends Controller
{
    /**
     * @param Request $request
     *
     * @return JsonResponse
     */
    public function profile(Request $request): JsonResponse
    {
        return (new ProfileService)->profile($request);
    }
}
我知道我可以测试端点和一切,一切正常,但是当我的控制器增长并且需要更多的类来接受
$request
作为参数时,该怎么办

我不想测试整个控制器的响应,我想单独测试每个服务

我知道在这个例子中,如果我愿意,我可以只使用
$email
更改
$request
,但在我稍后将在项目中创建的某些类中,我可能没有该选项

以下是我的测试使用的路线:

class ProfileServiceTest extends TestCase
{
    use RefreshDatabase;

    public function test_return_user_info_with_squads()
    {
        $user = User::factory()->create();

        $squad  = Squad::factory()->create();
        $squad->user()->attach($user->id);

        Passport::actingAs(
            $user
        );

        $this->postJson(route('profile'), ['email'  => $user->email])
            ->assertStatus(200)
            ->assertExactJson([
                'user'       => [
                    'name'   => $user->name,
                    'email'  => $user->email,
                    'admin'  => false,
                    'squads' => $user->squads
                ]
            ]);
    }
...

我如何通过初始化类并通过类中的
$request
对象来更改该测试?

您可以更改
request
对象。这是唯一的解决方案。如果这样对您更有效,可以创建您自己的
request
对象。我宁愿安装另一个依赖项,我将尝试限制
Request
在新类中的使用