grails - как вы передаете не строковые переменные на карту атрибутов taglib с помощью тестирования с applyTemplate? - PullRequest
0 голосов
/ 05 февраля 2019

grails 3.3.9, + теги libs

Я создаю новый тег taglib, как этот

import java.time.LocalDateTime
import java.time.format.DateTimeFormatter

class JavaDateTimeTagLib {
    static defaultEncodeAs = [taglib:'html']
    //static encodeAsForTags = [tagName: [taglib:'html'], otherTagName: [taglib:'none']]
    static encodeAsForTags = [testCall: [taglib:'none']]

    static namespace = "jdt"        //java8 date time name space for tags

    def testCall = { attrs ->

        def p1 = attrs.p1
        def p2 = attrs.p2
        out << "p1:'$p1' with class ${p1.getClass()}"
        out << "p2:'$p2' with class ${p2.getClass()}"
    }
}

, где я хочу передать не строковую переменную на карту attrs.

Затем я настраиваю тест следующим образом

class JavaDateTimeTagLibSpec extends Specification implements TagLibUnitTest<JavaDateTimeTagLib> {

    def setup() {
    }

    def cleanup() {
    }

    /**
     * restriction params must be quoted values - esentially strings
     * taglib has to take that and do any conversions in the taglib
     * output by defaults is encoded html using std codec
     */
    void "call displayDateTime tag "() {
        given:

        String result = applyTemplate('<jdt:testCall p1="p1-string" p2="$now"  />' , [now:LocalDateTime.now()])

        when :
        println "$result "

        then:
        result
    }
}

Я пытаюсь передать переменную LocalDateTime на карту attrs.

, если вы используете applyTemplate ипередать p2 = ldt и протестировать карту [ldt: LocalDateTime.now ()], тест не пройден, сообщив, что переменная должна быть 'заключена в кавычки

[Byte array resource [test_1549319950845]:1] Attribute value must be quoted (p1="p1-string" p2=now).

, если вы цитируете переменную p2 с помощью p2 = "$ ldt" ипротестируйте сопоставление имени как [ldt: LocalDateTime.now ()], тогда тест будет работать - однако тип, переданный на карту attrs, имеет тип GStringImpl

при чтении руководства OCI руководство по тегам oci lib

это подразумевает на странице 4, что вы можете передать attrs.employees в виде списка доменных объектов и использовать эту разметку в вашей

, но нет способа вызвать это с помощью тестирования, так как все имеетбыть строкой в ​​кавычках - что делает его GStringImpl

как передать не строковую переменную в карту attrs taglibs из appyTemplate (.. я предполагаю, что то же ограничение применяется в живом gsp, а не только в рамках тестирования)

1 Ответ

0 голосов
/ 08 февраля 2019

ха!Это такая маленькая вещь

, если вы измените тест и напишите это

    String result = applyTemplate('<jdt:testCall p1="p1-string" p2="${now}"  />' , [now:LocalDateTime.now()])

с фигурными скобками вокруг имени ключа переменной из карты - тогда фактическое значение типизированной переменной передается вTaglib.так что, если вы посмотрите на значение attrs.p2, у него есть фактический экземпляр LocalDateTime.

теперь совершенно не уверен, как работает applytemplate, не уверен, но ожидаю, что его попытка сделать что-то вроде groovy shell оценивает строку - отсюда необходимостьиспользовать один «как»

Надеюсь, что имеет смысл

достаточно глупо, чтобы иногда ваша голова взорвалась

...