Модульное тестирование Grails 2.0 Custom Tag Lib - PullRequest
4 голосов
/ 31 января 2012

У меня есть пользовательский тег lib, который я написал, чтобы я мог легко отображать свойства объекта.Это позволяет мне звонить

<g:property label="Name" property="${user.name}"/>

, что делает мои взгляды короткими и последовательными, а также позволяет мне быстро вносить изменения.Мой код taglib выглядит следующим образом:

def property = {attrs, body ->
    def startingHtml = "..."
    def endingHtml = "..."

    out << startingHtml
    renderField(attrs.property)
    out << endingHtml
}

def renderField(property) {
    if (property instanceof Collection) {
        property.each { out << it + "</br>" }
    } else if(property instanceof Address){
        renderAddress(property)
    } else {
        out << property
    }
}

def renderAddress(address) {
    out << "Address Render Logic Here"
}

Я пытаюсь добавить некоторые модульные тесты вокруг этого кода, потому что в нем есть логика.Используя примеры, найденные здесь (http://grails.org/doc/latest/guide/testing.html#unitTestingTagLibraries), я начал добавлять некоторые тесты. Первые два сценария, которые в настоящее время обрабатывает мой тег, - это String и Collection, которые я смог протестировать правильно (первые два теста ниже). Последний сценарий, которыйМне нужно проверить, является ли объект Address (это просто POGO с атрибутами String). Я не могу найти способ протестировать передачу объекта в качестве атрибута в тег lib.

@TestFor(PropertyTagLib)
class PropertyTagLibTests {

@Test
void propertyTagShouldRenderPropertyInsideOfTDWhenPropertyIsAString() {
    String result = applyTemplate('<g:property label="something" property="someTextValue"/>').trim()

    assert result.contains('someTextValue')
}

@Test
void propertyTagShouldRenderList() {
    String result = applyTemplate('g:property label="something" property="[\"one\", \"two\", \"three\"]"/>').trim()

    assert result.contains("one</br>two</br>three</br>")
}

@Test
void propertyTagShouldRenderPropertyInsideOfTDWhenPropertyIsAnAddress() {
    def address = new Address(line1: "Line 1")
    String result = applyTemplate('<g:property label="something" property="${address}"/>').trim()

    assert result.contains("Address Render Logic Here")
}
}

Как я могу проверить мой taglib, если один из атрибутов является объектом?

Ответы [ 2 ]

7 голосов
/ 03 февраля 2012

Объявление applyTemplate () выглядит следующим образом:

String applyTemplate(String contents, Map model = [:])

Параметры тега передаются через model.

Ваш тест может выглядеть следующим образом:

@Test
void propertyTagShouldRenderPropertyInsideOfTDWhenPropertyIsAnAddress() {
    String result = applyTemplate('<g:property label="something" property="${address}"/>', [address : new Address(line1: "Line 1")]).trim()

    assert result.contains("Address Render Logic Here")
}
0 голосов
/ 02 февраля 2012

Итак, я решил это, «вырезав среднего человека» и обойдя applyTemplate() и перейдя непосредственно к методу, который выполняет логику.Это не совсем идеально по двум причинам: 1) я не утверждаю, что тег свойства связан с renderField, но, надеюсь, мои другие тесты, которые все еще используют applyTemplate(), гарантируют это.2) В реальном мире out в TagLib - это средство записи выходных данных, и в моем тесте я создал его в виде списка (я могу сделать это, так как все, что вы можете сделать при левом сдвиге, будет достаточно).

Что мне нравится в использовании списка, так это то, что он помогает установить порядок.

@Test
void renderFieldShouldRenderAddress() {
    def address = new Address(line1: "Line 1", line2: "Line 2", line3: "Line 3",
        city: "City", state: "ST", zipCode: "12345", country: "USA",
        buildingNumber: null, buildingName: null, roomNumber: null
        )
    def tagLib = new PropertyTagLib()
    def results = []
    tagLib.metaClass.getOut = {
        results
    }

    tagLib.renderField(address)

    assert "Line 1" == results[0]
    assert "<br />" == results[1]
    assert "Line 2" == results[2]
    assert "<br />" == results[3]
    assert "Line 3" == results[4]
    assert "<br />" == results[5]
    assert "City, ST 12345" == results[6]
    assert "<br />" == results[7]
    assert "USA" == results[8]
    assert "<br />" == results[9]
    assert 10 == results.size()
}

Есть мысли?

...