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
相关产品推荐
相关产品推荐

