在 grails 控制器中模拟命令对象导致 hasErrors() 无论如何都返回 false !请帮忙

Posted

技术标签:

【中文标题】在 grails 控制器中模拟命令对象导致 hasErrors() 无论如何都返回 false !请帮忙【英文标题】:mocking command object in grails controller results in hasErrors() return false no matter what! Please help 【发布时间】:2011-02-24 11:50:33 【问题描述】:

我有一个控制器,它在控制器动作中使用命令对象。在 grails 的控制器单元测试中模拟此命令对象时,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
  )
 

【问题讨论】:

我搞定了。在将“表单”对象传递给被测操作之前,我必须调用 form.validate()。作为旁注......你在开玩笑吗?!说真的......在框架本身中,它会自动调用验证......但我必须在我的测试用例中这样做?这不能像在生产中那样工作吗?伙计,规则的一个又一个例外只是为了让它发挥作用。啊!在 Grails 中进行测试很糟糕。这是坏的。在原始 Spring 中更容易做到。 我遇到了同样的问题,我正在调用验证,正如您在评论中发布的那样,但后来找到了更好的方法。放入您的 setUp() mockCommandObject RegistrationForm 然后:RegistrationForm .metaClass.hasErrors() !delegate.validate() 并拆除:GroovySystem.metaClassRegistry.removeMetaClass RegistrationForm。 【参考方案1】:

你试过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 命令对象。 (获得一些对其实际工作的信心)

也许使用上述内容作为测试的基础会有所帮助!?!?

【讨论】:

mockForConstraintsTest() 似乎与 mockCommandObject 所做的差不多。如果我在测试的 setup() 中包含一个或两个,你的 testSomething() 似乎工作。只有当我不包括其中任何一个时它才会失败。既然是这种情况,其他使用 hasErrors() 的测试仍然没有返回 true :(

以上是关于在 grails 控制器中模拟命令对象导致 hasErrors() 无论如何都返回 false !请帮忙的主要内容,如果未能解决你的问题,请参考以下文章

在过滤器中访问 request.JSON 后 Grails 2.5.0 控制器命令对象绑定

Grails 命令对象可以有可变数量的参数吗?

Grails 命令对象自定义验证消息代码

Grails 命令对象:如何将 request.JSON 加载到其中?

如何在 grails 3.3.8 中模拟被测控制器的方法

如何在 Grails 中模拟域对象的静态方法?