3

テストに次の基本オブジェクトがあります

[TestClass]
public abstract class TestClassBase
{
    private TransactionScope _transactionScope;

    [TestInitialize]
    public virtual void TestInitialize()
    {
        _transactionScope = new TransactionScope(TransactionScopeOption.RequiresNew, new TransactionOptions { Timeout = new TimeSpan(0, 10, 0) });
    }

    [TestCleanup]
    public virtual void TestCleanup()
    {
        _transactionScope.Dispose();
    }
}

私は次のことを行うテストを持っています

[TestMethod]
public void SaveToDatebaseTest(
{
     Program program = new Program();         
     program.Name = "Unit Test Program, I should not exists, when Test is done";
     ProgramManager programManager = new ProgramManager()
     programManager.Save(program);
}

テストを実行すると、レコードはまだデータベースに存在します。

すべてのテスト メソッド内で TransactionScope の使用を避けたい

4

6 に答える 6

2

TestCleanup メソッドを変更する必要があります。現在、TransactionScope を破棄しています。実際に暗黙のコミットを行っていると思いますか? (ただし、Complete() を呼び出す必要があると思いますか?)、エラーがないため、トランザクションをロールバックしていません。

これを試して

[TestCleanup]
public virtual void TestCleanup()
{
    // using System.Transactions;
    Transaction.Current.Rollback();
    _transactionScope.Dispose();
}
于 2011-02-16T17:40:19.057 に答える
0

ここで達成しようとしているのは、初期化とクリーンアップを実装する汎用 Test クラスを作成して、すべてのテストでそのコードを繰り返す必要がないようにすることだと思いますが、それは正しいですか? これらのメソッドが呼び出されていることさえ確信していますか? [TestInitialize] と [TestCleanup] をサブクラス化できないことに注意してください。そのため、サブクラスからこれらのメソッドを呼び出す必要があります。( https://stackoverflow.com/a/15946140/1638933を参照)。

于 2015-04-21T08:44:12.777 に答える
0

VS2005 または VS2008 (2010 については不明) を使用している場合は、テスト メソッドが完了した後で、自動データベース トランザクション ロールバックのためにMSTestExtensionsを試すことができます。MS SQLServer で使用しており、分散トランザクション コーディネーター サービスが実行されています。

これはまさにあなたが探しているものではないかもしれませんが、あなたの状況に役立つかもしれません.

于 2011-02-08T03:54:37.727 に答える