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

Laravel 10自定义验证规则的单元测试方法

测试Laravel自定义验证规则的具体方法

方法一:直接调用规则的passes方法

你通过php artisan make:rule生成的自定义规则类,默认实现了Illuminate\Contracts\Validation\Rule接口,其中的passes($attribute, $value)方法会直接返回布尔值,用来标识验证是否通过。你可以直接在测试用例里调用这个方法做断言:

假设你的自定义规则类是ValidPhoneNumber,测试代码示例如下:

public function test_valid_phone_number_rule()
{
    // 测试验证通过的场景
    $rule = new ValidPhoneNumber();
    $this->assertTrue($rule->passes('phone', '13800138000'));

    // 测试验证失败的场景
    $this->assertFalse($rule->passes('phone', 'invalid-phone-number'));
}

方法二:用Laravel验证器门面模拟真实验证流程

这种方式更贴近业务中规则的实际使用场景,能完整模拟请求参数的验证流程:

use Illuminate\Support\Facades\Validator;

public function test_phone_number_validation_flow()
{
    // 验证通过的情况
    $validator = Validator::make(
        ['phone' => '13800138000'],
        ['phone' => new ValidPhoneNumber()]
    );
    $this->assertFalse($validator->fails()); // 断言无验证错误

    // 验证失败的情况
    $validator = Validator::make(
        ['phone' => 'invalid-phone-number'],
        ['phone' => new ValidPhoneNumber()]
    );
    $this->assertTrue($validator->fails()); // 断言存在验证错误
    // 还可以进一步校验错误信息是否符合预期
    $this->assertEquals('手机号格式不符合要求', $validator->errors()->first('phone'));
}

关于validate()方法的说明

你提到的validate()方法,作用是在验证失败时向验证器实例添加错误信息,它本身不会返回结果或抛出异常,所以不需要直接用它来做测试断言。我们只需要通过规则的passes()方法,或者验证器的fails()/passes()方法,就能判断验证是否成功。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 21:02:31