2014-09-22 76 views
0

我有一個使用自定義驗證器的域類非常複雜;它需要一個單獨的合作者。現在我正在爲它創建一個控制器,但我想模擬關於驗證的部分。我希望能夠知道何時發生某種驗證錯誤,以便控制行爲。如何在域類中進行模擬驗證以進行測試?

例如,我有,

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. 
} 

,但如果我能得到的第一個工作,我寧願它更多。

回答

0

我在我的項目中有類似的任務。我們的實現包括ErrorsContainer類,它通過封裝一組對象如何交互來表示Mediator design pattern的概念。介體通過讓對象明確地互相引用來促進鬆散耦合,並且可以讓您獨立地改變它們的相互作用。

這種方法的另一個優點是你可以在緩存驗證過程的結果。當應用於相同的前提條件,對象和規則時 - 它可以提高性能。

關於

我希望能夠告訴時,我想驗證通過或失敗

你可以調用它的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 
     } 
    } 
}