Ich habe versucht, nach einem effektiven Weg in Unit-Tests meiner Datenzugriffsschicht in C# zu suchen. Ich bin hauptsächlich ein Java-Entwickler und habe C# nur für ungefähr 6 Monate verwendet, in der Vergangenheit habe ich eine Bibliothek namens DBUnit verwendet, um gegen eine bekannte Zustandsdatenbank zu testen. Ich konnte eine ähnliche aktive Bibliothek nicht finden, die verwendet werden kann, am nächsten zu sein scheint nDBUnit, aber es war jetzt für eine Weile nicht aktiv.Ways of Unit Testing Datenzugriffsschicht
Es scheint eine Menge widersprüchlicher Methoden zu geben, wie und warum in C#. Idealerweise möchte ich die Datenzugriffsebene mithilfe von Mocking testen, ohne eine Verbindung zu einer Datenbank herstellen zu müssen, und anschließend die Speicherprozedur in einer separaten Testgruppe testen.
In dem System, an dem ich gerade arbeite, verwendet die Datenzugriffsebene ADO.net (ohne die Verwendung des Entity Framework), um Speicherprozeduren auf einem SQL Server aufzurufen.
Unten ist ein Beispielcode, mit dem ich arbeiten muss; Um den spöttischen Pfad runter zu gehen, müsste ich in der Lage sein, den SqlCommand zu verspotten (mit IDbCommand) und/oder die SqlConnection zu verspotten.
Also meine Frage ist, was scheint der beste Weg zu sein (wenn es so etwas gibt), dies zu tun? Bisher besteht die einzige Möglichkeit darin, ein Proxy-Objekt zu erstellen, das an den Konstruktor übergeben wird, damit es die verspotteten Sql * -Objekte zum Testen zurückgeben kann.
Ich hatte noch keine Gelegenheit, alle verfügbaren verfügbaren C# Mock-Bibliotheken zu betrachten.
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);
}
}
}
ich denke, das der falsche Weg ist, und führt zu spröde Tests. Siehe meine Antwort für meine Argumentation und ein Beispiel dafür, warum. –