haydenmuhl
haydenmuhl

Reputation: 6146

How do you unit test the response status of a Grails controller?

I have the following functions in a controller

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)
}

And I have the following tests

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 fails with this message

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

For some reason, if you don't explicitly set the response status, render will always return 200 when being run from a unit test.

Additionally, if I were to actually call these from a browser, render202 would return an error, but render201 and render203 would work just fine. I don't know what render204 would do.

What's going on here? Is this a bug in Grails?

Upvotes: 1

Views: 3350

Answers (2)

Nitin
Nitin

Reputation: 3842

expected:<201> but was:<200> means you try to request operation which is returning some response. If you want to test 201 need to void method.

Upvotes: 1

Romain
Romain

Reputation: 1105

Try something like this :

assertEquals(201, controller.renderArgs.status)

It worked for me.

If you want to understand the inside of mockController, look at : 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()}

Upvotes: 2

Related Questions