我目前在使用grails 2.4.2验证spock中的约束消息时遇到问题。测试时,我不断收到默认错误消息,而不是我的自定义消息。但是,当我使用grails错误标记打印到视图时,我得到正确的错误消息。我甚至从message.propperties中删除了默认值。 这是我的规范:
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" | "thisworks@email.com" | "User name must be entered"
//"asd" |"vailidPassword" | "thisworks@email.com" | "User name must be atleast 6 chacters long"
//" " |"vailidPassword" | "thisworks@email.com" | "User name must be entered"
//"aaaaaaaaaaaaaaaaaaaaa" |"vailidPassword" | "thisworks@email.com" | "User name can not be greater than 20 characters"
}
其中enable是一个调用,将一个帮助方法加载到域以获取错误消息
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测试,但我更愿意用我的单元测试来测试它们。
答案 0 :(得分:-1)
为什么在从message.properties中删除它时仍然显示旧消息,请查看MessageSourceResolvable中的getDefaultMessage()。我猜测你的自定义消息对于测试是不可见的,因为它的密钥拼写错误或者一些Grails测试引导程序问题。
我会尝试在errorMessage()方法中打印出错误的getCodes(),看看列出的任何代码是否是message.properties中某个自定义代码的关键。
答案 1 :(得分:-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!"
}
}