【问题标题】:Unit Testing nested command objects in grails单元测试 grails 中的嵌套命令对象
【发布时间】:2013-04-04 23:17:34
【问题描述】:

文档说我们可以通过模拟参数来测试带有命令对象的控制器 http://grails.org/doc/latest/guide/testing.html#unitTestingControllers

我想知道这是否适用于嵌套命令对象?有人让这个工作吗?

例子:

控制器

def create(FormCommand form){
  form.validate()
  ...
}

命令

class FormCommand {
  InnerCommand cmd
}

class InnerCommand{
  String x
  static constraints ={
     x(nullable: false)
  }
}

测试

void testCreate(){
  params["inner.x"]="any"
  controller.create()
  ...
}

我的期望是命令对象被创建并且数据绑定工作,我也期望内部命令被验证。我是不是期望太高了?

【问题讨论】:

  • 您能否提供一个示例来说明您要验证的内容?
  • 我在这里使用 Grails 2.2.1 进行了测试。即使在 run-app 中,内部命令也保持为空,但如果你有一个域类而不是命令,那么它会被数据绑定填充。我用这种行为向用户邮件列表发送了一个问题,一旦我得到答案,我会在这里更新。
  • 感谢 Sergio,感谢您的努力

标签: unit-testing grails tdd


【解决方案1】:

好的,这似乎是你想要的,但需要一些代码:-)

数据绑定

对于嵌套命令对象,Grails 数据绑定需要内部命令的非空实例。

为此,您可以创建一个自定义org.codehaus.groovy.grails.web.binding.BindEventListener:

class InnerCommandBindEventListener împlements BindEventListener {
  public void doBind(Object target, MutablePropertyValues source, TypeConverter typeConverter) {
    target.cmd = new InnerCommand()
  }
}

并在你的 resources.groovy

中声明它
innerCommandBindEventListener(InnerCommandBindEventListener)

嵌套验证

要解决验证问题,您需要为您的 cmd 自定义验证器:

class FormCommand {
  InnerCommand cmd
  static constraints = {
    cmd nullable: false, validator: { cmd, obj ->
      // manually trigger the inner command validation
      if(!cmd.validate()) {
        return 'invalid.innercommand.message' 
      }
    }
  }
}

【讨论】:

  • 谢谢塞尔吉奥,有点失望。如果可行,我会试一试并更新。
  • 经过测试,你是对的。我们确实做了一些不同的事情。我会将其发布到问题的更新中。
【解决方案2】:

不确定是否完全适用于手头的问题,但至少对于控制器操作测试中的数据绑定来说,这是可行的:

params.'player1.name' = "John"

这会导致空指针异常:

params.player1.name = "John"

当控制器在做时:

Game game = new Game(params)

游戏有:

Player player1

【讨论】:

    猜你喜欢
    • 2010-12-24
    • 1970-01-01
    • 2023-03-22
    • 1970-01-01
    • 1970-01-01
    • 2013-04-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多