Unit testing 如何对调用g.formatDate的标记库进行单元测试?

Unit testing 如何对调用g.formatDate的标记库进行单元测试?,unit-testing,grails,taglib,Unit Testing,Grails,Taglib,我有一个标记库,它调用formatDate: out << g.formatDate(attrs) out您可以通过多种方式协调这一过程。一个是在项目中演示的 package-pieter 亚格列本类{ 静态defaultEncodeAs=[taglib:'html'] 静态命名空间='tz' def formatDate={attrs-> 出来 grailsTagDateHelper默认grailsTagDateHelper }} 作废“测试日期格式”(

我有一个标记库,它调用
formatDate

            out << g.formatDate(attrs)

out您可以通过多种方式协调这一过程。一个是在项目中演示的

package-pieter
亚格列本类{
静态defaultEncodeAs=[taglib:'html']
静态命名空间='tz'
def formatDate={attrs->
出来
grailsTagDateHelper默认grailsTagDateHelper
}}
作废“测试日期格式”(){
鉴于:
定义日期
Calendar cal=Calendar.instance
加州大学{
清除()
设定月份,七月
设定年份,1776年
设定日期,4
日期=时间
}
什么时候:
def输出=applyTemplate(“”,[日期:日期])
然后:
输出==“1776-07-04”
}
}

我希望这能有所帮助。

哪种版本的Grails?
    def output = applyTemplate('<tz:formatDate date="${date}"/>', [date: date])
    org.grails.taglib.GrailsTagException: [Byte array resource [test_1520620408798]:1] Error executing tag <tz:formatDate>: Cannot invoke method getTimeZone() on null object
at org.grails.gsp.GroovyPage.throwRootCause(GroovyPage.java:472)
at org.grails.gsp.GroovyPage.invokeTag(GroovyPage.java:415)
at test_1520620408798.run(test_1520620408798:15)
at org.grails.gsp.GroovyPageWritable.doWriteTo(GroovyPageWritable.java:162)
at org.grails.gsp.GroovyPageWritable.writeTo(GroovyPageWritable.java:82)
at grails.testing.web.GrailsWebUnitTest$Trait$Helper.renderTemplateToStringWriter(GrailsWebUnitTest.groovy:242)
at grails.testing.web.GrailsWebUnitTest$Trait$Helper.applyTemplate(GrailsWebUnitTest.groovy:227)
at grails.testing.web.taglib.TagLibUnitTest$Trait$Helper.applyTemplate(TagLibUnitTest.groovy:49)
at grails.testing.web.GrailsWebUnitTest$Trait$Helper.applyTemplate(GrailsWebUnitTest.groovy:212)
at grails.testing.web.taglib.TagLibUnitTest$Trait$Helper.applyTemplate(TagLibUnitTest.groovy:44)
at com.captivatelabs.grails.timezone.detection.FormatTagLibSpec.test offset client to server time - formatDate(FormatTagLibSpec.groovy:22)
    Caused by: java.lang.NullPointerException: Cannot invoke method getTimeZone() on null object
at org.grails.plugins.web.taglib.FormatTagLib$_closure2.doCall(FormatTagLib.groovy:170)
at groovy.lang.Closure.call(Closure.java:414)
at org.grails.taglib.TagOutput.captureTagOutput(TagOutput.java:64)
at org.grails.taglib.TagLibraryMetaUtils.methodMissingForTagLib(TagLibraryMetaUtils.groovy:139)
at org.grails.taglib.NamespacedTagDispatcher.methodMissing(NamespacedTagDispatcher.groovy:59)
at com.captivatelabs.grails.timezone.detection.FormatTagLib$_closure1.doCall(FormatTagLib.groovy:14)
at groovy.lang.Closure.call(Closure.java:414)
at org.grails.gsp.GroovyPage.invokeTagLibClosure(GroovyPage.java:439)
at org.grails.gsp.GroovyPage.invokeTag(GroovyPage.java:364)
... 9 more
package pieter

class DemoTagLib {
    static defaultEncodeAs = [taglib:'html']

    static namespace = 'tz'

    def formatDate = { attrs ->
        out << g.formatDate(date: attrs.date, format: 'yyyy-MM-dd')
    }
}
package pieter

import grails.testing.web.taglib.TagLibUnitTest
import org.grails.plugins.web.DefaultGrailsTagDateHelper
import spock.lang.Specification

class DemoTagLibSpec extends Specification implements TagLibUnitTest<DemoTagLib> {

    Closure doWithSpring() {{ ->
        grailsTagDateHelper DefaultGrailsTagDateHelper
    }}

    void "test date format"() {
        given:
        def date
        Calendar cal = Calendar.instance
        cal.with {
            clear()
            set MONTH, JULY
            set YEAR, 1776
            set DATE, 4
            date = time
        }

        when:
        def output = applyTemplate('<tz:formatDate date="${date}"/>', [date: date])

        then:
        output == '1776-07-04'
    }
}