【问题标题】:Grails 4: How to Disable Deep Validation of Domain Objects for TestingGrails 4:如何禁用域对象的深度验证以进行测试
【发布时间】:2021-07-15 15:44:57
【问题描述】:

我正在迁移 Grails 2.4.4。应用;并且我的一些执行域对象验证的服务方法未通过测试,因为验证是级联到关联的。例如,

测试方法

class AdditionalPhotoServiceSpec extends HibernateSpec implements ServiceUnitTest<AdditionalPhotoService>, DataTest {

    Person person
    AdditionalPhotoType additionalPhotoType

    S3Service mockS3Service

    def setup() {
        [Person, AdditionalPhotoType, AdditionalPhoto, Organization].each { mockDomain(it) }
        person = new Person().save(validate: false)
        additionalPhotoType = new AdditionalPhotoType().save(validate: false)

        mockS3Service = Mock()
        service.s3Service = mockS3Service
    }

    def cleanup() {
    }

    def "create additional photo"() {
        when:
        assert person.organization.id
        AdditionalPhoto additionalPhoto = service.create(new AdditionalPhoto(person: person, additionalPhotoType: additionalPhotoType, bytes: [1, 2, 3]))

        then:
        additionalPhoto?.id

        and:
        1 * mockS3Service.storePhoto(testAdditionalPhoto())
    }

这是尝试创建一个AdditionalPhoto,其中包含两个已使用validate: false 保存的关联对象。

待测服务方法

class AdditionalPhotoService {

    S3Service s3Service

    boolean enableDeleteAllForDownloadedPhotos = false

    AdditionalPhoto create(AdditionalPhoto additionalPhoto) {
        additionalPhoto.validate()
        if (additionalPhoto.hasErrors())
            throw new InvalidResourceException(additionalPhoto.errors)

        deletePriorAdditionalPhotos(additionalPhoto)

        additionalPhoto.save()
        additionalPhoto.externalURL = s3Service.storePhoto(additionalPhoto)
        return additionalPhoto
    }
}

问题

测试失败是因为服务方法中的additionalPhoto.validate() 正在验证关联对象PersonAdditionalPhotoType,而不仅仅是AdditionalPhoto。对于生产,我喜欢这种行为,但我不希望对测试进行深度验证,因为它需要我创建与 PersonAdditionalPhotoType 及其关联及其关联等关联的所有域对象。它似乎它会创建冗长、脆弱的测试代码。

问题

如何在不更改生产代码的情况下仅针对测试禁用域对象的深度验证?


我已经看过的东西

【问题讨论】:

    标签: grails grails-orm spock


    【解决方案1】:

    事实证明,这两个问题几乎都满足了我的需求。

    我创建了以下application.groovy 文件。

    grails-app/conf/application.groovy

    environments {
        test {
            grails.gorm.default.mapping = {
                '*' cascade:'none'
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-17
      • 1970-01-01
      • 2017-01-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多