在之前的博客文章中,我们了解了如何对模板进行单元测试或独立进行查看。 但是,如果我们要对使用render()
方法和带有template
键而不是视图的template
的控制器进行单元测试,该怎么办? 通常,视图和模型存储在响应的modelAndView
属性中。 我们甚至可以在测试代码中使用快捷方式(例如view
和model
来检查结果。 但是使用template
键调用render()
方法将仅执行模板(也在测试代码中),并将结果放入响应中。 使用响应的text
属性,我们可以检查结果。
在以下示例控制器中,我们使用header
模板并传递username
模型属性来呈现输出。
%{-- File: /grails-app/views/sample/_header.gsp --}%
<g:if test="${username}">
<h1>Hi, ${username}</h1>
</g:if>
<g:else>
<h1>Welcome</h1>
</g:else>
package com.mrhaki.grails.web
class SampleController {
def index() {
render template: 'header', model: [username: params.username]
}
}
使用此Spock规范,我们测试index()
动作:
package com.mrhaki.grails.web
import grails.test.mixin.TestFor
import spock.lang.Specification
@TestFor(SampleController)
class SampleControllerSpec extends Specification {
def "index action renders template with given username"() {
given:
params.username = username
when:
controller.index()
then:
response.text.trim() == expectedOutput
where:
username || expectedOutput
'mrhaki' || '<h1>Hi, mrhaki</h1>'
null || '<h1>Welcome</h1>'
}
}
假设我们不想测试实际模板的输出,而只想在测试代码中检查使用了正确的模板名称并且模型正确。 我们可以在测试代码中使用groovyPages
或views
属性来为模板分配模拟实现。 groovyPages
或views
由ControllerUnitTestMixin
类添加,如果我们使用@TestFor()
批注,则会自动完成。 这些属性是映射,其中键是模板位置,值是带有模板的模拟实现的字符串。 例如,我们的header
模板的模板位置是/sample/_header.gsp
。 我们可以使用以下语句分配模拟String实现: views['/sample/_header.gsp'] = 'mock implementation'
我们可以重写Spock规范,现在将模拟实现用于header
模板。 我们甚至可以在模拟实现中使用模型,因此我们可以检查模型是否正确发送到模板。
package com.mrhaki.grails.web
import grails.test.mixin.TestFor
import spock.lang.Specification
@TestFor(SampleController)
class SampleControllerSpec extends Specification {
def "index action renders mock template with given username"() {
given:
// Mock implementation with escaped $ (\$), because otherwise
// the String is interpreted by Groovy as GString.
groovyPages['/sample/_header.gsp'] = "username=\${username ?: 'empty'}"
// Or we can use views property:
//views['/sample/_header.gsp'] = "username=\${username ?: 'empty'}"
and:
params.username = username
when:
controller.index()
then:
response.text.trim() == expectedOutput
where:
username || expectedOutput
'mrhaki' || 'username=mrhaki'
null || 'username=empty'
}
}
- 用Grails 2.2.4编写的代码
- 来源文章