Grails控制器单元测试不会将页面呈现给response.text

时间:2014-04-17 00:42:10

标签: unit-testing grails testing spock

我的环境配置:Java 1.7u51,Grails 2.3.7

我正在尝试在Controller Test中断言response.text,但它总是带来“”。

发生了什么事?

这是我的UserController

class UserController {

    def index() {
        flash.errors = "$params.secret"
        render view: "index", model: [model: params.toModel, 
                text: params.username]
    }
}

这是/user/index.gsp文件

${text}

这是我的规范

@TestFor(UserController)
class UserControllerSpec extends Specification {

    def setup() {
    }

    def cleanup() {
    }

    void "test something"() {

        given:
            params.username = "USERNAME"
            params.password = "SECRET"
            params.toModel = "Model"

        when: 
            controller.index()

        then: 
            flash.errors
            view == "/user/index"
            params.username == response.text
            model.model == params.toModel
    }
}

测试报告是:

Failure:  |
test something(teste.UserControllerSpec)
 |
Condition not satisfied:

params.username  == response.text
|      |         |  |        |
|      USERNAME  |  |        ""
|                |  org.codehaus.groovy.grails.plugins.testing.GrailsMockHttpServletResponse@46f29a61
|               false
|               8 differences (0% similarity)
|               (USERNAME)
|               (-------)
[username:USERNAME, password:SECRET, toModel:Model]

1 个答案:

答案 0 :(得分:3)

仅在模板渲染的情况下,模板的内容直接呈现为响应为String。因此,只有在呈现模板时才能使用response.text,这与呈现view的情况不同。

为了测试呈现视图,必须使用GroovyPageUnitTestMixin,如下所示:

import grails.test.mixin.TestMixin
import spock.lang.Specification
import grails.test.mixin.web.GroovyPageUnitTestMixin

@TestMixin(GroovyPageUnitTestMixin)
class UserControllerSpec extends Specification {
    def controller

    def setup(){
        controller = testFor(UserController)
    }

    void "test something"() {
        given:
            params.username = "USERNAME"
            params.password = "SECRET"
            params.toModel = "Model"

        when:
            controller.index()

        then:
            flash.errors
            view == "/user/index"
            model.model == params.toModel

            //method provided by mixin which mimics render method in 
            //controller. Make sure model is also passed in the map arg
            //since view uses model.text

            render(view: "/user/index", model: model) == 'USERNAME'
    }
}

注意:

  • @TestFor在测试中被Mixin替换。因此,必须使用setup()方法在testFor()中看到控制器。
  • render()也可用于测试模板呈现,其中键template类似于map参数中键view的使用。