Критерии Grails не работают в интеграционном тесте - PullRequest
0 голосов
/ 20 сентября 2011

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

def List<MyDomain> getAllDomain()
{
    List resultList
    def criteria = MyDomain.createCriteria()
    resultList = criteria.list()
    {
       eq('property1', 'READY')
    }
    return resultList
 }

Мы также пишем простой интеграционный тест для этого метода.Тест выглядит следующим образом.

void testGetAllDomain()
{
     List original = MyDomain.list()
     original.each{
        it.property1 = 'NOTREADY'
        it.save(flush:true)
     }

     def result = MyDomainService.getAllDomain()
     assertEquals 0, result.size()  //All objects should be set to NOTREADY, and not retrieved.  THIS is failing.

}

Я попытался установить

def transactional = false

и оставить свой код как есть.Я попытался установить для транзакции значение false и обернуть код в .withTransaction {}.Я также попробовал стандартный конфиг, и это не сработало.Я заметил, что если я сделаю

def List<MyDomain> getAllDomain()
{
   List original = MyDomain.list()
    original.each{
      it.property1 = 'NOTREADY'
      it.save(flush:true)
    }
   List resultList
   def criteria = MyDomain.createCriteria()
   resultList = criteria.list()
   {
      eq('property1', 'READY')
   }
   return resultList
 }

, то результаты вернутся, как и ожидалось.Это заставляет меня поверить, что это как-то связано с транзакцией в интеграционном тесте.Есть идеи?

1 Ответ

1 голос
/ 21 сентября 2011

Убедитесь, что вы действительно сохраняете объекты, добавив failOnError: true к вашему it.save(flush: true), а также убедитесь, что ваш интеграционный тест не расширяет GrailsUnitTestCase или какие-либо его подклассы, и никакие другие тестовые классы не перепутали с метаклассом.и не убирать за собой.Я сомневаюсь, что сделка имеет какое-либо отношение к этому.Если вы установили transactional=false и после теста значения не были изменены в вашей базе данных.Тогда в вашей операции сохранения что-то не так, например, неудачная проверка.

Очень редко вам когда-либо нужно устанавливать интеграционный тест, чтобы он не был включен в транзакцию, а когда вы это делаете, вы должны хорошо понимать сессию и кеши Hibernate.

...