0

Entity Framework を使用している場合、統合テストに苦労しています。

テスト プロジェクトでテスト データを使用してデータベースをシードしていますが、作成、更新、および削除の操作をどのようにテストするのか疑問に思っています。

基本的に、たとえば 5 つの顧客エントリを含むテスト データがあります...これらの 5 つのエントリに基づいてデータを取得するための単体テストを作成できるようになりました。(たとえば、get all は 5 つのアイテムを含むコレクションを返します)。

しかし、1 人の顧客を削除するテストがある場合、これは GetAll テストが 5 人の顧客を想定していることを意味しますが、4 つしか返さず (このテストが削除テストの後に実行された場合)、失敗します。

この問題をどのように回避しますか? テストに特定の順序を与えるか、すべてのテストの前にデータベースを再シードしますか (しかし、これは非常に悪いように聞こえますか?)...

ありがとう !

4

1 に答える 1

1

これを行う効果的な方法は、Transaction Scopeを使用することです。Complete メソッドを呼び出さずにスコープが破棄された場合、これは基本的にすべての sql 呼び出しをラップし、変更をロールバックします。基本的なテストは次のようになります。

public class TransactionalTestsBase
{
    private TransactionScope _scope;

    [TestInitialize]
    public void Initialize()
    {
        _scope = new TransactionScope();
    }

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

    [TestMethod]
    public void CrudAction()
    {
        var repo = new YourRepo();
        var client = ; // Make client
        repo.DeleteClient(client);
        Assert.AreEqual(4,repo.GetClients().Count());
    }
}

理想的には、この基本テスト クラスから継承し、そこにテストを記述しません。

ベータ版にはまだいくつかの新しい熱があり、将来これに大いに役立つと思います. 努力を見てください

于 2013-05-01T09:16:31.407 に答える