我正在尝试在场景之间回滚单元测试中的事务,以保持数据库为空并且不使我的测试变脏。所以,我正在尝试:
for _, test := range tests {
db := connect()
_ = db.RunInTransaction(func() error {
t.Run(test.name, func(t *testing.T) {
for _, r := range test.objToAdd {
err := db.PutObj(&r)
require.NoError(t, err)
}
objReturned, err := db.GetObjsWithFieldEqualsXPTO()
require.NoError(t, err)
require.Equal(t, test.queryResultSize, len(objReturned))
})
return fmt.Errorf("returning error to clean up the database rolling back the transaction")
})
}
我希望在场景结束时回滚事务,因此下一步将有一个空数据库,但是当我运行时,数据永远不会回滚。
我相信我正在尝试执行文档建议的操作:https://pg.uptrace.dev/faq/#how-to-test-mock-database,对吗?
更多信息:我注意到我的界面在 RunInTransaction 上实现了一个层:
func (gs *DB) RunInTransaction(fn func() error) error {
f := func(*pg.Tx) error { return fn() }
return gs.pgDB.RunInTransaction(f)
}
IDK 还有什么问题,但我真的猜想这与此有关(因为 TX 被封装在 RunInTransaction 实现中。