我对模拟数据库有疑问。我看到使用moq来模拟数据库调用,如ExecuteScalar,ExecuteNonQuery等。请参阅链接http://www.codeproject.com/Articles/478504/Moq-Mock-Database。
但我无法找到有关模拟方法DiscoverParameters和ExecuteDataSet的任何信息。 而存储库接口通常是它的解决方案。
如何使用Moq测试DbCommand执行结果代码?
答案 0 :(得分:3)
我同意绝对可以通过各种方式嘲笑数据库。但真正的问题是我们应该吗?根据我的理解,当您尝试测试行为时,模拟是有意义的。 Aren或者不应该是数据库测试依赖于状态吗?如果我试图从一个城市获得用户数量,并且如果我专门对我的数据库访问层进行单元测试,那么如果我的C#代码实际上在SQL中转换,激活查询并返回实际数据,我会更有信心。创建和销毁这些数据的责任肯定在于开发人员。维护测试数据是一个问题,但我认为拥有和解决这个问题是个好问题。
单元测试依赖它的图层时,模拟数据访问层肯定是有意义的。但是在测试数据访问层时嘲笑数据库本身听起来像a)过度杀戮b)不完整。
答案 1 :(得分:0)
@ user3551790我已经使用Moq模拟了ExecuteDataSet,如下所示
string connectionString = "server=xx.xx.xx.xx;Trusted_Connection=false;user id=user;password=passowrd;database=DBName;Connect Timeout=360;";
var sqlConnection = new SqlConnection(connectionString);
var command = sqlConnection.CreateCommand();
Castle.DynamicProxy.Generators.AttributesToAvoidReplicating.Add(typeof(System.Data.SqlClient.SqlClientPermissionAttribute));
DataSet dsResult = new DataSet();
dsResult.Tables.Add(new DataTable());
dsResult.Tables[0].Columns.Add("Column1");
DataRow dr = dsResult.Tables[0].NewRow();
dsResult.Tables[0].Rows.Add(dr);
dsResult.Tables[0].Rows[0].ItemArray = new object[] { DBNull.Value};
dsResult.Tables.Add(new DataTable());
var mockDb = new Mock<SqlDatabase>(connectionString);
mockDb.Setup(a => a.GetStoredProcCommand("SP_NAME")).Returns(command);
mockDb.Setup(a => a.ExecuteDataSet(command)).Returns(dsResult);
但是,由于DiscoverParameters是非虚拟方法,因此您无法使用Moq来模拟它。你将不得不去Typemock