我有一个在 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命令对象。 (对它的实际作用有所信心)

也许将以上内容用作您的测试基础会有所帮助!

09-03 19:28