gpt4 book ai didi

Grails Controller 测试在渲染模板时对模型进行断言?

转载 作者:行者123 更新时间:2023-12-02 10:19:30 25 4
gpt4 key购买 nike

使用 Grails 2.1.0

似乎是从 Controller 执行此操作:

render(view: "someView", model: [modelEntry: "hello"]) 

允许我在该 Controller 的单元测试中执行此操作:

controller.method() 
assert model.modelEntry == "hello"

但是,如果我更改 Controller 来执行此操作:

render(template: "someTemplate", model: [modelEntry: "hello"]) 

现在测试中的模型实例是一个空数组。我对此进行了大量搜索,大多数解决方案似乎适用于 Grails 1,通常涉及 modelAndView 对象(在我的测试中不存在)或 renderArgs (同上)。

我发现的唯一解决方案是手动覆盖测试中的 View ,如下所示:

views['_someTemplate.gsp'] = '${modelEntry}'

然后对字符串进行断言。但我不喜欢这个解决方案,因为它:

  1. 要求测试知道模板的文件名
  2. 使得测试没有良好 toString() 方法的模型条目变得困难
  3. 使得对相关模型条目做出多个断言变得困难。

当 Controller 渲染模板时,有什么方法可以更直接地从测试用例中获取模型中的条目吗?

最佳答案

深入研究一下渲染方法的代码(org.codehaus.groovy.grails.web.metaclass.RenderDynamicMethod),我可以看到modelAndView是仅在渲染 View 时设置。

渲染模板确实会返回 null modelAndView。

要检查本例中的模型,我认为您可以使用 Groovy metaClass。思路是拦截原来的方法,存储值然后调用他。

基于this question ,我构建了这个(未经测试,可能需要调整):

@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'

}

关于Grails Controller 测试在渲染模板时对模型进行断言?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15141319/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com