Ich habe folgende Test (die wahrscheinlich eher ein Funktionstest als Integration ist aber ...):Grails 3 Integration Spec hat merkwürdige Transactional Behavior
@Integration(applicationClass = Application)
@Rollback
class ConventionControllerIntegrationSpec extends Specification {
RestBuilder rest = new RestBuilder()
String url
def setup() {
url = "http://localhost:${serverPort}/api/admin/organizations/${Organization.first().id}/conventions"
}
def cleanup() {
}
void "test update convention"() {
given:
Convention convention = Convention.first()
when:
RestResponse response = rest.put("${url}/${convention.id}") {
contentType "application/json"
json {
name = "New Name"
}
}
then:
response.status == HttpStatus.OK.value()
Convention.findByName("New Name").id == convention.id
Convention.findByName("New Name").name == "New Name"
}
}
Die Daten über BootStrap wird geladen (die admittadly könnte das Problem sein), aber das Problem ist, wenn ich im then
Block bin; Es findet die Convention
durch den neuen Namen und die id
Übereinstimmungen, aber beim Testen der name
Feld ist es fehlgeschlagen, weil es immer noch den alten Namen hat.
Beim Lesen der Dokumentation zum Testen denke ich, das Problem liegt in welcher Sitzung die Daten erstellt werden. Da die @Rollback
eine Sitzung hat, die von BootStrap
getrennt ist, sind die Daten nicht wirklich Gelieren. Zum Beispiel, wenn ich die Daten über den given
Block des Tests lade, dann sind diese Daten nicht vorhanden, wenn mein Controller vom RestBuilder
aufgerufen wird.
Es ist durchaus möglich, dass ich diese Art von Test nicht auf diese Weise machen sollte, daher werden Vorschläge geschätzt.
Danke Burt. Das hilft, einige Dinge zu klären. Was mich verwirrte, war, dass es in Grails 2 eine ziemlich klare Grenze zwischen Integration und Funktional gab (da funktionale Tests zu der Zeit keine Bürger der ersten Klasse waren) und in Grails 3, die Erstellung eines Funktionstests mit '@ Integration' und' @Rollback 'in der Vorlage für die GebSpec. – Gregg
Funktionstests sind meist Bürger der ersten Klasse, aber es ist Sache des Plugins, den Test-/Funktionsordner zu erstellen.Es ist auf den ersten Blick verwirrend, dass in Grails 3 die Integration und die Funktionstests den gleichen Ordner teilen und dass der Webserver für Integrationstests gestartet wird, was die Unterschiede weiter verwischt. –
Wow, das erklärt, warum ich in den letzten Tagen keine Rollbacks bekommen konnte. Ich dachte mir, dass etwas in dieser Richtung passierte. Vielen Dank für die Klärung. Gibt es Best Practices für die Einrichtung und das Zurücksetzen funktionaler (API) Testdaten? Ich bereite gerade meine Daten über BootStrap, genau wie Gregg, vor und mache Änderungen in Aufräumblöcken über API-Aufrufe rückgängig, sobald der Test bestanden hat. –