Как откатить сеанс в ScalaQuery? - PullRequest
9 голосов
/ 17 мая 2011

Для моих модульных тестов я хочу настроить базу данных, заполнить ее базовой информацией и запустить каждый тест в сеансе, который откатывает все изменения, внесенные в БД, чтобы всегда иметь первоначальную копию для каждого теста.

Я ищу что-то вроде

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

   this.rollback()
}

Функция отката была в ранних версиях Scala Query, но сейчас кажется, что она отсутствует. Как мне реализовать эту функциональность?

С наилучшими пожеланиями

1 Ответ

2 голосов
/ 23 мая 2011

Вот модульный тест, который иллюстрирует это поведение

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

GitHub в настоящее время 404s по ссылке, но я вытащил исходный код из кэша 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)
    }
  }
}
...