我试图模拟数据库操作.我在模拟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; }
解决方法
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。