【发布时间】:2016-03-15 09:10:40
【问题描述】:
我在使用 Grails 3(更具体的 Grails 3.1.3)对控制器进行集成测试时遇到问题。
正如文档所说,现在测试控制器建议创建一个 Geb 功能测试,但是将我必须的所有控制器测试转换为 Geb 是一项艰巨的工作。
我尝试使用注释@Integration 转换测试并扩展GebSpec。
我遇到的第一个问题是模拟 GrailsWeb,但我用GrailsWebMockUtil.bindMockWebRequest(ctx) 解决了它(ctx 和WebApplicationContext 类型的对象)。
现在,问题是当控制器呈现一些内容或重定向到另一个动作/控制器时。到目前为止,我在 setupSpec 阶段解决了这个覆盖渲染或重定向的方法:
controller.metaClass.redirect = { Map map ->
redirectMap = map
}
controller.metaClass.render = { Map map ->
renderMap = map
}
但这不起作用,因为当您在测试中尝试在then 或expect 阶段获取renderMap 或redirectMap 时,这些都是空的。
有人知道解决办法吗?
编辑(澄清):
我编辑我的问题以澄清问题:
非常感谢您@JeffScottBrown 的回复。正如我所提到的,这个解决方法是解决控制器测试作为 Grails 3 中的集成测试的问题,尝试转换我们在 Grails 2.x 中的所有测试。 我知道最好的解决方案是将其作为单元测试或功能测试,但我想知道是否有一个“简单”的解决方案可以将其保持在 Grails 2.x 版本中。
我附上了我的小project,它显示了我想要做的事情。在这个项目中,控制器有两个动作。一个动作呈现一个模板,另一个动作呈现一个视图。
在测试中,如果我检查呈现模板的操作,modelAndView 对象为空。这就是我为什么要覆盖render 和redirect 的原因。
【问题讨论】:
-
你不应该在集成测试中调用
bindMockWebRequest。 -
“正如文档所说,现在测试控制器建议创建 Geb 功能测试” - 如果您想编写功能测试,建议您创建 Geb 测试。单元测试还是应该写成单元测试,不涉及 Geb。
-
你不应该在集成测试中做类似
controller.metaClass.redirect = { ... }的事情。 -
非常感谢您对@JeffScottBrown 的回复。正如我所提到的,这种解决方法是为了解决 Grails 3 中控制器测试作为集成测试的问题,尝试转换我们在 Grails 2.x 中的所有测试。
标签: grails integration-testing grails-3.1