2016-10-20 5 views
1

У меня есть 2.2.4 проект Grails, и я пытаюсь написать модульный тест для метода, который запрашивает более lastUpdated, например, так:Установка LastUpdated объекта домена Grails в Спока

Tile.createCriteria().list { 
    lt('lastUpdated', new Date() - 1) 
} 

Этот метод работает отлично в реальной жизни, но не работает в моих модульных тестах, потому что я не могу создать никаких тестовых данных с lastUpdated, кроме now. Установка myTile.lastUpdated явно не работает, так как это обновление и, таким образом, запускает автоматическую отметку времени. Для отключения автоматической метки времени требуется eventTriggeringInterceptor, который, похоже, не доступен в модульных тестах. Смещение стандартного конструктора Date для возврата других значений также не помогло. Прямые обновления SQL вообще не доступны в модульных тестах.

Возможно ли это в модульных тестах, или мне нужно написать интеграционный тест?

+0

Лично я думаю, что если вы тестируете настойчивость, вы всегда должны способствовать интеграции тест, если вы не очень хорошая причина не. Выполнение ваших тестов настойчивость против ложной реализации GORM в памяти просто требует неприятностей. –

+0

Это справедливо, но я не хочу проверять настойчивость, я хочу проверить свой запрос (что действительно так просто). –

ответ

1

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

def 'test lastUpdated query'() { 
    setup: 
    Title lessThan = new Title(lastUpdated:new Date(1477152000000)) //22 Oct 2016 16:00 UTC, should be found 
    Title equalTo = new Title(lastUpdated:new Date(1477238400000)) //24 Oct 2016 16:00 UTC, should not find, not less than 1 day before, but equal to 1 day before 
    Title notLessThan = new Title(lastUpdated:new Date(1477296000000)) //24 Oct 2016 08:00 UTC, should not find, not less than 1 day before 
    Date date = new Date(1477324800000) //24 Oct 2016 16:00 UTC 
    Date.metaClass.constructor = {-> return date} 

    when: 
    List<Title> result = service.someMethod() 

    then: 
    result.size() == 1 
    result.contains(lessThan) 
    !result.contains(equalTo) 
    !result.contains(notLessThan) 
} 
Смежные вопросы