0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

[Laravel]Laravelでフォームリクエストのテストを書く

Posted at

はじめに

今回は、フォームリクエストのテストを実装したので、その方法をご紹介します。

環境

  • 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. 参考文献

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?