2011-05-17 16 views
9

Para mis pruebas unitarias, quiero configurar una base de datos, rellenarla con información base y ejecutar cada prueba dentro de una sesión que revierte todos los cambios realizados en el DB para tener siempre una copia prístina para cada prueba.¿Cómo puedo deshacer una sesión en ScalaQuery?

Busco algo así como

db withSession { 
    <create my objects under test> 
    <run operations> 
    <run asserts> 

    this.rollback() 
} 

La función de restauración fue en las primeras versiones de la Scala de consulta pero parece que no lo tiene ahora. ¿Cómo debería implementar esta funcionalidad?

Saludos

+3

Pero la última sesión 0.9.4 todavía tiene un método de reversión (http://scalaquery.org/doc/api/scalaquery-0.9.4/org/scalaquery/session/Session.html). ¿No es suficiente? – VonC

+1

Ok, pensé que la reversión no existía porque no pude encontrarla con la funcionalidad de búsqueda de ScalaDocs. Ahora estoy intentando la reversión para el threadLocalSession pero dice que no puedo deshacer con una sesión de confirmación automática, y no sé si esta opción fue seleccionada. Cualquier ejemplo de código podría ayudar mucho. ¡¡Gracias!! – tonicebrian

Respuesta

2

Aquí es una prueba de unidad que ilustra este comportamiento

https://github.com/szeiger/scala-query/blob/master/src/test/scala/org/scalaquery/test/TransactionTest.scala

GitHub actualmente 404 en el enlace, pero me sacaron el código fuente de la caché de Google:

package org.scalaquery.test 

import org.junit.Test 
import org.junit.Assert._ 
import org.scalaquery.ql._ 
import org.scalaquery.ql.extended.{ExtendedTable => Table} 
import org.scalaquery.session.Database.threadLocalSession 
import org.scalaquery.test.util._ 
import org.scalaquery.test.util.TestDB._ 

object TransactionTest extends DBTestObject(H2Disk, SQLiteDisk, Postgres, MySQL, DerbyDisk, HsqldbDisk, MSAccess, SQLServer) 
class TransactionTest(tdb: TestDB) extends DBTest(tdb) { 
    import tdb.driver.Implicit._ 

    @Test def test() { 

    val T = new Table[Int]("t") { 
     def a = column[Int]("a") 
     def * = a 
    } 

    db withSession { 
     T.ddl.create 
    } 

    val q = Query(T) 

    db withSession { 
     threadLocalSession withTransaction { 
     T.insert(42) 
     assertEquals(Some(42), q.firstOption) 
     threadLocalSession.rollback() 
     } 
     assertEquals(None, q.firstOption) 
    } 
    } 
} 
Cuestiones relacionadas