LINQ to SQL を使ってテストデータの作成・削除を楽にする

データアクセス層の単体テストで、個人的に大変だと思っているのは次の2つです。

  1. データベースにテストデータを挿入
  2. 使ったテストデータをデータベースから削除

今までは、テストデータを挿入・削除する SQL 文を、ADO.NET のクラスを使って実行していました。これがすごく面倒。SQL 文が間違っていたときなんてもう…。

少しでも楽できないか、テストを作成する度に考えています。そして、先日のエントリを書いた後に思いつきました。「LINQ to SQL (または ADO.NET Entity Framework) を使えば、テストデータの作成・削除が簡単になるのでは?」

Visual Studio 2008 のテストだと、次のようになります。

// テストデータを格納
private static List<User> _testDataList = new List<User>();

// テスト環境の初期化
[ClassInitialize()]
public static void MyClassInitialize(TestContext testContext)
{
    // テストデータを作成
    _testDataList.Clear();
    _testDataList.Add(new User
    {
        Id = Guid.NewGuid(),    // Id は主キー
        Name = "Foo",
        Age = 20,
    });

    // データベースにテストデータを挿入
    using (DataClasses1DataContext context = new DataClasses1DataContext())
    using (TransactionScope ts = new TransactionScope())
    {
        context.User.InsertAllOnSubmit(_testDataList);
        context.SubmitChanges();
        ts.Complete();
    }
}

// テストの後始末
[ClassCleanup()]
public static void MyClassCleanup()
{
    // データベースからテストデータを削除
    using (DataClasses1DataContext context = new DataClasses1DataContext())
    using (TransactionScope ts = new TransactionScope())
    {
        context.User.AttachAll(_testDataList);
        context.User.DeleteAllOnSubmit(_testDataList);
        context.SubmitChanges();
        ts.Complete();
    }
}

この方法なら、SQL 文を書き間違える心配はありません。主キーが設定してあるテーブルでしか使えないのが難点ですけど。