如何编写PHPUnit测试验证布尔字段的非布尔值校验逻辑?
布尔字段校验错误场景测试失败的解决方案
问题描述
需要测试布尔字段is_bulk的校验错误场景:当用户通过浏览器调试工具传入非布尔值(如字符串'test')时,UI能正确展示校验错误,但在PHPUnit测试中,使用Model Factory生成数据时,传入的非布尔值会被Laravel自动转换为布尔值,导致模型成功存储且无错误,无法验证校验规则。
原测试代码:
public function test__boolean_is_bulk() { $product = Product::factory()->dataToSaveByRoute()->make(['is_bulk' => 'test']); $response = $this->loginAs(static::$user)->post(route('store', $product->toArray())); $response->assertInvalid('is_bulk') ->assertStatus(302); }
测试结果不符合预期:产品被正确保存,响应返回200状态码,未触发校验错误。通过调试发现,$product['is_bulk']被自动转换为true,且类型为布尔值。
解决方案
1. 直接构造原始请求数据,避免模型自动转换
Model Factory的make()方法会根据模型的$casts配置自动转换字段类型,导致传入的非布尔值被转为布尔值,失去测试意义。应使用raw()方法获取工厂的原始数据,再合并测试用的错误值,直接发送请求:
public function test_boolean_is_bulk_validation() { // 获取工厂原始数据,不触发模型字段转换 $baseData = Product::factory()->dataToSaveByRoute()->raw(); // 合并错误测试值 $testData = array_merge($baseData, ['is_bulk' => 'test']); $response = $this->loginAs(static::$user)->post(route('store'), $testData); $response->assertInvalid('is_bulk') ->assertStatus(302); }
2. 确认校验规则包含布尔类型约束
确保你的请求校验逻辑(表单请求类或控制器验证)中,is_bulk字段的规则包含boolean约束,示例:
// 表单请求类中的校验规则示例 public function rules() { return [ 'is_bulk' => 'required|boolean', // 其他字段规则... ]; }
如果缺少boolean规则,即使传入非布尔值也不会触发校验错误,这是测试通过的前提。
内容的提问来源于stack exchange,提问作者ERasekh
相关产品推荐
相关产品推荐

