我有一个Grails控制器,需要一个XML有效负载。
我在Grails控制器中获取这样的XML有效负载。
def xmlPayload = request.reader.text
那部分工作正常,但我正在努力在单元测试中模拟这个有效载荷。
我已经尝试了以下两种方法,但是调试器在两种方法中都显示“request.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 }
....
单元测试中的'request'是GrailsMockHttpServletRequest,所以我假设我可以像这样模拟它的方法(两种方法的第3行),但到目前为止还没有运气。
感谢任何想法。
答案 0 :(得分: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请求。
答案 1 :(得分:1)
如果您只需要为请求提供内容,那么您不需要模拟任何内容。
def "Spock works as expected"() {
given:
def request = new GrailsMockHttpServletRequest(content: '<hello/>')
when:
def result = request.getReader().getText()
then:
result == '<hello/>'
}
此类 Mock 类的一个目的(如Spring Test等)是为了避免使用外部库进行显式模拟。