使用Grails 2.1.0
似乎从控制器执行此操作:
render(view: "someView", model: [modelEntry: "hello"])
Run Code Online (Sandbox Code Playgroud)
允许我在该控制器的单元测试中执行此操作:
controller.method()
assert model.modelEntry == "hello"
Run Code Online (Sandbox Code Playgroud)
但是,如果我更改控制器来执行此操作:
render(template: "someTemplate", model: [modelEntry: "hello"])
Run Code Online (Sandbox Code Playgroud)
现在测试中的模型实例是一个空数组.我已经做了很多搜索,并且大多数解决方案似乎都是针对Grails 1的,通常涉及modelAndView对象(我的测试中不存在)或renderArgs(同上).
我发现的唯一解决方案是手动覆盖测试中的视图,如下所示:
views['_someTemplate.gsp'] = '${modelEntry}'
Run Code Online (Sandbox Code Playgroud)
然后对字符串进行断言.但我不喜欢这个解决方案,因为它:
当控制器呈现模板时,有没有办法从测试用例更直接地获取模型中的条目?
Sér*_*els 10
在render方法(org.codehaus.groovy.grails.web.metaclass.RenderDynamicMethod)的代码中挖掘一点我可以看到modelAndView只有在渲染时才设置view.
渲染模板确实会返回null modelAndView.
在这种情况下检查模型我认为你可以使用Groovy metaClass.想法是拦截原始方法,存储值然后给他打电话.
基于这个问题,我建立了这个(没有经过测试,可能需要调整):
@TestFor(MyController)
class MyControllerTests
def templateModel
@Test
void inspectTemplateModel() {
def originalMethod = MyController.metaClass.getMetaMethod('render', [Map] as Class[])
controller.metaClass.render = { Map args ->
templateModel = args.model
originalMethod.invoke(delegate, args)
}
controller.method()
assert templateModel.modelEntry == 'foo'
}
Run Code Online (Sandbox Code Playgroud)