【问题标题】:Grails 3.1 Testing Controllers as IntegrationGrails 3.1 测试控制器作为集成
【发布时间】:2016-03-15 09:10:40
【问题描述】:

我在使用 Grails 3(更具体的 Grails 3.1.3)对控制器进行集成测试时遇到问题。

正如文档所说,现在测试控制器建议创建一个 Geb 功能测试,但是将我必须的所有控制器测试转换为 Geb 是一项艰巨的工作。

我尝试使用注释@Integration 转换测试并扩展GebSpec

我遇到的第一个问题是模拟 GrailsWeb,但我用GrailsWebMockUtil.bindMockWebRequest(ctx) 解决了它(ctxWebApplicationContext 类型的对象)。 现在,问题是当控制器呈现一些内容或重定向到另一个动作/控制器时。到目前为止,我在 setupSpec 阶段解决了这个覆盖渲染或重定向的方法:

controller.metaClass.redirect = { Map map ->
    redirectMap = map
}

controller.metaClass.render = { Map map ->
    renderMap = map
}

但这不起作用,因为当您在测试中尝试在thenexpect 阶段获取renderMapredirectMap 时,这些都是空的。

有人知道解决办法吗?

编辑(澄清):

我编辑我的问题以澄清问题:

非常感谢您@JeffScottBrown 的回复。正如我所提到的,这个解决方法是解决控制器测试作为 Grails 3 中的集成测试的问题,尝试转换我们在 Grails 2.x 中的所有测试。 我知道最好的解决方案是将其作为单元测试或功能测试,但我想知道是否有一个“简单”的解决方案可以将其保持在 Grails 2.x 版本中。

我附上了我的小project,它显示了我想要做的事情。在这个项目中,控制器有两个动作。一个动作呈现一个模板,另一个动作呈现一个视图。 在测试中,如果我检查呈现模板的操作,modelAndView 对象为空。这就是我为什么要覆盖renderredirect 的原因。

【问题讨论】:

  • 你不应该在集成测试中调用bindMockWebRequest
  • “正如文档所说,现在测试控制器建议创建 Geb 功能测试” - 如果您想编写功能测试,建议您创建 Geb 测试。单元测试还是应该写成单元测试,不涉及 Geb。
  • 你不应该在集成测试中做类似controller.metaClass.redirect = { ... }的事情。
  • 非常感谢您对@JeffScottBrown 的回复。正如我所提到的,这种解决方法是为了解决 Grails 3 中控制器测试作为集成测试的问题,尝试转换我们在 Grails 2.x 中的所有测试。

标签: grails integration-testing grails-3.1


【解决方案1】:

您的集成测试中有很多东西在集成测试中无效或不是一个好主意。我不知道您是否真的在问如何编写集成测试,或者特别是如何在示例应用程序中测试场景。在示例应用中测试场景的方法是使用单元测试。

// src/test/groovy/integrationtestcontroller/TestControllerSpec.groovy
package integrationtestcontroller

import grails.test.mixin.TestFor
import spock.lang.Specification

@TestFor(TestController)
class TestControllerSpec extends Specification {

    void "render the template"() {
        when:
        controller.index()

        then:
        response.text == '<span>The model rendered is: parameterOne: value of parameter one - parameterTwo: value of parameter two</span>'
    }

    void "render the view"() {
        when:
        controller.renderView()

        then:
        view == '/test/testView'
        model.parameterOne == 'value of parameter one'
        model.parameterTwo == 'value of parameter two'
    }
}

【讨论】:

  • 再次非常感谢您的回复;)我对您显示的代码有疑问,是否可以在第一次测试中访问modelAndView 对象(模板的渲染是制作的)?我认为这是我最初问题的关键。非常感谢!
猜你喜欢
  • 2023-04-04
  • 2013-02-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-18
相关资源
最近更新 更多