Recently, I had to write the Integration test cases for a controller and I had extended my test Spec with IntegrationSpec. While writing the test case for action that renders a template with model I came to know that there’s no straight and simple way to test it. For example, action looked like:

class UserController {

    static allowedMethods = [save: "POST", update: "PUT", delete: "DELETE"]

    def list = {
        render(template: 'list', model: [userInstanceList:User.list(params)])
    }

// more actions
}

Now, in order to test it, we need to add the following code to the setup method:

UserController.metaClass.render = { Map map ->
            renderedMap = map
        }

so that the overall test script for the controller looks like:

class UserControllerSpec extends IntegrationSpec{

    UserController controller
    Map renderedMap

    public void setup() {
        controller = new UserController()

        UserController.metaClass.render = { Map map ->
            renderedMap = map
        }
    }

    public void cleanup() {

    }

    void "test list"(){
        when:
        controller.list()

        then:
        renderedMap
        renderedMap.template
        renderedMap.template.equals('list')
        renderedMap.model
        renderedMap.model.userInstanceList.size() > 0
    }
}

Now, you will be able to get the name of the rendered template with renderedMap.template and the model with renderedMap.model. If your test case renders a view then the view name would be available with renderedMap.view.
You can see the whole working code/application here.