Grails的好处:从控制器进行单元测试渲染模板

之前的博客文章中,我们了解了如何对模板进行单元测试或独立进行查看。 但是,如果我们要对使用render()方法和带有template键而不是视图的template的控制器进行单元测试,该怎么办? 通常,视图和模型存储在响应的modelAndView属性中。 我们甚至可以在测试代码中使用快捷方式(例如viewmodel来检查结果。 但是使用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>'
    }
 
}

假设我们不想测试实际模板的输出,而只想在测试代码中检查使用了正确的模板名称并且模型正确。 我们可以在测试代码中使用groovyPagesviews属性来为模板分配模拟实现。 groovyPagesviewsControllerUnitTestMixin类添加,如果我们使用@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的好处: JDriven博客上来自我们的JCG合作伙伴 Hubert Ikkink的Controller中的单元测试渲染模板

翻译自: https://www.javacodegeeks.com/2013/09/grails-goodness-unit-testing-render-templates-from-controller.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值