Как издеваться за полезной нагрузкой буферредер HTTPServletRequest в Grails / Spock
-
02-01-2020 - |
Вопрос
У меня есть контроллер 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 (как в весеннем тесте и т. Д.) - избежать явного издевания с внешними библиотеками.