2014-09-13 68 views
1

我目前遇到的問題是使用grails 2.4.2驗證spock中的約束消息。在測試時,我不斷收到默認的錯誤消息,而不是我的自定義消息。但是,當我打印到使用Grails錯誤標籤的視圖時,我收到了正確的錯誤消息。我甚至從message.propperties中刪除了默認值。 這裏是我的規格是什麼樣子:Grails:使用spock測試約束錯誤消息

import com.fishLogger.user.User 
import com.fishLogger.DomainErrorHandling 

import grails.test.mixin.TestFor 
import org.springframework.context.MessageSource 
import spock.lang.Specification 

/** 
* See the API for {@link grails.test.mixin.domain.DomainClassUnitTestMixin} for usage  instructions 
*/ 
@TestFor(User) 
class UserSpec extends Specification { 
MessageSource messageSource 

def setup() { 
    DomainErrorHandling.enable(new User()) 
} 

def cleanup() { 
} 

void "test Invalid User Name Errors"(){ 
    when: 
    User user = new User(userName:userName, password:password, email:email) 
    //user.errors.allErrors.get(0).code 
    user.validate() 
    then:  
    user.errorMessage()==expectedMessage 


    where: 
    userName    | password   | email     | expectedMessage 
    ""      |"vailidPassword" | "[email protected]" | "User name must be entered" 
    //"asd"     |"vailidPassword" | "[email protected]" | "User name must be atleast 6 chacters long" 
    //" "      |"vailidPassword" | "[email protected]" | "User name must be entered" 
    //"aaaaaaaaaaaaaaaaaaaaa" |"vailidPassword" | "[email protected]" | "User name can not be greater than 20 characters" 
} 

啓用其中一個電話加載幫助方法域搶錯誤信息

class DomainErrorHandling { 

public static void enable(Object obj){ 
    obj.class.metaClass.errorMessage = { 
     MessageSource messageSource = Holders.applicationContext.getBean("messageSource") 
     def errorString = delegate?.errors?.allErrors?.collect{error -> 
      messageSource.getMessage(error,Locale.default) 
      }?.join(' \n') 
     return errorString 
     } 
} 
} 

任何幫助或指導將是巨大的。我知道測試錯誤消息應該更多的是UI測試,但我真的更願意用我的單元測試來測試它們。

回答

-1

至於爲什麼當您從message.properties中刪除舊消息時,請檢查MessageSourceResolvable中的getDefaultMessage()。我猜測你的自定義消息對於測試是不可見的,或者是因爲它的關鍵字拼寫錯誤或者一些Grails測試引導程序問題。

我會嘗試在errorMessage()方法中打印出錯誤的getCodes(),並查看列出的任何代碼是否是message.properties中的一個自定義密鑰的密鑰。

-1

假設Book域類與非可空name屬性,你可以做到以下幾點:

@Mock(Book) 
class BookSpec extends Specification { 
    StaticMessageSource messageSource 

    def setup() { 
     messageSource = (StaticMessageSource)grailsApplication.mainContext.getBean('messageSource') 
    } 

    def "check name validation error message"() { 
     given: 
     messageSource.addMessage ("nullable.name", Locale.default, "Null!") 
     Book book = new Book (name:null) 

     when: 
     book.validate() 

     then: 
     messageSource.getMessage (book.errors.getFieldError ('name'), Locale.default) == "Null!" 
    } 
}