繁体   English   中英

在 Spock 测试中调用 entity.delete(flush: true) 不会刷新,也不会使用 withTransaction,必须分别运行

[英]Calling entity.delete(flush: true) in a Spock test does not flush, nor does using withTransaction, one has to run both separately

我有一个带有 Spock 2.0 测试的 Grails 5.2.5 应用程序。 在其中,我尝试删除这样的实体:

def "experiment"() {
    given:
        MyEntity entity = new MyEntity().save(failOnError: true)).save(failOnError: true)
    when:
        entity.delete()
    then:
        MyEntity.count() == 0 // fails
}

它失败。 保存的实体在删除尝试后保留在那里。 如果我将entity.delete()替换为以下三个选项中的任何一个,它仍然会失败。

        MyEntity.withSession {
            entity.delete(flush: true, failOnError: true)
        }
// OR
        MyEntity.withTransaction {
            entity.delete(flush: true, failOnError: true)
        }
// OR
        entity.delete(flush: true, failOnError: true)

或者,如果我删除failOnError:true

我目前基本上无法在 spock 测试期间从数据库中删除内容,而我曾经能够在 Grails 2.x 中执行此操作,因此不确定如何迁移这些测试。

编辑:

我设法像这样删除了一个实体,但这对我来说毫无意义,为什么这些应该起作用而上面的不起作用:

def "experiment"() {
    given:
        MyEntity entity = new MyEntity().save(failOnError: true)).save(failOnError: true)
    when:
        entity.delete(flush: true) // here flush is necessary
        MyEntity.withTransaction {
            entity.delete()
        }
    then:
        MyEntity.count() == 0 // passes
}

令我非常惊讶的是,即使没有同花顺,它也能正常工作,而高于同花顺是必要的:

def "experiment"() {
    given:
        MyEntity entity = new MyEntity().save(failOnError: true)).save(failOnError: true)
    when:
        MyEntity.withTransaction {
            entity.delete()
        }
        entity.delete() // here flush is not necessary
    then:
        MyEntity.count() == 0 // passes
}

这是什么源码。。

好吧,问题是我只刷新了删除操作,没有刷新保存操作。 我认为我不必这样做,因为保存的实体是在.count()操作期间找到的。

Hibernate flushModeCOMMIT作为默认值,而不是过去的AUTO 文档对此有错误,我发布了一个 PR 来修复文档,更改仅在发行说明中提到,但文档没有更新

由于已经改变,现在我想在测试中保存实体并删除它们,我需要刷新这两个操作。

所以这现在可以正常工作了:

def "experiment"() {
    given:
        MyEntity entity = new MyEntity().save(failOnError: true, flush: true) // flush was added here that wasn't here before
    when:
        entity.delete(flush: true) // flush needs to be here as well.
    then:
        MyEntity.count() == 0 // works now
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM