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