Grails控制器在呈现模板时测试关于模型的断言?

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

使用Grails2.1.0

似乎从控制器执行此操作:

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}'
然后对字符串进行断言。但我不喜欢这个解决方案,因为它:

  • 要求测试知道模板的文件名
  • 使测试没有好的toString()方法的模型条目变得困难
  • 使对相关模型条目进行多个断言变得困难
    当控制器呈现模板时,是否有任何方法可以更直接地从测试用例中获取模型中的条目

    在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,您可以提出一个问题,要求以更好的方式访问测试的模板模型。这就是改进的美妙之处:)