设置blank:false约束的字段仅填空格为何未触发验证失败?
问题原因分析
你的测试失败的核心原因是Grails默认的blank: false约束不会自动修剪字符串的空白字符,而你配置的size: 1..20约束又刚好满足全空格字符串的长度要求。
具体拆解一下:
- 当你给
name赋值为' '(单个空格)时,这个字符串的长度是1,完全符合size: 1..20的约束条件; - 默认情况下,
blank: false只会检查字符串是否为null或者空字符串"",并不会把全空白的字符串(比如' '、' ')判定为“blank”; - 所以
domain.validate(['name'])会返回true,导致你的断言!domain.validate(...)不成立,最终抛出ConditionNotSatisfiedError。
解决方法
要让全空格的输入触发blank错误,你需要在name字段的约束中添加trim: true配置,这样Grails会在验证前自动修剪字符串的前后空白:
class Thing { String name static constraints = { name nullable: false, blank: false, size: 1..20, trim: true } }
添加trim: true后,当输入全空格的字符串时,它会被修剪成空字符串"",此时blank: false约束会生效,同时size:1..20也会因为长度为0而不满足规则,domain.validate(['name'])会返回false,错误码也会是blank,你的测试就能顺利通过了。
当然你也可以手动在测试里修剪字符串后再验证,但显然在领域类约束中配置trim: true是更符合Grails最佳实践的做法。
内容的提问来源于stack exchange,提问作者Selena
相关产品推荐
相关产品推荐

