Как вы тестируете состояние ответа контроллера Grails? - PullRequest
1 голос
/ 07 декабря 2010

У меня есть следующие функции в контроллере

def render201 = {
    render(status:201)
}

def render202 = {
    response.setStatus(202)
}

def render203 = {
    response.setStatus(203)
    render(status:203)
}

def render204 = {
    response.setStatus(204)
    render(status:205)
}

И у меня есть следующие тесты

void test201() {
    controller.render201()
    assertEquals(201, controller.response.status)
}

void test202() {
    controller.render202()
    assertEquals(202, controller.response.status)
}

void test203() {
    controller.render203()
    assertEquals(203, controller.response.status)
}

void test204() {
    controller.render204()
    assertEquals(204, controller.response.status)
}

test201 завершается с этим сообщением

junit.framework.AssertionFailedError: expected:<201> but was:<200>

По какой-то причине, если вы явно не установили статус ответа, render всегда будет возвращать 200 при запуске из модульного теста.

Кроме того, если бы я действительно вызвал их из браузера, render202 вернул бы ошибку, но render201 и render203 работали бы просто отлично. Я не знаю, что сделает render204.

Что здесь происходит? Это ошибка в Grails?

Ответы [ 2 ]

2 голосов
/ 30 марта 2011

Попробуйте что-то вроде этого:

assertEquals(201, controller.renderArgs.status)

Это сработало для меня.

Если вы хотите понять внутреннюю часть mockController, посмотрите на: https://svn.codehaus.org/grails/trunk/grails/src/groovy/grails/test/MockUtils.groovy

clazz.metaClass.getForwardArgs = {-> fwdArgs}
clazz.metaClass.getRedirectArgs ={-> redArgs}
clazz.metaClass.getRenderArgs ={-> renArgs}
clazz.metaClass.forward = {Map map -> forwardArgs.putAll(map)}
clazz.metaClass.redirect = {Map map -> redirectArgs.putAll(map)}
clazz.metaClass.render = {String text -> delegate.response.writer << text}
clazz.metaClass.render = {Converter arg -> delegate.response.writer << arg.toString()}
1 голос
/ 29 июня 2013

ожидается: <201>, но было: <200> означает, что вы пытаетесь запросить операцию, которая возвращает некоторый ответ. Если вы хотите проверить 201 необходимо аннулировать метод.

...