我正在尝试使用hspec
涉及 postgres 事务回滚以及postgresql-simple
'sbegin
和rollback
命令来编写测试。
但是,应用postgresql-simple
's begin
and rollback
commands 似乎会导致我的 '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
andPGS.rollback conn
行时,代码确实将条目插入到数据库中。
为什么这段代码没有在 'begin' 和 'rollback' 行中插入一个条目到数据库中?
如何编写开始和回滚的 hspec 测试,以便我的测试不会影响数据库中的值,并且实际运行命令?