データベースを空に保ち、テストを汚さないようにするために、シナリオ間で単体テストのトランザクションをロールバックしようとしています。だから、私はしようとしています:
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")
})
}
シナリオの最後にトランザクションをロールバックすることを期待していたので、次の for ステップのデータベースは空になりますが、実行するとデータがロールバックされません。
ドキュメントが示唆していることをやろうとしていると思います: 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 実装のすぐ内側にカプセル化されているため)。