Pourquoi cette spécification Spock dans Grails traduit par « identificateur d'une instance de projectname.Event a été modifiée et diffère de 1 à 2; »?
-
16-10-2019 - |
Question
L'exécution test-app integration:spock
provoque l'erreur suivante:
identifiant une instancede projectname.Event a été modifié par rapport à 1 à 2; exception imbriquée est org.hibernate.HibernateException : identifiant une instance de projectname.Event a été modifié par rapport à 1 2
org.springframework.orm.hibernate3.HibernateSystemException : identifiant une instance de projectname.Event a été modifié par rapport à 1 à 2;
exception imbriquée est org.hibernate.HibernateException : identifiant une instance de projectname.Event a été modifié par rapport à 1 de 2 à projectname.EventControllerSpec.save: un événement (EventControllerSpec.groovy: 74)
Causé par: org.hibernate.HibernateException : identifiant une instance de projectname.Event a été modifié par rapport à 1 2
- D'où vient cette tige d'émission de?
- Comment peut-il être résolu?
- [OPTION] quelqu'un mai créer la balise " spock"?
EventControllerSpec.groovy
def "save: an event"() {
given: "Constraint-conform event properties"
def eventTitle = "Being in Beijing"
controller.params.title = eventTitle
controller.params.details = "Details"
controller.params.location = "Beijing"
controller.params.startDate = "01.09.2030"
controller.params.startTime = "20:15"
controller.params.endDate = "01.09.2030"
controller.params.endTime = "21:45"
controller.params.publisher = getUserObject("someuser")
when: "I save that event"
def result = controller.save() // THIS IS LINE #74 AS STATED IN THE ERROR
then: "The event is successfully saved and the show-view rendered"
controller.flash.message.args.grep(eventTitle)
redirectArgs.action == "show"
redirectArgs.id == result.eventInstance.id
}
private User getUserObject(String name) {
def user = User.findByUsername(name)
if (!user) {
user = new User()
user.username = name
user.email = "${name}@example.com"
user.pw = "barbar"
user.pwConfirmation = "barbar"
assert user.save()
}
user
}
EventController.groovy
def save = {
def eventInstance = new Event()
eventInstance.title = params.title
eventInstance.details = params.details
eventInstance.location = params.location
eventInstance.startDate = DateUtil.createDate(params.startDate, params.startTime)
eventInstance.endDate = DateUtil.createDate(params.endDate, params.endTime)
eventInstance.publisher = session.user
if (eventInstance.save(flush: true)) {
flash.message = "${message(code: 'default.created.message', args: [message(code: 'event.label', default: 'Event'), eventInstance.title])}"
redirect(action: "show", id: eventInstance.id)
}
else {
eventInstance.errors.each { log.warn it }
render(view: "add", model: [eventInstance: eventInstance])
}
}
La solution
Quelle classe ne prolongez votre test de Spock? Il devrait être spock.lang.Specification
ou
grails.plugin.spock.IntegrationSpec
plutôt que grails.plugin.spock.ControllerSpec
, qui est conçu pour les tests unitaires.