使用Shims Visual Studio 2012对数据访问层进行单元测试

时间:2012-10-08 11:22:50

标签: unit-testing visual-studio-2012

我有访问数据库的lagecy ASP.Net代码。有数据访问层,它形成sqlcommands并在数据库上执行。

对数据访问层进行单元测试的最佳方法是什么?我们应该实际连接到数据库并执行测试用例还是只使用假货?

使用垫片是否是个好主意(如下文所述)?

http://msdn.microsoft.com/en-us/library/hh549176.aspx

2 个答案:

答案 0 :(得分:2)

假设您的旧DLL已被管理,您应该能够在VS2012中使用Fakes功能。假货真的是为了做到这一点。 Fakes的典型用法如下:

  1. 创建新的单元测试项目
  2. 添加对此旧版DLL的引用(例如Legacy.DLL)。确保在此单元测试项目中引用了所有相关DLL。
  3. 右键单击解决方案Reference文件夹中的Legacy.DLL,选择“Add Fakes Assembly”。这会为Legacy.DLL中定义的类型生成填充程序。
  4. 同时添加对项目代码的引用(假设您要对产品方法进行单元测试)
  5. 在TestMethod1中,您可以启动Legacy.DLL中定义的填充方法并测试您的产品代码。
  6. 您还可以在http://msdn.microsoft.com/en-us/library/hh708916.aspx

    上找到有用的信息

答案 1 :(得分:2)

测试数据访问层的最佳方法是编写实际连接到数据库的集成测试。使用假货(无论是Microsoft Fakes还是任何其他测试隔离框架)都不是一个好主意。这样做会阻止您验证数据访问层中的查询逻辑,这就是您想要首先测试它的原因。

通过粒度集成测试通过共享内存协议访问本地SQL数据库,您可以轻松地每分钟执行数百个测试。但是,每个测试必须负责创建自己的测试环境(即它访问的表中的测试记录)并清理它以便允许可靠的测试执行。如果您的数据访问层未明确管理事务,请首先使用TransactionScope在每次测试结束时自动回滚所有更改。这是最简单和最好的选项,但是如果这不起作用(如果遗留代码在内部管理事务),请尝试删除每个测试开始时先前测试留下的数据。或者,您可以通过始终为每个测试中的所有记录使用新的唯一主键来确保测试不会相互影响。通过这种方式,您可以每次测试每次测试数据库清理一次,并提高性能。