grails groovy spock geb

¿Cómo se obtiene sessionFactory en un caso de prueba Grails Geb/Spock?



groovy (1)

Creo que necesito enjuagar la sesión de hibernación en una prueba GebSpec, y entonces quiero obtener la sessionFactory.

Parece que debería inyectarse, pero cuando hago algo como esto:

class MySpec extends GebSpec { def sessionFactory ... def "test session"(){ ....do some setup then: assert sessionFactory != null }

falla con que sessionFactory sea nulo.


La respuesta corta a mi pregunta es: ¿por qué quieres hacer eso? Es una prueba funcional y puede ser remota desde la aplicación en ejecución JVM.

El motivo es porque quiero verificar que los objetos de dominio se hayan actualizado cuando ocurren cosas en la web. Luke Daley señaló amablemente que puede hacerlo utilizando el enchufe Remote-Control Grails ( https://github.com/alkemist/grails-remote-control ), que es genial. Instalas el plugin y luego vas

assert remote { MyDomainOb.findByName(''fred'') != null }

Y envía ese cierre para que se ejecute en el servidor y devuelve el resultado, que puede probar. El resultado debe ser serializable.

OK, así es de una manera, pero el plugin remoto es un poco más difícil de obtener resultados para las pruebas si tienes muchos objetos intrincados que cambian bajo el capó debido a un modelo de dominio que se te impone. Entonces, ¿cómo se obtiene la sesión de hibernación de las pruebas cuando estás en la misma JVM? Me gusta esto:-

Session currentSession def setup() { ApplicationContext context = (ApplicationContext) ServletContextHolder.getServletContext().getAttribute(GrailsApplicationAttributes.APPLICATION_CONTEXT); SessionFactory sf = context.getBean(''sessionFactory'') currentSession = sf.getCurrentSession() }

Agregue eso a la parte superior de su GebSpec y luego puede llamar a currentSession.clear () o currentSession.flush ()

Necesitaba tener la actualización de la sesión de pruebas para que currentsession.clear () fuera la respuesta.

Tenga en cuenta que esto no lo ayudará si el objetivo bajo prueba se encuentra en una máquina virtual separada, por lo que tendrá que usar control remoto.