#sql #scala #scalaquery
#sql #scala #scalaquery
Вопрос:
Для моих модульных тестов я хочу настроить базу данных, заполнить ее базовой информацией и запускать каждый тест в рамках сеанса, который откатывает все изменения, внесенные в БД, чтобы всегда иметь нетронутую копию для каждого теста.
Я ищу что-то вроде
db withSession {
<create my objects under test>
<run operations>
<run asserts>
this.rollback()
}
Функция отката была в ранних версиях Scala Query, но, похоже, сейчас она отсутствует. Как я должен реализовать эту функциональность?
С наилучшими пожеланиями
Комментарии:
1. Но в последнем сеансе 0.9.4 все еще используется метод отката ( scalaquery.org/doc/api/scalaquery-0.9.4/org/scalaquery/session /… ). Разве этого недостаточно?
2. Хорошо, я думал, что отката не существует, потому что я не смог найти его с помощью функции поиска ScalaDocs. Теперь я пытаюсь выполнить откат для threadLocalSession, но там написано, что я не могу выполнить откат с сеансом автоматической фиксации, и я не знаю, была ли выбрана эта опция. Любой пример кода мог бы очень помочь. Спасибо!!
Ответ №1:
Вот модульный тест, который иллюстрирует это поведение
На GitHub в настоящее время 404 по ссылке, но я извлек исходный код из кэша 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)
}
}
}