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

Laravel 9中如何在PHPUnit测试中验证抛出的ValidationException?

在Laravel 9中测试登录验证异常的正确方式

在Laravel的HTTP测试场景下,直接使用PHPUnit的expectException()方法不会生效——因为Laravel框架会自动捕获ValidationException,并将其转换为422 Unprocessable Entity的HTTP响应返回,而非让异常直接抛出到测试代码中。

正确的做法是通过断言HTTP响应的状态码和错误信息来验证验证失败的逻辑,具体步骤如下:

1. HTTP接口测试的正确写法

假设你的登录接口是POST /login,测试无效凭证的示例代码如下:

<?php

namespace Tests\Feature;

use Tests\TestCase;

class LoginTest extends TestCase
{
    public function test_invalid_credentials_trigger_validation_errors()
    {
        // 发送携带无效凭证的登录请求
        $response = $this->post('/login', [
            'email' => 'invalid@example.com',
            'password' => 'wrong-password',
        ]);

        // 断言响应状态码为422(验证失败)
        $response->assertStatus(422);

        // 断言指定字段存在验证错误
        $response->assertInvalid([
            'email' => '这些凭据与我们的记录不匹配。', // 替换为你实际的错误提示文本
            // 也可以只验证字段有错误,不指定文本:'email'
        ]);
    }
}

2. 直接调用请求类方法时的异常测试

如果是在测试中直接调用LoginRequest的authenticate()方法(而非通过HTTP请求触发),则可以使用PHPUnit的异常断言:

<?php

namespace Tests\Unit;

use App\Http\Requests\Auth\LoginRequest;
use Illuminate\Validation\ValidationException;
use Tests\TestCase;

class LoginRequestTest extends TestCase
{
    public function test_authenticate_throws_validation_exception_on_invalid_credentials()
    {
        $request = LoginRequest::create('/login', 'POST', [
            'email' => 'invalid@example.com',
            'password' => 'wrong-password',
        ]);

        // 先触发请求的规则验证
        $request->validateResolved();

        // 断言会抛出指定异常
        $this->expectException(ValidationException::class);
        
        // 调用authenticate方法,此时会抛出异常
        $request->authenticate();
    }
}

关键说明

  • Laravel的HTTP测试层会自动处理异常并转换为响应,因此HTTP请求测试用响应断言,直接调用类方法用异常断言。
  • assertInvalid()是Laravel 9提供的专门用于验证表单请求错误的断言方法,比手动检查响应内容更简洁可靠。

内容的提问来源于stack exchange,提问作者mstdmstd

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 04:15:42