Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unit testing 禁用grails命令对象中用于单元测试的验证约束(使用Spock)_Unit Testing_Testing_Grails_Groovy_Spock - Fatal编程技术网

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']
}