我目前在使用 grails 2.4.2 在 spock 中验证我的约束消息时遇到问题。测试时,我不断收到默认错误消息,而不是我的自定义消息。但是,当我使用 grails 错误标记打印到 View 时,我得到了正确的错误消息。我什至从 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 测试,但我真的更喜欢用我的单元测试来测试它们。
最佳答案
至于为什么从message.properties中删除它时仍然显示旧消息,请查看MessageSourceResolvable中的getDefaultMessage()。我猜您的自定义消息对测试不可见,要么是因为它的键拼写错误,要么是一些 Grails 测试引导问题。
我会尝试在您的 errorMessage() 方法中打印出错误的 getCodes(),并查看列出的任何代码是否是 message.properties 中自定义代码之一的关键。
关于unit-testing - Grails:使用 spock 测试约束错误消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25824474/