redwarrior’s diary

C#, ASP.NET, WEB, G*などの雑多な情報

ユニットテストでのDBトランザクションのロールバックを共通化する

以前こんな記事を書きましたが、

redwarrior.hateblo.jp

毎回テストメソッドの中で using 文やデータ投入処理を書くのが面倒になってきたので、テストフレームワーク(MSTest)の機能を使って TestInitialize 属性でDB接続、データ投入を行い、TestCleanup 属性でDB切断、ロールバックを行うようにします。

ソースコードは以下のようになりました。

[TestClass]
public class DatabaseAccessTest
{
    private TestContext context;
    private DbContextTransaction transaction;

    [TestInitialize]
    public void SetUp()
    {
        context = new TestContext();
        transaction = context.Database.BeginTransaction(); // トランザクションを使用する

        // Usersテーブルの初期化,他のテーブルは残す
        context.Users.RemoveRange(context.Users); 
        context.SaveChanges();

        // テストデータの追加を記述する
        ...
    }

    [TestCleanup]
    public void TearDown()
    {
        transaction.Dispose(); // 終了時にロールバックする
        context.Dispose();
    }

    [TestMethod]
    public void ConnectionTest()
    {
        // テストの実施を記述する
        ...
    }
}

テストメソッドがスッキリして良い感じです。

開発環境:

Windows 10 Pro

VisualStudio 2017 Professional

Entity Framework 6.1.3

MSTest 1.2