SqlParameterCollection

SqlParameterCollection

我试图模拟数据库操作。我在模仿SqlParameterCollection方面有问题。我试图创建将返回virtualDbParameterCollection方法,但随后我将失去SqlParameterCollection提供的所有功能,如AddWithValue等。有没有方法可以模拟SqlParameterCollection?单元测试dal还有其他方法吗?我正在使用MOQ。
代码如下:
在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());
    }

--解决方案--
创建了一个扩展方法来添加带值的参数。谢谢马克·格雷弗尔把我指向那个方向。
    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;

    }

最佳答案

就我个人而言,我通过编写AddParameterWithValue扩展方法来解决这个问题。它必须在命令上,以便您可以访问DbCommand,然后调用IDbCommand
这允许对任何ado.net堆栈进行简单的使用,包括诸如日志修饰符之类的抽象。

10-02 00:48