Grails控制器在呈现模板时测试关于模型的断言?
使用Grails2.1.0 似乎从控制器执行此操作:Grails控制器在呈现模板时测试关于模型的断言?,grails,Grails,使用Grails2.1.0 似乎从控制器执行此操作: render(view: "someView", model: [modelEntry: "hello"]) controller.method() assert model.modelEntry == "hello" 允许我在该控制器的单元测试中执行此操作: render(view: "someView", model: [modelEntry: "hello"]) controller.method() assert mo
render(view: "someView", model: [modelEntry: "hello"])
controller.method()
assert model.modelEntry == "hello"
允许我在该控制器的单元测试中执行此操作:
render(view: "someView", model: [modelEntry: "hello"])
controller.method()
assert model.modelEntry == "hello"
但是,如果我更改控制器以执行此操作:
render(template: "someTemplate", model: [modelEntry: "hello"])
现在,测试中的模型实例是一个空数组。我对此做了很多搜索,大多数解决方案似乎都是针对Grails1的,通常涉及modelAndView
对象(在我的测试中不存在)或renderags
(同上)
我找到的唯一解决方案是手动覆盖测试中的视图,如下所示:
views['_someTemplate.gsp'] = '${modelEntry}'
然后对字符串进行断言。但我不喜欢这个解决方案,因为它:
当控制器呈现模板时,是否有任何方法可以更直接地从测试用例中获取模型中的条目 在render方法的代码(
org.codehaus.groovy.grails.web.metaclass.RenderDynamicMethod
)中稍微挖掘一下,我可以看到只有在渲染视图时才会设置modelAndView
呈现模板将返回空modelAndView
在这种情况下,为了检查模型,我认为可以使用Groovy元类
。想法是截取原始方法,存储值,然后调用他
基于,我构建了以下内容(未测试,可能需要调整):
controller.modelAndView.model
不存在?@SérgioMichels正确,controller.modelAndView
为空。请记住,这是使用惯用的Grails 2样式,其中测试被声明为@TestFor(WhateverController)
,并且测试不扩展任何内容。我不确定modelAndView是否适用于Grails1,也不知道为什么我总是看到这个建议,但Grails2的这种类型的测试中并没有这个建议。是的,这是有效的。令人惊讶的是,它需要这种诡计。实际上,我已经将您的解决方案向前推进了一步,而不是templateModel,我实际上在controller实例上分配了一个modelAndView,使其余的代码能够像您所期望的那样工作。如果它是一个viewWell,您可以提出一个问题,要求以更好的方式访问测试的模板模型。这就是改进的美妙之处:)