Я пытаюсь найти эффективный способ модульного тестирования моего уровня доступа к данным в С#. Я являюсь основным разработчиком Java и использую только С# около 6 месяцев, в прошлом я использовал библиотеку DBUnit для тестирования с известной государственной базой данных. Мне не удалось найти подобную активную библиотеку, которая может быть использована, ближайшая, кажется, nDBUnit, но она неактивна уже некоторое время.
Кажется, что существует много противоречивых методов о том, как и почему в С#. В идеале я хочу протестировать уровень доступа к данным, используя насмешку без необходимости подключения к базе данных, а затем unit test процедуру хранения в отдельном наборе тестов.
В системе, над которой я работаю, уровень доступа к данным заключается в использовании ADO.net(без использования Entity Framework) для вызова процедур хранилища на SQL Server.
Ниже приведен пример кода, с которым мне нужно работать; чтобы спуститься с насмешливым путем, я должен был бы высмеять SqlCommand (используя IDbCommand) и/или высмеять SqlConnection.
Итак, мой вопрос - это лучший способ (если есть такая вещь) сделать это? До сих пор единственным способом было бы сделать объект Proxy, который передается в конструктор, чтобы он мог вернуть издеваемые объекты Sql * для тестирования.
У меня не было возможности посмотреть все доступные доступные библиотеки С#.
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);
}
}
}