【问题标题】:How to mock a HttpServletRequest's BufferedReader payload in Grails/Spock如何在 Grails/Spock 中模拟 HttpServletRequest 的 BufferedReader 有效负载
【发布时间】:2014-08-01 19:18:33
【问题描述】:

我有一个需要 XML 有效负载的 Grails 控制器。

我在 Grails 控制器中像这样获取 XML 有效负载。

def xmlPayload = request.reader.text

这部分工作正常,但我正在努力在单元测试中模拟这个有效负载。

我已经尝试了以下两种方法,但调试器在两种方法中都显示“request.reader”为空。

方法一:

void "test controller method"(){
    setup:
    def mockBufferedReader = Mock( BufferedReader )
    mockBufferedReader.getText() >> '<hello/>'
    request.getReader() >> mockBufferedReader
    ....

方法 #2:

void "test controller method"(){
    setup:
    def mockBufferedReader = Mock( BufferedReader )
    mockBufferedReader.getText() >> '<hello/>'
    request.metaClass.getReader = { -> mockBufferedReader }
    ....

单元测试中的“请求”是一个 GrailsMockHttpServletRequest,所以我想我可以像这样模拟它的方法(两种方法的第 3 行),但到目前为止还没有运气。

感谢您的任何想法。

【问题讨论】:

  • 规范是否在 spock 块中(何时、然后等)?
  • 不,这是在单个单元测试的开始;即,在任何 when:/then:/etc 之前的隐式“setup:”块中。块。我已将示例更新为更清晰。
  • request 到底是什么?如果它不是一个模拟,你不能只是:a)覆盖方法b)设置reader属性c)......没有任何Groovy魔法。如果是模拟,则 #1 方法应该有效
  • 您能提供一个最小的工作示例吗?

标签: unit-testing grails groovy spock


【解决方案1】:

你可以这样做:

class EchoController {
    def echo () {
        render (request.reader.text)
    }
}


@TestFor(EchoController)
class EchoSpec extends Specification {
    def "echos XML data" () {
        request.XML = '<hello/>'

        when:
        controller.echo ()

        then:
        response.text == '<hello/>'
    }
}

请参阅Unit Testing Controllers 中的测试 XML 和 JSON 请求

【讨论】:

  • 是的,我想多了。那钉了它!也感谢您的文档参考。
【解决方案2】:

如果你只需要为请求提供内容,那么你不需要模拟任何东西。

 def "Spock works as expected"() {
    given:
    def request = new GrailsMockHttpServletRequest(content: '<hello/>')

    when:
    def result = request.getReader().getText()

    then:
    result == '<hello/>'
 }

这种 Mock 类(如在 Spring Test 等中)的一个目的是避免使用外部库进行显式模拟。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-22
    • 1970-01-01
    • 2023-03-23
    相关资源
    最近更新 更多