模拟System.Data.SqlClient.X类

时间:2011-08-05 23:23:24

标签: c# mocking moq

我们在代码库中有几个地方,我们会做类似以下的事情:

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。

澄清:我们计划更改此代码但目前不能。是否有可能按原样嘲笑?

2 个答案:

答案 0 :(得分:2)

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

  

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

     

存储库在数据源层和业务之间进行调解   应用层。它在数据源中查询数据,   将数据从数据源映射到业务实体,并持续存在   业务实体中的更改到数据源。存储库   将业务逻辑与与底层的交互分开   数据源或Web服务。

答案 1 :(得分:1)

通过无法更改代码我认为你的意思是你不能做一个大的重构。这就是我的建议。

  1. 提取您提供给方法的代码。
  2. 虚拟
  3. 如果不是保护或公开
  4. 从包含此方法的类继承,并将其命名为OriginalClassNameTesting,例如
  5. 覆盖方法并返回您想要的任何DataTable
  6. 在测试中使用您的OriginalClassNameTesting类而不是原始类。
  7. 这种模式被称为“提取和覆盖”,它是好书中提到的众多模式之一 - http://www.amazon.com/Working-Effectively-Legacy-Michael-Feathers/dp/0131177052

    有些人可能不喜欢您正在添加虚拟方法仅用于测试。那么,这只是第一步。你说你有重构的计划。然后进行测试非常重要,这样你就可以确定你没有制动任何东西。在Java中,默认情况下每个方法都是虚拟的(或者我错了?)