Unit testing 禁用grails命令对象中用于单元测试的验证约束(使用Spock)
我正在尝试编写一些用于命令对象验证的单元测试。 当我的命令对象有许多字段和许多验证规则时,为每个测试用例设置命令对象会变得过于冗长和重复 假设我有这个命令对象:Unit testing 禁用grails命令对象中用于单元测试的验证约束(使用Spock),unit-testing,testing,grails,groovy,spock,Unit Testing,Testing,Grails,Groovy,Spock,我正在尝试编写一些用于命令对象验证的单元测试。 当我的命令对象有许多字段和许多验证规则时,为每个测试用例设置命令对象会变得过于冗长和重复 假设我有这个命令对象: class MemberCommand { String title String name String phone static constraints = { title(blank: false, inList: ["Mr", "Mrs", "Miss", "Ms"])
class MemberCommand {
String title
String name
String phone
static constraints = {
title(blank: false, inList: ["Mr", "Mrs", "Miss", "Ms"])
name(blank: false, maxSize:25)
phone(blank: false, matches: /\d{8}/)
}
}
我想通过这样做来测试这一点:
class ValidationTitle extends UnitSpec {
def "title must be one of Mr, Mrs, Miss, Ms"() {
setup:
def memberCommand = new MemberCommand()
// I don't want to do:
// memberCommand.name = "Spock"
// memberCommand.phone = "99998888"
// Instead, I want to disable other constraints, except the one for title
mockForConstraintsTests MemberCommand, [memberCommand]
when:
memberCommand.title = t
then:
memberCommand.validate() == result
where:
t << ["Mr", "Mrs", "Miss", "Ms", "Dr", ""]
result << [true, true, true, true, false, false]
}
}
class ValidationTitle扩展了UnitSpec{
def“标题必须是先生、女士、小姐、女士之一”(){
设置:
def memberCommand=new memberCommand()
//我不想做:
//memberCommand.name=“Spock”
//memberCommand.phone=“999888”
//相反,我想禁用其他约束,除了标题约束
mockForConstraintsTests成员命令,[MemberCommand]
什么时候:
memberCommand.title=t
然后:
memberCommand.validate()==结果
哪里:
t您不能禁用特定的约束验证。但是,您可以为其余属性提供有效值,或者特别检查title
属性中的错误
在第一种情况下,只需创建一个具有默认(和有效)属性的映射,并从中初始化命令:
def validAttributes = [ title: 'Mr', name: 'Spock', phone: '99998888' ]
def "title must be one of Mr, Mrs, Miss, Ms"() {
setup:
def memberCommand = new MemberCommand(validAttributes)
mockForConstraintsTests MemberCommand, [memberCommand]
when:
memberCommand.title = t
then:
memberCommand.validate() == result
where:
t << ["Mr", "Mrs", "Miss", "Ms", "Dr", ""]
result << [true, true, true, true, false, false]
}
def validAttributes=[标题:'Mr',姓名:'Spock',电话:'9998888']
def“标题必须是先生、女士、小姐、女士之一”(){
设置:
def memberCommand=new memberCommand(验证属性)
mockForConstraintsTests成员命令,[MemberCommand]
什么时候:
memberCommand.title=t
然后:
memberCommand.validate()==结果
哪里:
I don’谢谢你的宝贵建议。非常感谢。因为我本来打算开始测试错误消息的,所以我可能最终会使用这两种方法的组合,即使用基线案例,同时检查特定于字段的错误。有趣的是,我又遇到了同样的问题,今天正在寻找解决方案,并想出了这个方法我大约一年前才发过帖子。
def "title must be one of Mr, Mrs, Miss, Ms"() {
setup:
def memberCommand = new MemberCommand()
mockForConstraintsTests MemberCommand, [memberCommand]
when:
memberCommand.title = t
memberCommand.validate()
then:
memberCommand.errors['title'] == result
where:
t << ["Mr", "Mrs", "Miss", "Ms", "Dr", ""]
result << [null, null, null, null, 'not.inList', 'not.inList']
}