我明白了
invalid email address
当使用 faker 填充我的应用程序的电子邮件字段时。
'email' => ['required', 'email:rfc,dns']
有没有办法让 faker 吐出通过这些测试的有效电子邮件地址?
我尝试了 safeEmail 和其他一些,但它们仍然失败
最佳答案
我有同样的问题,它都与 Laravel 用来验证电子邮件的 Egulias\EmailValidator\Validation\DNSCheckValidation
类有关(如您所见 here example
是保留的顶级域)。
无法避免使用 faker
创建的电子邮件通过此验证,IMO,这是应该的。但是我们需要进行测试,不是吗?
有一个简单的方法(也可以在 FormRequest
或任何你正在使用的实现验证器的方法中使用):
// In your test:
$this->post('my-url', ['email' => $this->faker->unique()->safeEmail])
// In your code
$emailRules = 'email:rfc';
if(!app()->runningUnitTests()) {
$emailRules .= ',dns';
}
$validator = Validator::make($data, ['email' => ['required', $emailRules]]);
// [...]
另一种方法是创建一个自定义的电子邮件验证规则来封装 runningUnitTests
逻辑(我认为它更简洁)
<?php
namespace App\Rules;
use Egulias\EmailValidator\EmailValidator;
use Egulias\EmailValidator\Validation\DNSCheckValidation;
use Egulias\EmailValidator\Validation\MultipleValidationWithAnd;
use Egulias\EmailValidator\Validation\NoRFCWarningsValidation;
use Egulias\EmailValidator\Validation\RFCValidation;
use Egulias\EmailValidator\Validation\SpoofCheckValidation;
use Illuminate\Contracts\Validation\Rule;
use Illuminate\Validation\Concerns\FilterEmailValidation;
/** @codeCoverageIgnore */
class ValidEmail implements Rule
{
protected array $parameters;
/**
* Create a new rule instance.
*
* @return void
*/
public function __construct(array $parameters = [])
{
$this->parameters = $parameters;
}
/**
* Determine if the validation rule passes.
*
* @param string $attribute
* @param mixed $value
* @return bool
*/
public function passes($attribute, $value)
{
if (! is_string($value) && ! (is_object($value) && method_exists($value, '__toString'))) {
return false;
}
$validations = collect($this->parameters)
->unique()
->map(function ($validation) {
if ($validation === 'rfc') {
return new RFCValidation();
} elseif ($validation === 'strict') {
return new NoRFCWarningsValidation();
} elseif ($validation === 'dns' && !app()->runningUnitTests()) {
return new DNSCheckValidation();
} elseif ($validation === 'spoof') {
return new SpoofCheckValidation();
} elseif ($validation === 'filter') {
return new FilterEmailValidation();
}
return null;
})
->values()
->filter()
->all() ?: [new RFCValidation()];
return (new EmailValidator)->isValid($value, new MultipleValidationWithAnd($validations));
}
/**
* Get the validation error message.
*
* @return string
*/
public function message()
{
return __('validation.email');
}
}
比在你的代码中:
$validator = Validator::make($data, ['email' => ['required', new ValidEmail()]]);
// OR
$validator = Validator::make($data, ['email' => ['required', new ValidEmail(['rfc','filter','dns'])]]);
// [...]
关于通过电子邮件验证电子邮件 :rfc, dns 的 Laravel faker 电子邮件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69986346/