Как издеваться за полезной нагрузкой буферредер HTTPServletRequest в Grails / Spock

StackOverflow https://stackoverflow.com//questions/25087226

Вопрос

У меня есть контроллер Grails, который ожидает полезной нагрузки XML.

Я получу полезную нагрузку XML, как это в контроллере Grails.

def xmlPayload = request.reader.text
.

Эта часть работает нормально, но я изо всех сил пытаюсь издеваться над этой полезной нагрузкой в модульном тесте.

Я пробовал оба из следующего, но отладчик показывает «запрос. Reader», чтобы быть нулевым в обоих подходах.

Подход № 1:

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-я строка обоих подходов), но пока не повезло.

Спасибо за любые идеи.

Это было полезно?

Решение

Вы можете сделать:

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/>'
    }
}
.

См. См.Контроллеры .

Другие советы

Если вам нужно только предоставить содержимое для запроса, то вам не нужно ничего подниматься.

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

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

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

Одной из целей таких классов MOCK (как в весеннем тесте и т. Д.) - избежать явного издевания с внешними библиотеками.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top