繁体   English   中英

Grails 3 Controller 单元测试:域 class 验证在 ControllerUnitTest 中不起作用

[英]Grails 3 Controller Unit Testing: Domain class validation not working in a ControllerUnitTest

我正在将继承的 Grails 2 应用程序升级到 3.3.10。 我们有依赖域 class 验证来控制逻辑流的 controller 方法,但是在 Grails 3 中运行时,我们无法在 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
            ]
        }
    }

在以下测试中,当我调试 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM