2

文档说我们可以通过模拟参数来测试带有命令对象的控制器 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()
  ...
}

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

4

2 回答 2

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' 
      }
    }
  }
}
于 2013-04-08T16:14:21.330 回答
0

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

params.'player1.name' = "John"

因为这给出了空指针异常:

params.player1.name = "John"

当控制器正在执行时:

Game game = new Game(params)

游戏有:

Player player1
于 2014-07-20T11:01:55.480 回答