2012-09-10 64 views
1

我在Grails的這種約束對於這一領域:Grails getErrorCount()返回多個錯誤,如何獲取錯誤列表?

businessNumber(matches: '([0-9A-Z]*9)RA([0-9A-Z]*4)', maxSize: 15) 

我把最大範圍的約束,這樣的Grails嵌入在HTML視圖的maxlength屬性。我做一個單元測試,看起來像這樣的約束:

void testBusinessNumberExceedMaxSize(){ 
     mockChildrenSpecialAllowancesForm.setBusinessNumber("F%G&Hy934F4G6H%55") 
     assertFalse (mockChildrenSpecialAllowancesForm.validate()) 
     assertEquals ("maxSize",mockChildrenSpecialAllowancesForm.errors.businessNumber) 
     assertEquals (2, mockChildrenSpecialAllowancesForm.errors.getErrorCount()) 
    } 

然後,它會產生此故障:

testBusinessNumberExceedMaxSize(com.ass.socialservicescm.ChildrenSpecialAllowancesTests) 
| org.junit.ComparisonFailure: expected:<ma[xSize]> but was:<ma[tches]> 
    at org.junit.Assert.assertEquals(Assert.java:125) 
    at org.junit.Assert.assertEquals(Assert.java:147) 
    at com.ass.socialservicescm.ChildrenSpecialAllowancesTests.testBusinessNumberExceedMaxSize(ChildrenSpecialAllowancesTests.groovy:177) 

我認爲它違反了2個約束(因爲我的錯誤計數2)一個是maxSize,另一個是匹配。但是,我如何做maxSize約束的assertEquals?

注:我使用的Grails 2.0.0

回答

0

我使用它來解析所有驗證異常轉換成一個字符串,然後我在調用代碼做一個的assertEquals並將其與這樣的結果。也許有一種更簡單的方法,但現在這對我很有用。

public static String getErrorString(errors) { 
    StringBuffer errorMsg = new StringBuffer(); 
    errors.allErrors.each { 
     if (it instanceof org.springframework.validation.FieldError) { 
      if ((it.defaultMessage) == null) { 
       errorMsg.append('Error-> ObjectName:' + it.getObjectName() + ' /Field:' + it.getField() + ' /RejectedValue:' + it.getRejectedValue() + ".\n"); 
      } else { 
       errorMsg.append(doReplace((String) it.defaultMessage, it.arguments) + "\n"); 
      } 
     } 
    } 
    return errorMsg.toString(); 
} 

public static String doReplace(String error, Object[] arguments) { 
    int index = 0; 
    arguments.each { 
     error = error.replace("{" + index + "}", it.toString()); 
     index++; 
    } 
    return error; 
} 
0

我會嘗試

assert 'maxSize' in mockChildrenSpecialAllowancesForm.errors.getFieldErrors('businessNumber')*.code