Как вы выполняете модульное тестирование состояния ответа контроллера Grails?

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

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>

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

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

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


person haydenmuhl    schedule 07.12.2010    source источник


Ответы (2)


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

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()}
person Romain    schedule 30.03.2011
comment
в Grails 2.2+ можно просто использовать response.status при условии, что вы правильно используете аннотацию @TestFor. - person Joseph; 27.03.2014

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

person sun007    schedule 29.06.2013