我正在将继承的Grails 2应用程序升级到3.3.10。我们有依赖于域类验证的控制器方法来控制逻辑流,但是当在Grails中运行时,我们无法使DomainClass验证在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 ] } }
在以下测试中,当我调试控制器方法时,它会执行所有预期的操作,但是
recipientAddress.hasErrors()
始终返回true
,并且测试失败。
即:
@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测试中工作?
使用嘲笑域实现了DataTest,并且不得不删除了自定义dataStore。
@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
}
....
我正在将继承的Grails 2应用程序升级到3.3.10。我们有依赖于域类验证的控制器方法来控制逻辑流,但是我们无法让DomainClass验证在...
是否有一种方法可以使DomainClass验证在ControllerUnit中工作测试?