2016-10-20 2 views
1

Ich habe ein Grails 2.2.4 Projekt, und ich versuche, einen Komponententest für ein Verfahren zu schreiben, die über lastUpdated abfragt, etwa so:Einstellung Lastupdated eines Grails Domain-Objekt in Spock

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

Diese Methode funktioniert im wirklichen Leben gut, aber schlägt in meinen Komponententests fehl, weil ich keine Testdaten mit lastUpdated anders als now erstellen kann. Die Einstellung myTile.lastUpdated funktioniert explizit nicht, da dies ein Update ist und somit den Auto-Timestamping auslöst. Das Deaktivieren der automatischen Zeitstempelung erfordert eventTriggeringInterceptor, die in Komponententests nicht verfügbar zu sein scheint. Den Standardkonstruktor Date zu verspotten, um andere Werte zurückzugeben, war auch keine Hilfe. Direkte SQL-Aktualisierungen sind in Komponententests überhaupt nicht verfügbar.

Ist das überhaupt in Unit Tests möglich, oder muss ich einen Integrationstest schreiben?

+0

Persönlich denke ich, wenn Sie Ausdauer zu testen sind, sollten Sie immer einen Integrationstest bevorzugen, wenn Sie einen sehr guten Grund haben nicht zu. Wenn Sie Ihre Persistenztests für eine Im-Memory-GORM-Implementation ausführen, wird nur nach Problemen gefragt. –

+0

Das ist fair, aber ich will nicht wirklich Persistenz testen, ich möchte meine Abfrage testen (was wirklich so einfach ist). –

Antwort

1

Es ist interessant, dass Sie sagen, den Standard-Konstruktor verspotten, um andere Werte zurückzugeben ist keine Hilfe. Ich mache das sehr oft, wenn ich Fragen wie deins habe, die ein neues Datum haben. Für Ihre Situation würde ich einen Komponententest, die in etwa so aussah:

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) 
} 
Verwandte Themen