Laravelのemailのバリデーションを少し厳しくしたところ、これまで問題なかったテストが失敗するようになってしまったので、その対策を記述したいと思います。
問題
Laravelではデフォルトのemailバリデーションに以下のようなより厳しいチェックを追加することができます。
- rfc: RFCValidation
- strict: NoRFCWarningsValidation
- dns: DNSCheckValidation
- spoof: SpoofCheckValidation
- filter: FilterEmailValidation
今回、下記のようなバリデーションを追加したところ、テストが失敗するようになりました。
'email' => ['required', 'string', 'email:strict,dns,filter', 'max:255'],
ここでは、このdns
バリデーションが、そのメールアドレスが実際にDNSに存在するかをチェックします。
しかし、テストなどで$faker->safeEmail()
で生成されたメールアドレスは必ずしも実在するドメインではないので、バリデーションに失敗してしまい、その結果、テストに失敗してしまいました。
解決策
テストで使用するメールアドレスを実在するドメインのもので書き換えてあげれば、大抵の場合は事足りると思いますが、$faker->freeEmail()
というメソッドを使うと、gmailやyahooのように実在するフリーメールのドメインのメールアドレスのみをランダムに生成することが可能になります。
今回は、safeEmail()
をfreeEmail()
に変更するだけでテストがこれまで通りパスするようになりました。
参考サイト
https://laravel.com/docs/8.x/validation#rule-email