はじめに
今回は、フォームリクエストのテストを実装したので、その方法をご紹介します。
環境
- Laravel:8.83.4
1. FormRequest作成
FormRequestとは、Laravelでかけることのできるバリデーションで、コントローラーの処理前にリクエストの処理でバリデーションを行います。
今回は、以下のようなFormRequestに対するテストを書いていきます。
TargetRequest.php
<?php
namespace App\Http\Requests;
use Illuminate\Foundation\Http\FormRequest;
use Illuminate\contracts\Validation\Validator;
use Illuminate\Http\Exceptions\HttpResponseException;
class TargetRequest extends FormRequest
{
/**
* Determine if the user is authorized to make this request.
*
* @return bool
*/
public function authorize()
{
return true;
}
/**
* Get the validation rules that apply to the request.
*
* @return array
*/
public function rules()
{
return [
'name' => 'required|max:50',
'amount' => 'required|integer',
];
}
public function messages()
{
return [
'name.required' => '目標は必須です。',
'name.max' => '文字数をオーバーしています。',
'amount.required' => '目標額は必須です。',
'amount.intger' => '正しい形式で入力してください。',
];
}
protected function failedValidation(Validator $validator): HttpResponseException
{
$response = response()->json([
'status' => 'validation error',
'errors' => $validator->errors()
], 400);
throw new HttpResponseException($response);
}
}
2. テスト実装
以下のような手順で進めていきます。
- フォームリクエストで定義したルールを取得
- バリデーターインスタンスを取得し、引数に入力情報(データプロバイダーで作成)とルールを渡す
これらの手順を踏まえて、サンプルコードは以下のようになりました。
<?php
namespace Tests\Unit\Requests;
use Tests\TestCase;
use Illuminate\Support\Facades\Validator;
use App\Http\Requests\TargetRequest;
use Illuminate\Support\Str;
class TargetRequestTest extends TestCase
{
/**
* @test
* @dataProvider validationProvider
*
* テストの期待値
* @param bool $expected
* フォームリクエストのモックデータ
* @param array $data
*/
public function バリデーションが通るか(bool $expected, array $data)
{
// フォームリクエストで定義したルールを取得
$rules = (new TargetRequest())->rules();
// Validatorファサードでバリデーターインスタンス取得、引数に入力情報とルールを渡す
$validator = Validator::make($data, $rules);
$this->assertEquals($expected, $validator->passes());
}
public function validationProvider()
{
return [
'OK' => [
'expected' => true,
'data' => [
'name' => '漫画買う!!',
'amount' => 30000,
]
],
'name必須エラー' => [
'expected' => false,
'data' => [
'name' => null,
'amount' => 30000,
]
]
];
}
}
今回は数パターンのデータした用意しませんでしたが、
必要に応じてデータを用意することでリクエストを網羅的にテストすることができます。
以上で実装完了です。
3. 参考文献