Próbuję kpić operacje bazy danych. Mam problem z wyśmiewaniem SqlParameterCollection
. Próbowałem utworzyćmetodę, która zwróci DbParameterCollection
, ale potem tracę wszystkie funkcje, które daje SqlParameterCollection
jak AddWithValue
itp. Czy istnieje sposób, że mogę kpić SqlParameterCollection
? Czy istnieje inne podejście do testu DAL na jednostkę? Używam Moq.Jak kpić SqlParameterCollection za pomocą Moq
Kod wygląda tak:
w DAL:
protected virtual IDbConnection GetConnection(string connectionString)
{
return new SqlConnection(connectionString);
}
protected virtual IDbCommand GetCommand(IDbConnection cn)
{
return cn.CreateCommand();
}
protected virtual IDbTransaction GetTransaction(IDbConnection cn)
{
return cn.BeginTransaction(IsolationLevel.Serializable);
}
Public Bool InsertInDatabase(DataTable dt)
{
using (IDbConnection cn = GetConnection(cnstr))
{
cn.Open();
using (IDbTransaction tran = GetTransaction(cn))
{
IDbCommand cmd = GetCommand(cn);
cmd.Transaction = tran;
cmd.Connection = cn;
cmd.CommandType = CommandType.StoredProcedure;
cmd.CommandText = "sp_InsertInDatabase";
SqlParameterCollection cmdParams = cmd.Parameters as SqlParameterCollection;
cmdParams.AddWithValue("@param1", dt);
cmd.ExecuteNonQuery();
}
}
}
W projekcie badanej jednostki:
protected override IDbConnection GetConnection(string connectionString)
{
return Mock.Of<IDbConnection>();
}
protected override IDbCommand GetCommand(IDbConnection cn)
{
return Mock.Of<IDbCommand>();
}
protected override IDbTransaction GetTransaction(IDbConnection cn)
{
return Mock.Of<IDbTransaction>();
}
public void TestInsertInDatabase()
{
base.InsertInDatabase(new DataTable());
}
--Solution--
Stworzył metodę rozszerzenia aby dodać parametr z wartością. Dziękuję Marc Gravell za skierowanie mnie w tamtą stronę.
public static IDbDataParameter AddParameterWithValue(this IDbCommand cmd, string paramName, object paramValue)
{
var dbParam = cmd.CreateParameter();
if (dbParam != null)
{
dbParam.ParameterName = paramName;
dbParam.Value = paramValue;
}
return dbParam;
}
Możecie chcesz zadzwonić .Parameters.Add z nowo utworzonego parametru, ponieważ oczekuje się ze związkiem Dodaj metodę –