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()
...
}
我的期望是创建命令对象并且数据绑定有效,我也期望验证内部命令。我期待太多了吗?
答案 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