Grails单元测试服务-如何刷新



I使用Grails V2.4.3和Hibernate TestMixin。我有一个简单的服务单元测试如下:

import spock.lang.*
import grails.test.mixin.TestMixin
import grails.test.mixin.gorm.Domain
import grails.test.mixin.hibernate.HibernateTestMixin
import grails.buildtestdata.mixin.Build
@TestFor(FieldSavingService)
@Domain([Field, SubField])
@TestMixin(HibernateTestMixin)
class FieldSavingServiceSpec extends Specification {
void "Should save Field"() {
    given:
    Field field = new Field(label: "Name").save(flush: true)
    def first = new SubField(caption: "first", sortOrder: 0, field: field).save(flush: true)
    def second = new SubField(caption: "second", sortOrder: 1, field: field).save(flush: true)
    field.addToSubFields(second).addToSubFields(first).save(flush: true, failOnError: true) 
    when:
    service.deleteField()
    then:       
    SubField.findAllByField(field).size() == 0  //test fails
    }
}

服务如下:

class FieldSavingService {
        void deleteField() {
        Field field = Field.findByLabel("Name")
        def  subFields = SubField.findAllByField(field)
        subFields.each{ it.delete()}
        field.delete() //unit test passes if field.delete(flush: true) is called
    }
}

只有当我在服务中使用flush:true调用delete时,单元测试才会通过。考虑到Grails中的服务是事务性的(即,域从服务返回时应该被刷新),我如何在不在生产代码中调用flush的情况下通过测试?感谢:)

您可以尝试在删除后显式刷新当前会话。请注意,您可以使用HibernateTestMixin提供的hibernateSession属性(源代码)访问当前会话。

void "Should save Field"() {
    given:
    Field field = new Field(label: "Name").save(flush: true)
    def first = new SubField(caption: "first", sortOrder: 0, field: field).save(flush: true)
    def second = new SubField(caption: "second", sortOrder: 1, field: field).save(flush: true)
    field.addToSubFields(second).addToSubFields(first).save(flush: true, failOnError: true) 
    when:
    service.deleteField()
    hibernateSession.flush() // explicitly flush current session
    then:       
    SubField.findAllByField(field).size() == 0  //test fails
}

最新更新