C# でデータ アクセス レイヤーを単体テストする効果的な方法を探しています。私は主に Java 開発者であり、C# を約 6 か月しか使用していません。過去に、既知の状態データベースに対してテストするために DBUnit というライブラリを使用しました。使用できる同様のアクティブなライブラリを見つけることができませんでした。最も近いのは nDBUnit のようですが、しばらくアクティブになっていません。
C# での方法と理由については、多くの競合する方法があるようです。理想的には、データベースに接続せずにモックを使用してデータ アクセス レイヤーをテストし、別のテスト セットでストア プロシージャを単体テストしたいと考えています。
私が取り組んでいるシステムでは、データ アクセス レイヤーは (Entity Framework を使用せずに) ADO.net を使用して、SQL Server のストア プロシージャを呼び出します。
以下は、私が作業しなければならないサンプルコードです。モック パスをたどるには、(IDbCommand を使用して) SqlCommand をモックしたり、SqlConnection をモックしたりできる必要があります。
だから私の質問は、これを行うための最良の方法と思われるものは何ですか? これまでのところ唯一の方法は、コンストラクターに渡される Proxy オブジェクトを作成して、テスト用にモックされた Sql* オブジェクトを返すことができるようにすることです。
利用可能な C# モック ライブラリをすべて見る機会はまだありません。
public class CustomerRepository : ICustomerRepository
{
private string connectionString;
public CustomerRepository (string connectionString)
{
this.connectionString = connectionString;
}
public int Create(Customer customer)
{
SqlParameter paramOutId = new SqlParameter("@out_id", SqlDbType.Int);
paramOutId.Direction = ParameterDirection.Output;
List<SqlParameter> sqlParams = new List<SqlParameter>()
{
paramOutId,
new SqlParameter("@name", customer.Name)
}
SqlConnection connection = GetConnection();
try
{
SqlCommand command = new SqlCommand("store_proc_name", connection);
command.CommandType = CommandType.StoredProcedure;
command.Parameters.AddRange(sqlParams.ToArray());
int results = command.ExecuteNonQuery();
return (int) paramOutId.Value;
}
finally
{
CloseConnection(connection);
}
}
}