[英]Grails 3 Controller Unit Testing: Domain class validation not working in a ControllerUnitTest
我正在將繼承的 Grails 2 應用程序升級到 3.3.10。 我們有依賴域 class 驗證來控制邏輯流的 controller 方法,但是在 Grails 3 中運行時,我們無法在 ControllerUnitTests 中進行域類驗證
例如, Gift
和RecipientAddress
是 DomainClasses, RecipientAddress.hasErrors()
用於驗證 RecipientAddress 約束。
def confirmAddress() {
Gift gift = Gift.get(params.giftId)
if (!gift) {
render(view: "index", model: [invalid: true])
return
}
recipientAddress = recipientAddressService.storeAddressInformation(params, gift)
if (recipientAddress.hasErrors()) {
render(view: "index", model: getAddressErrorModel(gift, recipientAddress))
return;
} else {
return [
recipientAddress : recipientAddress,
gift : gift
]
}
}
在以下測試中,當我調試 controller 方法時,它會執行所有預期的操作,但recipientAddress.hasErrors()
始終返回true
並且測試失敗。
IE:
@Transactional
class GiftDetailsControllerTest extends Specification implements ControllerUnitTest<GiftDetailsController> {
@Shared
@AutoCleanup
SimpleMapDatastore dataStore = new SimpleMapDatastore([ConnectionSource.DEFAULT, "reporting"],
RecipientAddress, Gift)
def setup() {
controller.recipientAddressService = Mock(RecipientAddressService)
}
void "test RecipientAddress Bad PhoneNumber"() {
given:
RecipientAddress recipientAddress = new RecipientAddress(
phone: '123-456-789'
)
UnitTestDataFactory dataFactory = UnitTestDataFactory.getDataFactory()
Gift gift = dataFactory.getMockGift()
gift.save()
params.giftId = gift.id
when:
recipientAddress.validate()
controller.confirmAddress()
then:
recipientAddress.hasErrors()
recipientAddress.getErrors().getFieldError('phone')
1 * controller.recipientAddressService.storeAddressInformation(params, gift) >> recipientAddress
view == '/giftDetails/index'
}
}
實現DataTest
即: ...implements ControllerUnitTest<GiftDetailsController>, DataTest {
修復了 DomainClass 驗證,但破壞了控制器獲取已保存禮物的能力。
有沒有辦法讓 DomainClass 驗證在 ControllerUnit 測試中工作?
使用 mockDomains 實現 DataTest 並且必須刪除自定義數據存儲。
@Transactional
class GiftDetailsControllerTest extends Specification implements ControllerUnitTest<GiftDetailsController>, DataTest {
// @Shared
// @AutoCleanup
// SimpleMapDatastore dataStore = new SimpleMapDatastore([ConnectionSource.DEFAULT, "reporting"], RecipientAddress, Gift)
void setupSpec() {
mockDomains RecipientAddress, Gift
}
....
有沒有辦法讓 DomainClass 驗證在 ControllerUnit 測試中工作?
是的。
你可能想要這樣的東西......
class GiftDetailsControllerTest extends Specification implements ControllerUnitTest<GiftDetailsController>, DataTest {
Class[] getDomainClassesToMock() {
[Gift]
}
// ...
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.