[英]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.