如何在域类中模拟验证以进行测试?

时间:2014-09-22 16:05:08

标签: validation unit-testing grails

我有一个使用自定义验证程序的域类,它非常复杂;它需要一个单独的合作者。现在我正在为它创建一个控制器,但我想模拟有关验证的部分。我希望能够判断何时发生某个验证错误,以便控制行为。

例如,我有,

class Person {

    static constraint = {
        key validator: {
            //complex stuff goes here
        }
    }

}

在我的控制器规范中,我希望能够告诉我何时希望验证通过或失败。我试过Person.metaClass.validate = { true },但它似乎没有用。这就是我的测试代码的样子。

void "Test controller when validation passes"() {
    when:
    controller.json = new Person(...)
    controller.doSomething()

    then:
    //test post condition, etc.
}

如果没有任何作用,我只想直接嘲笑命令对象,比如

void "Test controller when validation passes"() {
    when:
    controller.doSomething(Mock(Person))

    then:
    1 * _.changeState(_)
    //test post condition, etc.
}

但如果我能让第一个工作,我会更喜欢它。

1 个答案:

答案 0 :(得分:0)

我的项目中有类似的任务。我们的实现包括 ErrorsContainer 类,它通过封装一组对象如何交互来表示Mediator design pattern的概念。 Mediator通过使对象明确地相互引用来促进松散耦合,并且它允许您独立地改变它们的交互。

此方法的另一个优点是您可以缓存验证过程的结果。当应用于相同的前提条件,对象和规则时 - 它可以提高性能。

关于

  

我希望能够判断我希望验证何时通过或失败

您可以将其称为isEmpty(),并在以下简单代码中使用它:

public class ValidationProcessor {
    private ErrorsContainer errorsContainer;

    //process Validation 

    ........

    //if validation errors are found add them 
    //into the container

    ........

    //allow to manage the Validation process
    public void SetValidationState(boolean isPassState){
        if(isPassState){
           //set it's state to 'pass'
           errorsContainer.setEmpty();
        }else{
          //apply logic when validation errors are found 
        }
    }

    public void UseCurrentValidationState(){
        if(errorsContainer.isEmpty()){
           //apply logic when no validation errors are found
        }else{
          //apply logic when validation errors are found 
        }
    }
}