Настройка lastUpdated объекта домена Grails в Spock

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

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

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

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


person David Seiler    schedule 20.10.2016    source источник
comment
Лично я думаю, что если вы тестируете настойчивость, вам всегда следует отдавать предпочтение интеграционному тесту, если только у вас нет очень веской причины не делать этого. Запуск ваших тестов на устойчивость против фиктивной реализации GORM в памяти просто напрашивается на неприятности.   -  person Dónal    schedule 20.10.2016
comment
Это справедливо, но на самом деле я не хочу проверять постоянство, я хочу проверить свой запрос (который на самом деле почти такой же простой).   -  person David Seiler    schedule 20.10.2016


Ответы (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)
}
person Bryan G Campbell    schedule 24.10.2016