Динамический искатель Grails, где имя поля содержит зарезервированные слова - PullRequest
2 голосов
/ 31 января 2011

Итак, у меня есть класс домена grails:

class Message
{
    Inbox inbox
    Boolean hasBeenLogicallyDeletedByRecipient
    ...

    static belongsTo = [
        inbox:Inbox,
        ...
    ]

    static constraints = {
        hasBeenLogicallyDeletedByRecipient(nullable:false)
        ...
    }
}

Я хотел бы использовать динамический искатель следующим образом:

def messages = Message.findAllByInboxAndHasBeenLogicallyDeletedByRecipient(
                    inbox, false, [order:'desc',sort:'dateCreated'])

Это прекрасно работает при выполнении модульного теста в STS2.6.0.M1 против грааля 1.2.1;При раскрутке веб-приложения происходит сбой из-за By в hasBeenLogicallyDeletedByRecipient (я предполагаю, что при создании запроса он запутал динамический анализатор поиска).* Я могу использовать построитель критериев, который работает в приложении:

    def messages = Message.withCriteria {
        and {
            eq('inbox', inbox)
            eq('hasBeenLogicallyDeletedByRecipient', false)
        }
        order('dateCreated', 'desc')
    }

Но поскольку withCriteria не проверяется, он не работает сразу в модульных тестах, поэтому я мог бы добавить следующее в модульtest:

    Message.metaClass.static.withCriteria = { Closure c ->
        ...
    }

Является ли критерий / юнит-тестирование наилучшим / принятым подходом?Я не чувствую себя вполне комфортно с этим, потому что это обходит тестирование критериев закрытия.

В идеале, я бы предпочел использовать динамический искатель - есть ли краткий способ заставить его работать как есть?Если нет никакого способа обойти это, я предполагаю, что имя поля может быть изменено (есть причина, почему я не хочу этого делать, но это не имеет отношения к вопросу) ...

ОБНОВЛЕНИЕ:

Вот трассировка стека, когда я пытаюсь использовать findAllByInboxAndHasBeenLogicallyDeletedByRecipient() внутри приложения - обратите внимание, как получается получить последние К и обработатьвсе остальное между ним и findAll как свойство.Я пас на http://grails.org/OperatorNamesInDynamicMethods, но в нем ничего не говорится о К верботену.

org.codehaus.groovy.grails.exceptions.InvalidPropertyException: No property found for name [byInboxAndHasBeenLogicallyDeleted] for class [class xxx.Message]
    at xxx.messages.yyyController$_closure3.doCall(xxx.messages.yyyController:53)
    at xxx.messages.yyyController$_closure3.doCall(xxx.messages.yyyController)
    at java.lang.Thread.run(Thread.java:662)

1 Ответ

2 голосов
/ 31 января 2011

Тестирование запросов к базе данных - это действительно интеграционный тест, а не модульный тест. Ваш тест находится в / test / unit или / test / интеграции? - Я ожидаю, что «withCriteria» будет полностью функциональным в интеграционных тестах, но не в модульных тестах.

Из документов Грааля (http://grails.org/doc/latest/), раздел 9.1:

Юнит-тестирование - это тесты на «юнит» уровень. Другими словами, вы тестируете отдельные методы или блоки кода не считая окружающих инфраструктуры. В Граале вам нужно быть внимательным к Разница между единицей и интеграционные тесты, потому что в модуле тесты Grails не впрыскивает любой из динамические методы присутствуют во время Интеграционные тесты и во время выполнения.

...