フォームリクエストクラスのテストをしたい時があります。これは主にバリデーションが期待通りに動作するかのテストです。この時、本当にリクエストを送ったりリクエストを処理する一連の流れを呼び出すのはいささか大仰です。連想配列でリクエスト内容を定義し、それをフォームリクエストにしてバリデーションを試す方法を紹介します。
フォームリクエストクラスは単にnewして使おうとすると様々なnull参照エラーに遭います。これはLravelの依存性注入が働いていないためです。Laravelの方でよしなにしてもらうためにはapp()->make()を使うのが便利です。
またフォームリクエストにはmergeというリクエストパラメータに新しく値を合体させるメソッドがあります。これらを組み合わせることフォームリクエストクラスのインスタンスを任意の形で作れます。コード例は次です。
// 素のフォームリクエストクラスはこんな感じで作れます
/** @
/** @var FormRequest $req */
$req = app()->make(FormRequest::class);
$req->merge(['name' => 'test']); // リクエストパラメータとしてセット
// バリデーションテスト
$req->validate([
'name' =>[ 'required', 'max:255' ]
]);
// 自作のフォームリクエストクラスも同様に作れます。
/** 自作のフォームリクエストクラス */
class MemberStoreRequest extends FormRequest
{
public function rules(): array
{
return [
'name' => ['string', 'max:255'],
];
}
}
// 素のフォームリクエスト同様に app()->make() でインスタンスにします。
// 特別Laravelにmakeしてもらうための定義を追加する必要はありません。
// FormRequestクラスとみなしてよしなにしてくれます。
/** @var MemberStoreRequest $req */
$req = app()->make(MemberStoreRequest::class);
$req->merge(['nama' => 'test']); // リクエストパラメータとしてセット
$req->validated(); // バリデーションテスト
こんな感じでフォームリクエストインスタンスをいい感じに作れます。これを利用すると高速なテストを作れるほか、フォームリクエストクラスを引数とした値のやり取りを簡易にできるようになります。フォームリクエストクラスは連想配列ぐらい複雑で自由に値をセットできつつ、バリデーションによってその値の形式を縛れます。うまく使うと案外便利です。