Rails 6.0.5.1中ActiveRecord inclusion验证的errors.added?断言失败问题
Rails 6.0.5.1中ActiveRecord inclusion验证的断言问题解决方法
问题场景
在Rails 6.0.5.1版本的ActiveRecord模型中,配置了如下inclusion验证:
validates :car_type, inclusion: ['coupe', 'sedan', 'convertible']
测试阶段,给car_type属性赋值不在有效列表中的值(如'airplane')时,以下MiniTest断言均可正常通过:
assert car.errors.invalid? assert car.errors.include? :car_type assert car.errors.added? :car_type, 'is not included in the list'
但执行assert car.errors.added? :car_type, :inclusion时断言失败,报错Minitest::Assertion: Expected false to be truthy。
解决方案
原因分析
Rails 6.0.x版本中,errors.added?方法在通过符号匹配错误类型时,会严格校验验证选项的一致性。仅传入:inclusion符号而不附带对应验证选项的话,无法匹配到已添加的错误记录。另外,inclusion验证底层实际是使用:in作为错误标识的符号键。
两种可行写法
- 传入完整验证选项哈希,与模型中配置的验证参数保持一致:
assert car.errors.added? :car_type, :inclusion, in: ['coupe', 'sedan', 'convertible']
- 直接使用底层错误符号
:in:
assert car.errors.added? :car_type, :in
内容的提问来源于stack exchange,提问作者Jon Schneider
相关产品推荐
相关产品推荐

