Próbuję szukać skutecznego sposobu w testowaniu jednostki mojej warstwy dostępu do danych w języku C#. Jestem głównym programistą Java i używam C# tylko przez około 6 miesięcy, w przeszłości używałem biblioteki o nazwie DBUnit do testowania przeciwko znanej, stanowej bazie danych. Nie udało mi się znaleźć podobnej aktywnej biblioteki, która może być użyta, najbliższa wydaje się być nDBUnit, ale od jakiegoś czasu nie była aktywna.Sposoby testowania dostępu do danych na poziomie warstwy
Wydaje się, że istnieje wiele sprzecznych metod dotyczących sposobu i przyczyny w języku C#. Idealnie chcę przetestować warstwę dostępu do danych za pomocą szyderstwa bez konieczności łączenia się z bazą danych, a następnie przetestować procedurę sklepu w osobnym zestawie testów.
W systemie, nad którym pracuję, warstwa dostępu do danych ma używać ADO.net (bez użycia Entity Framework) do wywoływania procedur składowania na serwerze SQL.
Poniżej znajduje się przykładowy kod, nad którym mam pracować; aby przejść przez kpiącą ścieżkę, musiałbym móc wyśmiać SqlCommand (używając IDbCommand) i/lub pozorować SqlConnection.
Moje pytanie brzmi: co wydaje się najlepszym sposobem (jeśli jest coś takiego) do zrobienia tego? Do tej pory jedynym sposobem byłoby przekazanie obiektu Proxy do konstruktora, aby mógł on zwrócić wyśmiewane obiekty Sql * do testowania.
Nie miałem okazji przyjrzeć się jeszcze dostępnym dostępnym bibliotekom 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);
}
}
}
myślę, że to jest złe podejście i prowadzi do testów kruchych. Zobacz moją odpowiedź na moje rozumowanie i przykład tego, dlaczego. –