【发布时间】:2021-02-03 13:49:54
【问题描述】:
我正在尝试在我的单元测试中回滚一个事务,在不同场景之间,以保持数据库为空并且不使我的测试变脏。所以,我正在尝试:
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 实现中。
【问题讨论】:
-
与您的问题没有直接关系,但您可能会发现this helpful--它基本上为您完成所有交易。
-
作为我的第一次尝试,我会检查 db.RunInTransaction 的返回值,也许回滚在某处失败。
-
调试,代码按预期执行,回滚行通过,错误返回(即使我添加了一个require.Error来确认,它通过了....但即便如此,数据库仍在继续在每个场景之后提交值。
-
我注意到我的 runInTransaction 已实现并封装了 TX。如果有帮助,请将代码添加到问题中。
标签: postgresql go testify