BeginnerEngineerBlog
中の人
中の人

【laravel FormRequest】withValidatorをテスト

公開: 2024-05-12 14:34
更新: 2024-05-13 01:23
24
laravel FormRequest test
あまりヒットしなかった気がしたのでメモ

こんにちは!

中の人です


最近FormRequestをテストしたくなったんですが、カスタムバリデートのwithValidatorの中身テストしたくて記事探したのですがあまりヒットしなかったのでメモとして紹介します

laravel 6.x

FormRequest作成


📁 root/app/Http/Requests/ArticleRequest.php

<?php

namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;

class ArticleRequest 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',
                'string',
            ],
        ];
    }

    public function withValidator($validator)// 👈 これをテストしたい
    {
        $validator->after(function ($validator) {
            if (empty($validator->failed())) {
                $name = $this->get('name');
                if ($name !== 'おすおす') {// 👈 おすおすじゃなかったらバリデートする
                    $validator->errors()->add('name', '(゚∀゚ )');
                }
            }
        });
    }
}

カスタムバリデートのwithValidatorを適当に設定します

Test作成


📁 root/tests/Feature/Http/Requests/ArticleRequestTest.php

<?php

namespace Tests\Feature\Http\Requests;

use App\Http\Requests\ArticleRequest;
use Illuminate\Support\Facades\Validator;
use Tests\TestCase;

class ArticleRequestTest extends TestCase
{
    /**
     * @group RequestTest
     * @test
     * @return void
     */
    public function test()
    {
        $params = [
            'name' => 'begien',
        ];
        $request = new ArticleRequest();// 👈 テストしたいFormRequest
        $rules = $request->rules();
        $messages = $request->messages();
        $validator = Validator::make($params, $rules, $messages);
        $this->assertTrue(!$validator->fails());// 👈 ここではrulesが検証されるので通過するはず
        $request->withValidator($validator);// 👈 withValidatorに$validatorを投げる
        $this->assertTrue($validator->fails());// 👈 ここでwithValidator関数の$validator->after関数が実行されるので'おすおす'ではないので検証失敗するはず
        $errors = $validator->errors();
        $name_errors = $errors->get('name');
        $this->assertTrue(in_array('(゚∀゚ )', $name_errors, true));// 👈 設定されたエラーメッセージがあるはず
    }
}

テスト実行


$ vendor/bin/phpunit --group RequestTest

これの実行結果は


大丈夫そう

終わりに


正直普段あまりテストしません
すいませんorz
0
0
0
0
通信エラーが発生しました。
似たような記事