データアクセス層の単体テストで、個人的に大変だと思っているのは次の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 文を書き間違える心配はありません。主キーが設定してあるテーブルでしか使えないのが難点ですけど。