我試圖模擬數據庫操作。我在嘲笑SqlParameterCollection
有問題。我試圖創建virtual
方法,將返回DbParameterCollection
,但然後我失去了SqlParameterCollection
給出的所有功能AddWithValue
等。有沒有辦法我可以模擬SqlParameterCollection
?是否有任何其他方法來單元測試DAL?我正在使用Moq。如何使用Moq模擬SqlParameterCollection
代碼是這樣的:
在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();
}
}
}
在單元測試項目:
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--
創建一個擴展方法來添加參數與值。謝謝Marc Gravell指示我朝那個方向走。
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;
}
您可能需要調用.Parameters.Add與新創建的參數,因爲這是預期與聽起來很有趣,添加方法 – 2011-06-16 19:08:42