C# 模拟System.Data.SqlClient.X类

C# 模拟System.Data.SqlClient.X类,c#,mocking,moq,C#,Mocking,Moq,我们在代码库中有几个地方可以执行类似于以下内容的操作: DataTable dt = new DataTable(); using (DatabaseContext context = DatabaseContext.GetContext(false)) { IDbCommand cmd = context.CreateCommand("SELECT * FROM X"); SqlDataAdapter dataAdapter = new SqlDataAdapter((SqlC

我们在代码库中有几个地方可以执行类似于以下内容的操作:

DataTable dt = new DataTable();
using (DatabaseContext context = DatabaseContext.GetContext(false)) {
    IDbCommand cmd = context.CreateCommand("SELECT * FROM X");
    SqlDataAdapter dataAdapter = new SqlDataAdapter((SqlCommand)cmd);
    dataAdapter.Fill(dt);
}
return dt;
我们如何使用Moq这样的模拟测试框架来消除对数据库的测试依赖?我想模拟返回的数据表


澄清:我们计划更改此代码,但目前无法更改。有可能按原样模拟吗?

我建议使用模式,它将所有特定于数据库的代码隐藏在存储库中。您可以模拟存储库,以便在上面的层中测试您的逻辑

使用存储库来分离检索数据的逻辑和 将其从作用于实体的业务逻辑映射到实体模型 模型业务逻辑应该与所使用的数据类型无关 包括数据源层。例如,数据源层 可以是数据库、SharePoint列表或Web服务

存储库在数据源层和业务层之间进行调解 应用程序的层。它在数据源中查询数据, 将数据从数据源映射到业务实体,并保持不变 业务实体对数据源的更改。仓库 将业务逻辑与与基础架构的交互分离 数据源或Web服务


我建议使用模式,它将所有特定于数据库的代码隐藏在存储库中。您可以模拟存储库,以便在上面的层中测试您的逻辑

使用存储库来分离检索数据的逻辑和 将其从作用于实体的业务逻辑映射到实体模型 模型业务逻辑应该与所使用的数据类型无关 包括数据源层。例如,数据源层 可以是数据库、SharePoint列表或Web服务

存储库在数据源层和业务层之间进行调解 应用程序的层。它在数据源中查询数据, 将数据从数据源映射到业务实体,并保持不变 业务实体对数据源的更改。仓库 将业务逻辑与与基础架构的交互分离 数据源或Web服务


不能修改代码,我想你的意思是你不能进行大的重构。以下是我的建议

  • 提取您提供给方法的代码
  • 虚拟化
  • 如果它没有被保护或公开
  • 从包含此方法的类继承并将其命名为OriginalClassNameTesting,例如
  • 重写方法并返回不需要的任何数据表
  • 在测试中,使用原始ClassNameTesting类而不是原始类
  • 这种模式被称为“提取和覆盖”,它是《伟大的书》中提出的众多模式之一


    有些人可能不喜欢您只是为了测试而添加虚拟方法。那么,这只是第一步。你说过你有重构的计划。然后,在适当的地方进行测试是很重要的,这样你就可以确定你没有刹车。在Java中,默认情况下每个方法都是虚拟的(或者我错了吗?

    因为不能更改代码,我想你的意思是不能进行大型重构。以下是我的建议

  • 提取您提供给方法的代码
  • 虚拟化
  • 如果它没有被保护或公开
  • 从包含此方法的类继承并将其命名为OriginalClassNameTesting,例如
  • 重写方法并返回不需要的任何数据表
  • 在测试中,使用原始ClassNameTesting类而不是原始类
  • 这种模式被称为“提取和覆盖”,它是《伟大的书》中提出的众多模式之一


    有些人可能不喜欢您只是为了测试而添加虚拟方法。那么,这只是第一步。你说过你有重构的计划。然后,在适当的地方进行测试是很重要的,这样你就可以确定你没有刹车。在Java中,默认情况下每个方法都是虚拟的(或者我错了吗?

    是的,我们肯定希望尽快实现这一点。但是,目前我们无法更改此代码,所以有没有办法模拟它?我会在问题中澄清的。是的,我们肯定希望尽快解决这个问题。但是,目前我们无法更改此代码,所以有没有办法模拟它?我将在问题中澄清。如果您想使用免费的模拟框架,如Moq或Rhino,您将无法使用此代码模拟数据表。但是,您可以查看Typemock或JustMock来实现这一点(但这些选项很昂贵),如果您想使用Moq或Rhino之类的免费模拟框架,那么您将无法使用此代码模拟数据表。然而,您可以通过Typemock或JustMock来实现这一点(但这些都是昂贵的选项)