运行Laravel PHPUnit测试时Symfony邮箱RFC合规异常的解决
Laravel注册测试失败:空邮箱RFC合规性异常
运行Laravel自带测试套件时,RegistrationTest中的测试失败,报错信息如下:
上次请求期间发生以下异常:Symfony\Component\Mime\Exception\RfcComplianceException: Email "" does not comply with addr-spec of RFC 2822. in C:\xampp\htdocs\myapp\vendor\symfony\mime\Address.php:54.
实际用户注册与邮件发送功能均正常,以下是相关代码及解决方案:
失败测试代码
<?php namespace Tests\Feature; use App\Providers\RouteServiceProvider; use Illuminate\Foundation\Testing\RefreshDatabase; use Laravel\Fortify\Features; use Laravel\Jetstream\Jetstream; use Tests\TestCase; class RegistrationTest extends TestCase { use RefreshDatabase; public function test_new_users_can_register() { if (! Features::enabled(Features::registration())) { return $this->markTestSkipped('Registration support is not enabled.'); } $response = $this->post('/register', [ 'first_name' => 'TestFNAME', 'last_name' => 'TestLNAME', 'email' => 'test@example.com', 'mobile_phone_number' => '08011223344', 'password' => 'password', 'password_confirmation' => 'password', 'terms' => Jetstream::hasTermsAndPrivacyPolicyFeature(), ]); $this->assertAuthenticated(); $response->assertRedirect(RouteServiceProvider::HOME); } }
注册输入验证代码片段
Validator::make($input, [ 'first_name' => ['required', 'string', 'max:255'], 'last_name' => ['required', 'string', 'max:255'], 'email' => ['required', 'string', 'email', 'max:255', 'unique:users'], 'mobile_phone_number' => ['required', 'string', 'min:11', 'max:15', 'unique:users', 'phone:NG,mobile'], 'password' => $this->passwordRules(), 'terms' => Jetstream::hasTermsAndPrivacyPolicyFeature() ? ['required', 'accepted'] : '', ])->validate();
解决方案
1. 修复验证规则的terms字段
当未启用条款功能时,将terms的规则从空字符串改为空数组,避免Laravel验证器误判无效规则:
'terms' => Jetstream::hasTermsAndPrivacyPolicyFeature() ? ['required', 'accepted'] : [],
2. 调整测试的terms字段传递逻辑
根据是否启用条款功能,动态设置测试请求的参数,模拟真实表单提交逻辑:
$payload = [ 'first_name' => 'TestFNAME', 'last_name' => 'TestLNAME', 'email' => 'test@example.com', 'mobile_phone_number' => '08011223344', 'password' => 'password', 'password_confirmation' => 'password', ]; if (Jetstream::hasTermsAndPrivacyPolicyFeature()) { $payload['terms'] = 'on'; // 或true,均符合accepted规则 } $response = $this->post('/register', $payload);
3. 检查测试环境邮件配置
确保.env.testing文件中配置了有效的发件人邮箱,或禁用实际邮件发送:
# 配置有效发件人 MAIL_FROM_ADDRESS=test-sender@example.com MAIL_FROM_NAME="${APP_NAME}" # 或禁用邮件发送(仅记录日志) MAIL_MAILER=log
内容的提问来源于stack exchange,提问作者Adefowowe
相关产品推荐
相关产品推荐

