2011-03-26 34 views
5

我有一個用於註冊用戶的命令對象,我想檢查用戶的年齡。該命令對象具有服務依賴關係。我如何測試我的dateOfBirth屬性的自定義驗證器?現在看起來直接來自文檔,here單元測試依賴關係的命令對象的自定義驗證程序

class RegisterUserCommand { 

    def someService 

    String username 
    String password 
    String password2 
    String email 
    Date dateOfBirth 

    static constraints = { 
    // other constraints 
    dateOfBirth blank: false, validator: {val, obj -> 
     return obj.someService.calculateAge(val) >= 18 
    } 
    } 

所以基本上問題是:我怎樣才能模仿驗證閉包的'obj'參數?

回答

8

在命令對象上測試驗證的最簡單方法是使用GrailsUnitTestCase.mockForConstraintsTests。模擬驗證方法將應用於您的命令對象,您可以像在測試之外那樣調用validate()

下面是如何編寫單元測試的例子。約會對日期沒有意義,所以我將它更改爲nullable: false

import grails.test.GrailsUnitTestCase 

class RegisterUserCommandTests extends GrailsUnitTestCase { 
    RegisterUserCommand cmd 

    protected void setUp() { 
     super.setUp() 
     cmd = new RegisterUserCommand() 
     mockForConstraintsTests RegisterUserCommand, [cmd] 
    } 

    void testConstraintsNull() { 
     cmd.dateOfBirth = null 
     cmd.someService = [calculateAge: { dob -> 18 }] 
     def result = cmd.validate() 
     assert result == false 
     assert cmd.errors.getFieldErrors('dateOfBirth').code == ['nullable'] 
    } 

    void testConstraintsCustom() { 
     cmd.dateOfBirth = new Date() 
     cmd.someService = [calculateAge: { dob -> 17 }] 
     def result = cmd.validate() 
     assert result == false 
     assert cmd.errors.getFieldErrors('dateOfBirth').code == ['validator.invalid'] 
    } 
} 

請注意,您的服務將不會在單元測試注射(它會在雖然集成測試),所以你要麼需要嘲笑它,如上,或創建一個實例並將其分配給cmd.someservice

+0

沒有考慮模擬約束測試的命令對象:)它解決了這個問題。 – jjczopek 2011-03-27 10:20:26