【发布时间】:2014-08-26 22:39:04
【问题描述】:
Grails 2.3.10.
如何为 Grails Spock 测试中的内容类型协商配置可用的 mime 类型?
当我试图告诉控制器生成 JSON 内容时,它似乎想要返回一个 HTTP 406 错误。我在我的测试代码中发送 Accept 标头;但是,解析器无法匹配它,因为 HTML 是唯一配置的 MIME 类型。
我的用例...
我使用 Grails respond 方法实现了一个控制器操作,该方法可以返回 JSON 响应。当我使用 REST API 调用到达端点时,我能够取回 JSON 输出(即使没有指定 Accept 标头)。
控制器代码:
@Transactional(readOnly = true)
class MyObjectController {
static allowedMethods = [save: 'POST']
static responseFormats = ['json']
def myService
@Transactional
def save(MyObject obj) {
obj.validate()
if (obj.hasErrors()) {
respond obj.getErrors(), [status: BAD_REQUEST]
}
myService.addNewCustomer(obj)
respond obj, [formats: responseFormats]
}
}
还有我的测试代码:
@TestFor(MyObjectController)
class MyObjectControllerSpec extends Specification {
def setup() {
}
def cleanup() {
}
void "test save - json success"() {
given:
def myObj = new MyObject()
controller.myService= Mock(MyObjectService)
when:
request.addHeader "Accept", "application/json"
controller.save(individual)
then:
response.status == HttpStatus.CREATED.value()
response.text == "{}" //.text is giving me an empty string
response.json.x == x //.json throws an exception (parsing an empty string)
}
}
我已在调试器中验证 obj 具有有效值,并且在控制器操作的最后一行调用了 respond 方法。
我发现在 Grails ResponseMimeTypesApi 类中,DefaultAcceptHeaderParser 仅使用 HTML mime 类型构建。即使正确读取了 JSON 接受标头,DefaultAcceptHeaderParser 也无法理解它,因为没有配置 mime 类型。
如何在我的单元测试规范中控制发送到 ResponseMimeTypesApi 的 mime 类型?
编辑
我也尝试过设置 response.format 属性,如this answer 中所建议的那样;但是,无济于事。
【问题讨论】:
标签: unit-testing grails controller spock grails-2.3