0

Visual Studio 2008、C#、Entity Framework 3.5、MS Test には、次の 2 つのテストがあります。

[TestMethod]
public void Test1()
{
    using (Entities context = new Entities())
    {
        using (TransactionHelper transaction = new TransactionHelper(context))
        {
            // Stuff

            transaction.Rollback();
        }
    }
}

と:

[TestMethod]
public void Test2()
{
    using (Entities context = new Entities())
    {
        using (TransactionHelper transaction = new TransactionHelper(context))
        {
            // Stuff

            transaction.Rollback();
        }
    }
}

それらを個別に実行すると、両方とも合格します。しかし、すべてのテストを実行すると、2 番目のテストで次のように表示されます。

System.InvalidOperationException: 2 つのオブジェクトが異なる ObjectContext オブジェクトに関連付けられているため、2 つのオブジェクト間の関係を定義できません。

私はこれをまったく理解していません。コードパスのどこにも新しいエンティティ オブジェクトを作成しません。私は何度かチェックしました(そして、コードが個々のテスト実行と本番環境での使用でどのように機能するかを見て、それは真実でなければなりません)。さらに、エンティティを using ステートメントでラップしました。

おそらく TestContext に奇妙な保持がありますか?

参考までに、TransactionHelper (簡略化):

public class TransactionHelper : IDisposable
{
    private global::System.Data.Objects.ObjectContext _context;
    private ConnectionState _initialConState;
    private DbTransaction _transaction;

    public TransactionHelper(global::System.Data.Objects.ObjectContext context)
    {   
        _context = context;
        _initialConState = context.Connection.State;

        if (_initialConState != ConnectionState.Open)
        {
            _context.Connection.Open(); // open connection if not already open
        }

        _transaction = _context.Connection.BeginTransaction(IsolationLevel.ReadUncommitted);
    }

    public void Rollback()
    {
        _transaction.Rollback();
    }

    public void Commit()
    {
        _transaction.Commit();
    }

    public void Dispose()
    {
        _transaction.Dispose();

        if (_initialConState != ConnectionState.Open)
        {
            _context.Connection.Close(); // only close connection if not initially open
        }
    }
}

分離レベルを使用しても違いはありませんReadCommitted

4

1 に答える 1

1

単体テストは (状態、順序などの点で) 互いに完全に独立していることが理想的であるため、Visual Studio や NUnit などの他のテスト フレームワークは、それらを並行して実行することで実行プロセスを高速化します。あなたのようなケースでは、通常、共有静的リソースが原因であることが判明しました。

あなたが言及したこれらの単純なオブジェクト(たとえば、いくつかのルックアップ値)がエンティティオブジェクトのプロパティに割り当てられ、2番目のテストで同じ単純なオブジェクトを別のコンテキストのエンティティに割り当てると、次のようなエラーが発生する可能性がありますあなたが言及した。

このような場合は、テストでキャッシュをモックしてみてください (または の使用を最小限に抑えてくださいstatic)。

于 2012-06-28T11:34:05.827 に答える