SQL Serverの統合テストでは、各テスト後にロールバックしてデータベースを一貫性のある状態に保つTransactionScopeでテストをラップします。Postgres、Npgsql、およびロールバックを使用した統合テスト
Postgres(または特にNpgsql)を使用すると、(コミットされていないトランザクションスコープ内であっても)個々の接続の外の選択がコミットされていないデータを読み取ることができないため、これは可能ではありません。
基本的なシナリオは、以下の簡略化されている:
[Test]
public void ImplicitEnlist()
{
var connectionString = ConnectionString + ";enlist=true";
using (var scope = new TransactionScope())
{
using (var conn = new NpgsqlConnection(connectionString))
{
conn.Open();
Assert.That(conn.ExecuteNonQuery(@"INSERT INTO data (name) VALUES('test')"), Is.EqualTo(1));
}
using (var conn = new NpgsqlConnection(connectionString))
{
// -> this is false
Assert.That(conn.ExecuteScalar(@"SELECT COUNT(*) FROM data"), Is.EqualTo(1));
}
scope.Rollback();
}
}
誰でも人々がPostgresのデータベースでこれに近づいている方法を共有することはできますか?
なぜテスト用に別々の接続が必要ですか? –
統合テストは非常に幅広い機能テストであり、基礎となるクラスがどのように接続を利用するかとは切り離されています。 –
コンテキストについては、SQL ServerからPostgresへの移行の可能性を調査しています。これが私がテストスイートでヒットした最初の問題でした。 –