如何使用Moq模拟数据库方法调用?

时间:2014-04-22 20:53:32

标签: c# database unit-testing moq

我对模拟数据库有疑问。我看到使用moq来模拟数据库调用,如ExecuteScalar,ExecuteNonQuery等。请参阅链接http://www.codeproject.com/Articles/478504/Moq-Mock-Database

但我无法找到有关模拟方法DiscoverParameters和ExecuteDataSet的任何信息。 而存储库接口通常是它的解决方案。

  

如何使用Moq测试DbCommand执行结果代码?

2 个答案:

答案 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