Grails 3控制器单元测试:域类验证在ControllerUnitTest中不起作用

问题描述 投票:1回答:1

我正在将继承的Grails 2应用程序升级到3.3.10。我们有依赖于域类验证的控制器方法来控制逻辑流,但是当在Grails中运行时,我们无法使DomainClass验证在ControllerUnitTests中起作用。]

例如,GiftRecipientAddress是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验证在...

unit-testing grails grails-3.0 grails-3.3
1个回答
2
投票

是否有一种方法可以使DomainClass验证在ControllerUnit中工作测试?

© www.soinside.com 2019 - 2024. All rights reserved.