2014-09-10 2 views
0
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 
+0

возможно дубликат [Невозможно откатить сессию в режиме автоматической фиксации с Slick] (http://stackoverflow.com/questions/25674987/cannot -roll-back-session-in-auto-commit-mode-with-slick) – cvogt

+0

@cvogt: он появляется в обоих случаях (мой предыдущий пост, который вы связали в своем комментарии и этом сообщении) вызван https: // github .com/slick/slick/blob/b7b90a98f726a1b680108c4bf1bbc252a0995703/src/main/scala/scala/slick/jdbc/JdbcBackend.scala # L475. есть ли способ выполнить откат, после каждого запуска теста и по-прежнему использовать 'withTransaction'? – user2066049

ответ

0

Да. withTransaction проверяет, если вы уже находитесь внутри транзакции и в этом случае ничего не делает. Используйте другой блокTransaction в тестовом коде вместо ручной настройки autocommit, и все должно быть в порядке.

Если он все еще не работает, рассмотреть возможность открытия билет: https://github.com/slick/slick/issues