单独接受$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
在新类中的使用