1

データベースを空に保ち、テストを汚さないようにするために、シナリオ間で単体テストのトランザクションをロールバックしようとしています。だから、私はしようとしています:

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 実装のすぐ内側にカプセル化されているため)。

4

1 に答える 1