显示导航

如何测试域类约束

塞尔吉奥·德尔阿莫

365bet地区版本 4.0.1

365bet地区培训

365bet地区培训由创建并积极维护365bet地区框架的人们开发和交付

入门

在本指南中,您将学习如何为您的Domain类定义约束并单独测试这些约束。

您将需要什么

要完成本指南,您将需要以下内容

  • 花些时间在你手上

  • 体面的文本编辑器或IDE

  • 安装了JDK或更高版本JAVA首页适当配置

如何完成指南

要开始,请执行以下操作

要么

365bet地区指南存储库包含两个文件夹

  • 初始初始项目通常是一个简单的365bet地区应用程序,其中包含一些其他代码,可以帮助您快速入门

  • 完成一个完整的示例它是按照指南中介绍的步骤进行操作并将这些更改应用于文档的结果。初始

要完成指南,请转到初始

  • 光盘进入grails指南grails测试域类约束初始

您可以直接前往如果你光盘进入grails指南grails测试域类约束完成

编写申请

域类

创建一个持久性实体进行存储旅馆365bet地区实体在365bet地区中处理持久性的最常见方法是使用365bet地区365bet地区域类:

365bet地区域类满足Model View Controller MVC模式中的M,并表示映射到基础数据库表上的持久实体。在365bet地区中,域是位于grails应用程序域目录中的类。

grailsw创建域类Hotel配置成功创建grails应用程序域演示Hotel groovy创建src test groovy演示HotelSpec groovy

旅馆域类是我们的数据模型。我们定义了不同的属性来存储旅馆特点

grails应用程序域演示Hotel groovy
演示@禁止警告'DuplicateNumberLiteral')
酒店字符串名称字符串url字符串电子邮件字符串关于BigDecimal纬度BigDecimal经度静态的约束名称为空, maxSize: 255网址可为空真正, : 真正, maxSize: 255电子邮件可为空真正, 电子邮件: 真正, : 真正关于可为空真正
        标签纬度CustomValidator可以为空的纬度真正, 验证器值得obj错误如果小时空值 ) {
                返回 真正
            }
            如果小时90.0错误rejectValue'纬度', '范围太小')
                返回 
            }
            如果小时90.0错误rejectValue'纬度', '范围太大')
                返回 
            }
            真正
        }
        最终纬度CustomValidator经度可为空真正, 验证器值得obj错误如果小时空值 ) {
                返回 真正
            }
            如果小时180.0错误rejectValue'经度', '范围太小')
                返回 
            }
            如果小时180.0错误rejectValue'经度', '范围太大')
                返回 
            }
            真正
        }
    }

    标记酒店地图
    静态的关于类型的映射'文本'
    }
    最终酒店
}

我们定义多个验证约束

365bet地区约束为365bet地区提供了声明性DSL,用于定义验证规则架构生成和CRUD生成元数据

365bet地区365bet地区带有多个可立即使用的约束

您可以定义您的定制验证器如果需要的话

单元测试

我们想单元测试我们的验证约束

实施DomainUnitTest365bet地区特质表示我们正在测试365bet地区工件的域类

src测试groovy演示HotelSpec groovy
 酒店规格 延伸规格实施DomainUnitTest {

这是本指南的重点

当您将字符串列表传递给validate方法时,validate方法将仅验证您传递的属性。域类可能具有许多属性,这使您可以测试隔离时的属性验证

名称属性约束测试

我们要映射我们的那么具有VARCHAR的关系数据库的属性,我们希望此属性是必需的,并且最大字符长度

src测试groovy演示HotelSpec groovy
虚空 '测试名称不能为空'() {
    什么时候域名空值

    然后域验证'那么'域错误'那么''可为空'
}

虚空 '测试名称不能为空'() {
    什么时候域名''

    然后域验证'那么'])
}

虚空 '测试名称最多可包含字符'() {
    什么时候: '用于一串字符'
    海峡'一种' * 256域名str然后: '名称验证失败'域验证'那么'域错误'那么''超出了maxSize'

    什么时候: '用于一串字符'海峡'一种' * 255域名str然后: '名称验证通行证'域验证'那么'])
}

网址属性约束测试

我们要映射我们的具有VARCHAR的关系数据库的属性,我们希望此属性是有效的url或null或空白值

