Je le test suivant (ce qui est probablement plus d'un test fonctionnel que l'intégration, mais ...):Grails 3 Intégration Spec a étrange comportement transactionnelles
@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"
}
}
Les données sont en cours de chargement par l'intermédiaire BootStrap (qui admittadly pourrait être le problème) mais le problème est quand je suis dans le bloc then
; il trouve le Convention
par le nouveau nom et les correspondances id
, mais lors du test du champ name
, il échoue car il a toujours l'ancien nom. En lisant la documentation sur les tests, je pense que le problème réside dans la session dans laquelle les données sont créées. Comme le @Rollback
a une session distincte de BootStrap
, les données ne sont pas vraiment gélifiées. Par exemple, si je charge les données via le bloc given
du test, ces données n'existent pas lorsque mon contrôleur est appelé par le RestBuilder
.
Il est tout à fait possible que je ne devrais pas faire ce genre de test de cette façon, donc des suggestions sont appréciées.
Merci Burt. Cela aide à clarifier certaines choses. Ce qui me déroutait était dans Grails 2 il y avait une ligne assez claire entre Intégration et Fonctionnelle (puisque les tests fonctionnels n'étaient pas des citoyens de 1ère classe à l'époque) et dans Grails 3, créer un test fonctionnel utilise '@ Integration' et' @Rollback 'dans le modèle pour GebSpec. – Gregg
Les tests fonctionnels sont pour la plupart des citoyens de 1ère classe, mais c'est au plugin de créer le dossier test/fonctionnel.Il est définitivement déroutant que dans Grails 3, les tests d'intégration et les tests fonctionnels partagent le même dossier, et que le serveur web soit démarré pour les tests d'intégration, ce qui brouille encore les différences. –
Wow, ça explique pourquoi je n'ai pas réussi à faire des rollbacks ces derniers jours. Je pensais que quelque chose se passait dans ce sens. Merci beaucoup d'avoir clarifié cela. Existe-t-il des bonnes pratiques pour l'installation et la restauration des données de test fonctionnelles (API)? Je suis en train de configurer mes données via BootStrap, tout comme Gregg, et d'annuler les changements dans les blocs de nettoyage via les appels API une fois le test réussi. –