Mocking System.Data.SqlClient.X classes

本文关键字:classes SqlClient Data System Mocking | 更新日期: 2023-09-27 18:04:34

在我们的代码库中有几个地方我们做了类似于下面的事情:

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这样的模拟测试框架来消除我们对数据库的测试依赖?我想模拟返回的DataTable。

澄清:我们计划更改此代码,但目前不能。有可能这样嘲笑吗?

Mocking System.Data.SqlClient.X classes

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

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

存储库在数据源层和业务层之间进行中介应用程序的层。它向数据源查询数据,将数据从数据源映射到业务实体,并进行持久化业务实体对数据源的更改。存储库将业务逻辑与与底层的交互分离数据源或Web服务

我认为你说的不能改变代码是指你不能进行大规模的重构。这是我的建议。

  1. 提取提供给方法的代码
  2. 设置为虚拟
  3. 如果不是,将其设置为受保护或公开
  4. 从包含此方法的类继承,并将其命名为OriginalClassNameTesting,例如
  5. 重写方法并返回任何你不想要的数据表
  6. 在测试中使用你的OriginalClassNameTesting类而不是原来的。

这种模式被称为"提取和覆盖",它是一本伟大的书- http://www.amazon.com/Working-Effectively-Legacy-Michael-Feathers/dp/0131177052中介绍的许多模式之一。

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