def withSession(testCode: Session => Any)(implicit db : scala.slick.driver.PostgresDriver.simple.Database) {
val session = db.createSession()
session.conn.setAutoCommit(false)
try {
testCode(session)
} finally {
session.rollback()
session.close()
}
}
над прибором создан для проверки кода базы данных и отката после завершения теста. Тест выглядит, как показано нижеsession withTransaction rollback issue
test("insert a row into employee table") {
withSession { implicit session =>
val emp = EmployeeRow(-1, Option(1),
"TestEmployee",Option(1), Option("abc"), None)
EmployeeService.save(emp)
}
}
где EmployeeService.save()
является
def save(emp: EmployeeRow)(implicit session : Session): EmployeeRow = session.withTransaction{
(employee returning employee) += emp
}
примечание сохранить() метод прямо сейчас там минимален, которая будет иметь взаимодействие с другими API, услуг в там, следовательно, session.withTransaction
требуется объедините все работы в пределах save()
в единую единицу работы.
поскольку я использую session.withTransaction
и withSession
приспособление пытается откатить session
в finally
блоке, он бросает
scala.slick.SlickException: Cannot roll back session in auto-commit mode
at scala.slick.jdbc.JdbcBackend$BaseSession.rollback(JdbcBackend.scala:415)
at com.company.core.tests.DatabaseSpec$class.withSession(DatabaseSpec.scala:25)
at
возможно дубликат [Невозможно откатить сессию в режиме автоматической фиксации с Slick] (http://stackoverflow.com/questions/25674987/cannot -roll-back-session-in-auto-commit-mode-with-slick) – cvogt
@cvogt: он появляется в обоих случаях (мой предыдущий пост, который вы связали в своем комментарии и этом сообщении) вызван https: // github .com/slick/slick/blob/b7b90a98f726a1b680108c4bf1bbc252a0995703/src/main/scala/scala/slick/jdbc/JdbcBackend.scala # L475. есть ли способ выполнить откат, после каждого запуска теста и по-прежнему использовать 'withTransaction'? – user2066049