Sto provando a cercare un modo efficace in unità di test del mio livello di accesso ai dati in C#. Sono uno sviluppatore Java primario e ho usato C# per circa 6 mesi, in passato ho usato una libreria chiamata DBUnit per testare un database di stato conosciuto. Non sono stato in grado di trovare una libreria attiva simile che possa essere utilizzata, la più vicina sembra essere nDBUnit ma non è attiva da un po 'di tempo.Modi di accesso ai dati di test del livello di accesso
Sembra esserci un sacco di metodi contrastanti su come e perché in C#. Idealmente, voglio testare il livello di accesso ai dati utilizzando il mocking senza la necessità di connettersi a un database e quindi l'unità testare la procedura di archiviazione in una serie separata di test.
Nel sistema su cui sto lavorando, il livello di accesso ai dati è quello di utilizzare ADO.net (senza l'utilizzo di Entity Framework) per chiamare le stored procedure su un server SQL.
Di seguito è riportato un codice di esempio su cosa devo lavorare; per andare giù per il percorso di derisione, dovrei essere in grado di simulare SqlCommand (usando IDbCommand) e/o prendere in giro SqlConnection.
Quindi la mia domanda è quello che sembra essere il modo migliore (se c'è una cosa del genere) per fare questo? Finora l'unico modo sarebbe stato rendere l'oggetto Proxy passato al costruttore in modo che potesse restituire gli oggetti Sql * falsificati per il test.
Non ho ancora avuto la possibilità di consultare tutte le librerie di mock C# disponibili.
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);
}
}
}
Credo che questo sia l'approccio sbagliato, e porta a test fragili. Vedi la mia risposta per il mio ragionamento e un esempio del perché. –