我的环境配置: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]
答案 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
的使用。