2014-10-02 3 views
0

Я пытаюсь написать интеграцию с помощью Spock, но я борюсь с спящим режимом, поскольку у меня есть особый сценарий. Это в основном сценарий:Промывка в интеграционном тесте

У меня есть метод в службе, который суммирует некоторую информацию из таблицы. Эта услуга соединяется с базой данных, используя класс groovy.sql.Sql

def sql = new groovy.sql.Sql(dataSource) 
sql.execute("insert into summary_table .... values from content_table") 

Затем, в тесте интеграции, в первую очередь я вставляя случайные данные в таблице контента с помощью плагина сборки тест-данных, используя метод GORM save()

Тесты отлично работают когда-то, но другие, кажется, что все данные в content_table не были полностью заполнены, когда суммируются данные, а некоторые строки отсутствуют (не все из них, только некоторые).

В основном это испытание:

def "this is my failing test"() { 
    given: 
     100.times { 
      ContentTable.build().save() 
     } 
    when: 
     def results = myservice.summarisingContentTable() 
    then: 
     results.size() == 100 
} 

Тогдашний блок является более сложным, но я думаю, что он будет служить, чтобы объяснить эту проблему.

Я думаю, что проблема связана с спящим и когда транзакция должна быть совершена. Может ли кто-нибудь помочь мне с этим?

UPDATE: Я просто установить контрольную точку перед запуском myservice.summarisingContentTable() и пытавшихся следующие запросы с разными результатами иногда, поэтому ContentTable заполняется правильно.

ContentTable.count()//returns the proper value 
sql.execute("select count(*) as total from content_table").total //returns sometimes the proper value - 1, so one content_table record is missing 
+0

не уверен, как вы создаете 'ContentTable' ... вы проверили' ContentTable.build(). Save() 'не возвращаете' null', чтобы убедиться, что в построенном объекте нет ошибки? – evanwong

+0

ContentTable заполняется должным образом. Я отлаживаю IntelliJ IDEA и некоторые точки останова, и он имеет правильное значение, но по любой причине при вызове службы метода иногда эта таблица не имеет полного содержимого. –

+0

Из соображений удобства: когда он терпит неудачу, он не работает одним? или это просто случайное число? – cfrick

ответ

0

Вы уверены, что ваш ContentTable создан правильно? В моих тестах, я использую эту идиому:

assert myObject.save() || myObject.errors.allErrors.empty 

таким образом, он печатает сразу, что были ошибки, если таковые имеются.

Во-вторых, если вы используете новейшие Grails 2.4, то, пожалуйста, имейте в виду, что они по умолчанию не имеют автозапуска. Проверьте документацию, как ее изменить, или сохраните (flush: true).

+0

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

+0

Один из методов, которые я использую в тех случаях, когда я не могу думать о хорошей причине, включает в себя глубокую отладку по всему вызову спящего режима (flush: true). Например, однажды я нашел, что спящий режим будет спокойно игнорировать некоторые свойства, потому что они не были правильно отображеныBy, что дало им некоторый показатель, который позже сделал спящий режим, игнорируя их некоторыми if(). Это занимает некоторое время, но оно очень мощное и может раскрыть свои ошибки, а также недокументированное или даже ошибочное поведение граалей. – Bulba

Смежные вопросы