我有一个在 Controller Action 中使用命令对象的 Controller 。在grails的 Controller 单元测试中模拟此命令对象时,即使我故意违反了其约束,hasErrors()方法也始终返回false。更令人困惑的是,在生产中,hasErrors()起作用了!因此,这只是一个测试问题。
def save = { RegistrationForm form ->
if(form.hasErrors()) {
// code block never gets executed
} else {
// code block always gets executed
}
}
在测试本身中,我这样做:
mockCommandObject(RegistrationForm)
def form = new RegistrationForm(emailAddress: "ken.bad@gmail",
password: "secret", confirmPassword: "wrong")
controller.save(form)
我故意为其提供了错误的电子邮件地址,并且确保密码和ConfirmPassword属性不同。在这种情况下,hasErrors()应该返回true ...,但不是。如果这样的基本操作不起作用,我不知道我的测试如何可靠:/
这是RegistrationForm类,因此您可以看到我正在使用的约束:
class RegistrationForm {
def springSecurityService
String emailAddress
String password
String confirmPassword
String getEncryptedPassword() {
springSecurityService.encodePassword(password)
}
static constraints = {
emailAddress(blank: false, email: true)
password(blank: false, minSize:4, maxSize: 10)
confirmPassword(blank: false, validator: { confirmPassword, form ->
confirmPassword == form.password
})
}
}
最佳答案
您尝试过mockForConstraintsTests
吗?
例如。就像是...
void testSomething() {
mockForConstraintsTests(RegistrationForm)
def form = new RegistrationForm(emailAddress: "ken.bad@gmail", password: "secret", confirmPassword: "wrong")
form.validate()
assert 1 == form.errors.getErrorCount()
}
首先尝试在其自己的单元测试中测试
RegistrationForm
命令对象。 (对它的实际作用有所信心)也许将以上内容用作您的测试基础会有所帮助!