簡體   English   中英

如何讓域對象的 .save() 方法在集成測試中失敗?

[英]How can I have a domain object's .save() method fail in an integration test?

對於集成測試,我想有意使用.save()以測試相應的else條件。

我正在測試的 class 這樣做:

來自 UserService.groovy:

User user = User.findByXyz(xyz) 
if (user) {
    // foo
    if (user.save()) {
        // bar
    } else {
        // I WANT TO GET HERE
    }
}

到目前為止我嘗試過的方法都失敗了:

我在 UserServiceTests.groovy 中嘗試過的內容:

def uControl    = mockFor(User)
uControl.demand.save { flush -> null }  // in order to test a failing user.save()
def enabledUser = userService.enableUser(u.confirmationToken)
uControl.verify()

// or the following:
User.metaClass.'static'.save = { flush -> null }  // fails *all* other tests too

如何正確地從集成測試中進入 else 塊?

您幾乎不需要 mocking 或在集成測試中更改元類 - 只有單元測試。

如果您想使save()調用失敗,只需傳入未驗證的數據即可。 例如,默認情況下所有字段都不為空,因此使用def user = new User()應該會失敗。

也許您可以嘗試將“驗證”更改為其他內容 - 通過使用您展示的相同元 class 編程。 這樣,如果驗證失敗,保存肯定會失敗

在這種情況下我會做什么:我總是至少有一個字段不是 null。 我根本不設置它,然后調用.save() 如果你想在數據庫中已經存在的 object 上實現這一點,只需使用 find 或 get 加載它並將非 null 值之一設置為 Z37A6259CC0C1DAE298A786648 然后嘗試保存它。 如果您沒有配置 Config.groovy 以在保存時在失敗時拋出異常它不會拋出異常,它根本不會保存它[您可以預先調用.validate()以確定它是否會保存並檢查object_instance.errors.allErrors 列表以查看錯誤]。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM