加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 如何使用Moq模拟SqlParameterCollection

发布时间:2020-12-15 08:25:56 所属栏目:百科 来源:网络整理
导读:我试图模拟数据库操作.我在模拟SqlParameterCollection时遇到问题.我试图创建将返回DbParameterCollection的虚方法,但后来我失去了SqlParameterCollection给出的所有功能,如AddWithValue等.有没有办法可以模拟SqlParameterCollection?单元测试DAL还有其他方
我试图模拟数据库操作.我在模拟SqlParameterCollection时遇到问题.我试图创建将返回DbParameterCollection的虚方法,但后来我失去了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());
    }

– 解 –

创建了一个扩展方法来添加带有值的参数.谢谢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;

    }

解决方法

就个人而言,我通过向DbCommand(或IDbCommand)编写AddParameterWithValue扩展方法来解决此问题.它必须在命令上才能访问 CreateParameter,然后调用.Parameters.Add.

这允许轻松使用任何ADO.NET堆栈,包括日志记录装饰器等抽象.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读