leftovers...

about grails groovy

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'
    }
}


あってるかしらんけど、これで回避できましたとさ。
ん?既出?