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堆栈,包括日志记录装饰器等抽象. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |