Как начать и откатить транзакцию с помощью hspec?

Я пытаюсь написать тест, используя hspec включая откат транзакции postgres как postgresql-simple "s begin а также rollback команды.

Тем не менее, применяя postgresql-simple "s begin а также rollback По-видимому, мои команды "insert" не запускаются и не влияют на мою базу данных.

Вот соответствующий код.

import qualified Database.PostgreSQL.Simple as PGS
import Test.Hspec (describe, it, SpecWith, hspec, before, after)

testConnInfo :: PGS.ConnectInfo
testConnInfo = PGS.ConnectInfo
  { PGS.connectHost = "localhost"
  , PGS.connectPort = 5432
  , PGS.connectUser = "user"
  , PGS.connectPassword = ""
  , PGS.connectDatabase = "database"
  }

testConnection :: IO PGS.Connection
testConnection = do
  PGS.connect testConnInfo

runSpec :: IO ()
runSpec = do
  conn <- testConnection
  hspec $ test_addTask conn

test_addTask :: PGS.Connection -> SpecWith ()
test_addTask conn = describe "test_addTask" $ do
  it "adding_task_succeeds" $ do
    PGS.begin conn
    addTask conn "taskName"
    print "set breakpoint here"
    PGS.rollback conn
    return ()

Я запускаю это в ghci установка точки останова в строке "установить точку останова здесь"; после записи нужно вставить и до отката. Во время паузы в этой точке останова я запрашиваю базу данных, чтобы увидеть, была ли запись вставлена, и вижу, что ни один элемент не может быть вставлен в базу данных этим кодом.

Когда я удаляю PGS.begin conn а также PGS.rollback conn Строки, однако, код вставляет запись в базу данных.

Почему этот код не вставляет запись в базу данных со строками 'begin' и 'rollback'?

Как я могу написать тесты hspec, которые начинаются и откатываются так, чтобы мои тесты не влияли на значения в базе данных и которые фактически выполняли команды?

0 ответов

Другие вопросы по тегам