【问题标题】:How to mock render in (Spock, Grails) unit testing Taglib?如何在(Spock,Grails)单元测试Taglib中模拟渲染?
【发布时间】:2014-06-25 07:58:32
【问题描述】:

我在 Grails 中的自定义 Taglib 中有一个简单的标签,如下所示:

def Bar = {attrs, body ->
      Bar bar = Bar.get(attrs.id)
      out << render(template: '/bar', plugin: 'web-core', model: bar)
  }

我需要运行单元测试...

但我想使用模拟渲染 - RenderTagLib 或 GroovyPagesTemplateRenederer 来检查正确的模型,并给出模板的名称而不是使用

when:
String string = applyTemplate <foo:bar id="1" />
then:
string.contains('Bar 1')

例如:我曾尝试像这样模拟 GroovyPagesTemplateRenderer:

设置:

def mock = Mock (GroovyPagesTemplateRenderer) {

        render(_,_,_,_,_) >> //something 
    }

但是 render 和 makeTemplate 一样是 void 方法,所以我不知道该怎么做?

或者对 Taglib 进行单元测试的最佳方法是什么?

如果我改变 Taglib 的视图,输出可能会有所不同。所以我将不得不更改两个单元测试(视图,tagLib)。

这就是为什么我需要单独测试 Taglib 类以及查看。

感谢您的回答...

【问题讨论】:

    标签: unit-testing grails taglib spock


    【解决方案1】:

    您可以通过 groovy 元编程替换 render() 方法来检查参数。

    @TestFor(RenderTagLib)
    @Mock(Bar)
    class RenderTagLibSpec extends Specification {
        Map render
        Bar bar
    
        def setup() {
            bar = new Bar ()
            bar.save (failOnError: true)
    
            tagLib.metaClass.render = { Map attrs ->
                render = attrs
            }
        }
    
        void "bar() passes the correct parameters to render()"() {
            when:
            tagLib.bar (id:bar.id)
    
            then:
            render.template == '/bar'
            render.plugin == 'web-core'
            render.model == bar
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-07-22
      • 2023-03-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多