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()
}
}
创建上面的fixture来测试数据库代码并在测试结束后回滚。 测试看起来如下
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
}
注意save()方法现在是最小的,它将与其中的其他服务API进行交互,因此需要session.withTransaction
将save()
内的所有工作捆绑到单个工作单元中。
因为我使用session.withTransaction
和withSession
fixture试图在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
答案 0 :(得分:0)
是。 withTransaction检查您是否已经在事务内部,并且在这种情况下什么都不做。
,在测试代码中使用另一个withTransaction块,而不是手动设置自动提交。如果仍然无效,请考虑开票:https://github.com/slick/slick/issues