2017-05-08 27 views
0

私はクラスデータベースを実装しています。統合テスト用データアクセスコード

public interface IDatabase 
{ 
    int ExecuteNonQuery(string command, CommandType commandType, Dictionary<string, object> parameters); 
} 

名前が示すようには、ExecuteNonQuery機能は、プロバイダに依存しない方法で、非クエリのデータベースコマンドを実行します。

このクラスの統合テストを書く必要があります。これまでは、テストに合格したのSql Server Compact Editionの統合テストを作成しました。

ここに統合テストコードがあります。

public class DatabaseIntegrationTests 
{ 
    private readonly string CurrentDir; 
    private readonly string SqlCeDbPath; 

    public DatabaseIntegrationTests() 
    { 
     CurrentDir = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location); 
     SqlCeDbPath = CurrentDir + @"\TestDb.sdf"; 
    } 

    [Fact] 
    public void ExecuteNonQuery_SqlServerCE_Should_Execute() 
    { 
     var dbConfFunc = this.InitializeSqlServerCeInstance(); 
     Database database = new Database(dbConfFunc); 
     database.ExecuteNonQuery("CREATE TABLE Test([ID] [bigint] IDENTITY(1,1) NOT NULL,[Message] [nvarchar](255) NULL)", 
      CommandType.Text, null); 

     var parameters = new Dictionary<string, object>(); 
     parameters.Add("@message", "Hello World!"); 
     database.ExecuteNonQuery("INSERT INTO Test(Message) VALUES(@message)", 
      CommandType.Text, parameters); 

     CleanUpSqlServerCe(); 
    } 
    private void CleanUpSqlServerCe() 
    { 
     if (File.Exists(SqlCeDbPath)) 
      File.Delete(SqlCeDbPath); 
    } 
    private Func<DbConnectionConfiguration> InitializeSqlServerCeInstance() 
    { 
     string connectionString = "Data Source=" + CurrentDir + @"\ASTest.sdf;Persist Security Info=False"; 

     CleanUpSqlServerCe(); 

     SqlCeEngine engine = new SqlCeEngine(connectionString); 
     engine.CreateDatabase(); 

     return() => 
     { 
      return new DbConnectionConfiguration() 
      { 
       DataProvider = "System.Data.SqlServerCe.4.0", 
       ConnectionString = connectionString 
      }; 
     }; 
    } 
} 

私の質問は、MySQLとSQL Serverのデータベース・プロバイダーのために、このクラスの統合テストを書くことができるか、でしょうか? このクラスの統合テストを作成してMySqlとSql Serverデータベースの両方でテストする最も実際的な方法は何ですか? MySQLのそれをテストするために

+1

テスト間で最も変更される可能性のあるコードを特定し、抽象ベースのテストクラスを作成します。これにより、各テストで必要な変更が行われます。 – Nkosi

+1

検証する動作を確認してください。あなたは、データベースに依存する他のコードを単体テストできるように、ラッパークラスを作成しました。ラッパーを明示的にテストする必要はありません。ラッパーを完全に検証するデータベース抽象化を使用しているメソッドを統合テストする必要があります。 –

+0

@DanielMannはい。これは、mysql、SQLサーバ、SQLサーバコンパクト版で動作するはずのデータアクセス層のラッパークラスです。私はそれのための統合テストを書くべきではありませんか? –

答えて