src测试groovy演示HotelSpec groovy
忽视
虚空 '测试网址最多可包含字符'() {
    什么时候: '用于一串字符'
    网址前缀'http'
    urlsufifx''
    海峡'一种' * (256urlprefifx大小urlsufifx大小str urlprefifx str urlsufifx域url str然后: '网址验证失败'域验证''域错误'''超出了maxSize'

    什么时候: '用于一串字符'海峡"${网址前缀}${'一种' * (255urlprefifx大小urlsufifx大小}${urlsufifx}"域网址str然后: 'url验证通过'域验证''])
}

展开('带有URL值的酒店验证应该已经返回了带有errorCode的期望值ExpectedErrorCode')
虚空 "测试网址验证"() {
    什么时候域网址值然后预期域验证''域错误''代码ExpectedErrorCode哪里预期的值ExpectedErrorCode空值                   | 真正     | 空值
    ''                     | 真正     | 空值
    'http hilton com'    | 真正     | 空值
    '希尔顿'               |     | '网址无效'
}

电子邮件属性约束测试

我们想要电子邮件是有效的电子邮件,或者为空值或空白值

src测试groovy演示HotelSpec groovy
展开('用电子邮件值验证的酒店应已返回预期的errorCode预期的ErrorCode')
虚空 "测试电子邮件验证"() {
    什么时候域电子邮件值然后预期域验证'电子邮件'域错误'电子邮件'代码ExpectedErrorCode哪里预期的值ExpectedErrorCode空值                   |  真正    | 空值
    ''                     |  真正    | 空值
    '电子邮件保护'   |  真正    | 空值
    '希尔顿'               |     | '电邮无效'
}
电子邮件验证程序确保其字符数少于

电子邮件唯一性约束测试

我们添加了一个限制酒店电子邮件地址

唯一性在数据库级别将属性约束为唯一性。唯一性是持久性调用,将查询数据库

您可以使用这样的测试来测试唯一约束

src测试groovy演示HotelEmailUniqueConstraintSpec groovy
演示进口 grails测试休眠HibernateSpec

禁止警告('方法名称')
 HotelEmailUniqueConstraintSpec 延伸休眠规范清单<getDomainClasses酒店定义 "酒店的电子邮件唯一约束"() {

        什么时候: '您使用名称和从未使用过的电子邮件地址实例化酒店'
        定义旅馆旅馆那么: '特兰西瓦尼亚酒店', 电子邮件: '电子邮件保护')

        然后: '酒店是有效实例'酒店验证: '我们可以保存它,然后返回一个非空的GORM实体'酒店保存: '还有另外一家酒店'酒店数老酒店数1

        什么时候: '使用相同的电子邮件地址实例化其他酒店'
        定义希尔顿旅馆那么: '希尔顿酒店', 电子邮件: '电子邮件保护')

        然后: '该酒店实例无效'希尔顿验证'电子邮件'])

        : '填充了唯一的错误代码'希尔顿错误'电子邮件'''

        : '试图保存也失败'希尔顿酒店: '没有添加酒店'酒店数老酒店数

关于属性约束测试

我们想要关于为空空白或文本块,我们不希望关于限于字符我们使用了映射在我们的域类中阻止以指示此特征

grails应用程序域演示Hotel groovy
静态的关于类型的映射'文本'
}

这些是验证的测试关于约束

src测试groovy演示HotelSpec groovy
虚空 '测试关于可以为空'() {
    什么时候关于域空值

    然后域验证'关于'])
}

虚空 '测试一下可以空白'() {
    什么时候关于域''

    然后域验证'关于'])
}

虚空 '测试一下可以有多个字符'() {
    什么时候: '用于一串字符'
    海峡'一种' * 256关于str的域然后: '关于验证通行证'域验证'关于'])
}

纬度和经度属性约束测试

我们想要纬度为null或介于度之间的值经度为null或介于度之间的值

您可能很想使用

纬度可为空: 真正, 范围: -90..90经度可为空: 真正, 范围: -180..180

但是,例如纬度使用将是有效值范围约束

设置为Groovy范围,该范围可以包含IntRange日期形式的数字或实现Comparable并提供下一个和上一个导航方法的任何对象

相反,我们正在使用自定义验证.

grails应用程序域演示Hotel groovy
可以为空的纬度真正, 验证器值得obj错误如果小时空值 ) {
        返回 真正
    }
    如果小时90.0错误rejectValue'纬度', '范围太小')
        返回 
    }
    如果小时90.0错误rejectValue'纬度', '范围太大')
        返回 
    }
    真正
}

这些是验证的测试纬度经度约束

src测试groovy演示HotelSpec groovy
展开('具有纬度值的酒店验证应该已经返回了带有errorCode的期望值ExpectedErrorCode')
虚空 '测试纬度验证'() {
    什么时候域纬度值然后预期域验证'纬度'域错误'纬度'代码ExpectedErrorCode哪里预期的值ExpectedErrorCode空值                   | 真正     | 空值
    0                      | 真正     | 空值
    0.5                    | 真正     | 空值
    90                     | 真正     | 空值
    90.5                   |     | '范围太大'
    -90                    | 真正     | 空值
    -180                   |     | '范围太小'
    180                    |     | '范围太大'
}

展开('具有纬度值的酒店经度应已返回预期的错误代码ExpectedErrorCode')
虚空 '测试经度验证'() {
    什么时候域经度值然后预期域验证'经度'域错误'经度'代码ExpectedErrorCode哪里预期的值ExpectedErrorCode空值                   | 真正     | 空值
    0                      | 真正     | 空值
    90                     | 真正     | 空值
    90.1                   | 真正     | 空值
    -90                    | 真正     | 空值
    -180                   | 真正     | 空值
    180                    | 真正     | 空值
    180.1                  |     | '范围太大'
    -180.1                 |     | '范围太小'
}

测试应用程序

运行测试

grailsw grails测试应用程序grails打开测试报告

要么

gradlew检查打开构建报告测试索引html