单元测试grails中的嵌套命令对象

时间:2013-04-04 23:17:35

标签: unit-testing grails tdd

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

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

2 个答案:

答案 0 :(得分:1)

好吧,似乎你想要的可能,但需要一些代码: - )

数据绑定

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

为此,您可以创建自定义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' 
      }
    }
  }
}

答案 1 :(得分:0)

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

params.'player1.name' = "John"

这会给出空指针异常:

params.player1.name = "John"

当控制器正在执行时:

Game game = new Game(params)

游戏有:

Player player1