簡體   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