You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

运行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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 21:30:50