Расширение макета Grails для модульных тестов (createCriteria, withNewSession и т. Д.) - PullRequest
2 голосов
/ 29 ноября 2011

Как часть проекта Grails, в настоящее время я расширяю свой набор тестов на такие компоненты, для работы которых требуется полная среда, например, пользовательские запросы HQL и критерии, проблемы, связанные с сеансом, и т. Д. Я использую интеграционные тесты.

У нас уже есть довольно большое количество модульных тестов (> 500), где мы использовали для имитации методов, которые по умолчанию не имеют макетного аналога Grails (например, withCriteria, withNewSession и т. Д.).) используя вспомогательные функции, подобные этой:

static mockCriteria(Class clazz, returnValue)
{
  def myCriteria = new Expando()
  myCriteria.list = {Closure cls -> returnValue}
  myCriteria.get = {Closure cls -> returnValue}
  clazz.metaClass.static.createCriteria = { -> myCriteria }
}

Затем можно было протестировать код следующим образом:

mockCriteria(MyClass, [result])
assert myClass.createCriteria.list({ ... }) == [result]

До сих пор мне всегда удавалось удовлетворить свои потребности, используя этот подход.

Теперь я хочу добавить интеграционные тесты, которые фактически проверяют, как ведут себя методы, которые используют критерии и HQL-запросы, чтобы упростить рефакторинг этих запросов.Я застрял в том факте, что createCriteria заменяется в моих тестах и ​​не восстанавливает их исходный код после фазы модульных тестов, что мешает мне тестировать их на этапе интеграции.

Как вы решаетепроблема критериев насмешки (или запросов HQL и т. д.), позволяющая вернуть исходное поведение в интеграционные тесты?

РЕДАКТИРОВАТЬ: К сожалению, обновление до Grails 2 не является вариантом.

Ответы [ 2 ]

1 голос
/ 10 марта 2012

Попробуйте это:

void setUp() {
    super.setUp()
    registerMetaClass MyClass
}

Под капотом

def a = [1, 2, 3]
def oldMetaClass = ArrayList.metaClass
ArrayList.metaClass.find = { Closure cls -> 5 }
assert 5 == a.find{ it == 1}

ArrayList.metaClass = oldMetaClass  
assert 1 == a.find{ it == 1 }

1007 *

А для mockCriteria взгляните

https://github.com/fabiooshiro/plastic-criteria

(работает с 1.3.7)

1 голос
/ 29 ноября 2011

Я скорее высмеиваю не критерии, а доменные методы, которые их используют.

Кроме того, Grails 2.0 обещает поддержку критериев в модульных тестах - но не HQL.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...