Grails 2.3系バリデーションblank:falseがUnitテストで無視される件
http://jira.grails.org/browse/GRAILS-10474
よく見たら報告者が nobeans氏ではないか!
Grails 2.3.xからドメインでString型の空文字列はnullと判断するようになりました。
constraintsで、blank:falseが意味なしになります。
それを変更するには、Config.groovyで
grails.databinding.convertEmptyStringsToNull = false
なのだが、Unitテストだと、反応しない。。。
んじゃ、インテグレーションテストにすればいいじゃん!
ではなくて。。
これは、GrailsUnitTestMixinでdefineBeansされるDataBindingGrailsPluginのdoWithSpringが順番的にgrailsApplicationの前にあったりするからで。
現状の回避方法としては、テストのsetup()で、DataBindingGrailsPluginのdoWithSpringをdefineBeansしてやれば良いです。ん?強引?
//ドメイン例 class Foo { String name static constraints = { name blank:false } } //テストは。 import grails.test.mixin.TestFor import spock.lang.Specification import grails.test.mixin.web.ControllerUnitTestMixin import org.codehaus.groovy.grails.plugins.databinding.DataBindingGrailsPlugin @TestFor(Foo) @TestMixin(ControllerUnitTestMixin) class FooSpec extends Specification { def setup(){ // *ここで追加。* defineBeans(new DataBindingGrailsPlugin().doWithSpring) } void "test validation"(){ when: def foo = new Foo(name:'') foo.validate() then: foo.errors.errorCount == 1 foo.errors['name'].code == 'blank' } }
あってるかしらんけど、これで回避できましたとさ。
ん?既出?