我在使用Grails 3(更具体的Grails 3.1.3)对控制器进行集成测试时遇到了问题。Grails 3.1将控制器测试为集成
正如文档所述,现在建议使用测试控制器来创建一个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
}
但这不起作用,因为当你试图获得renderMap
或redirectMap
在then
或expect
阶段测试,这些都是空。
有谁知道可能的解决方案是什么?
编辑(澄清):
编辑我的问题,以澄清问题:
非常感谢您的回复@JeffScottBrown。正如我所提到的,这个解决方法是解决控制器测试在Grails 3中作为集成测试的问题,试图改变我们在Grails 2.x中进行的所有测试。 我知道最好的解决方案是将它作为单元测试或功能测试,但我想知道是否有一个“简单”的解决方案来保持它在Grails 2.x版本中的版本。
我附上我的小project,显示我想要做什么。在这个项目中有两个动作的控制器。一个动作呈现模板,另一个动作呈现视图。 在测试中,如果我检查呈现模板的操作,则modelAndView
对象为空。这就是为什么我重写render
和redirect
的原因。
您不应该从集成测试中调用'bindMockWebRequest'。 –
“正如文档所述,现在推荐使用测试控制器来创建Geb功能测试” - 如果您想编写功能测试,建议您创建一个Geb测试。单元测试仍然应该写成单元测试,而不涉及Geb。 –
在集成测试中,你不应该像'controller.metaClass.redirect = {...}一样。 –