2012-03-28 75 views
12

我们有一个从SQL Server中提取数据的n层Web应用程序。我们的数据访问逻辑返回一个SqlDataReader,它的数据被用来创建我们的业务对象(又名数据传输对象)。单元测试 - 存储SqlDataReader

我们希望构建单元测试来检查解释由这些SqlDataReader对象返回的数据以构建业务对象的代码。

因此,似乎有必要构建存根以在单元测试期间替换SqlDataReader对象。可能相当典型,我们的SqlDataReader对象通常会返回多个记录集,每个记录集都有多行。

  1. 这是一个明智的努力吗?
  2. 我们应该如何去建立这些存根对象?

提前感谢

格里夫

回答

24

自动化测试基本上总是一个明智的努力:)

你的第一步能够测试,这是有数据访问逻辑回归一个IDataReader而不是SqlDataReader - SqlDataReader实现IDataReader,所以没有问题。

在你的单元测试,那么你可以手动生成并填充DataTable对象,并调用dataTable.CreateDataReader()得到一个IDataReader通入被测物。

编辑

要为您的测试用样本数据集,我建议使用ObjectMother您所使用的每个数据表,保持数据表中创建一个专用的地方。然后,您可以在每个类上使用方法以强类型方式更新某些数据。例如:

public class PersonalDetailsBuilder 
{ 
    private DataTable _dataTable; 

    public PersonalDetailsBuilder CreateNewTable() 
    { 
     this._dataTable = new DataTable("CustomerPersonalDetails") 
     { 
      Columns = new[] 
      { 
       new DataColumn("CustomerId", typeof(int)), 
       new DataColumn("CustomerName", typeof(string)) 
      } 
     }; 

     return this; 
    } 

    public PersonalDetailsBuilder AddStandardData(int numberOfRows = 3) 
    { 
     foreach (int i in Enumerable.Range(1, numberOfRows + 1)) 
     { 
      this.AddRow(i, "Customer " + i); 
     } 

     return this; 
    } 

    public PersonalDetailsBuilder AddRow(int customerId, string customerName) 
    { 
     this._dataTable.Rows.Add(customerId, customerName); 

     return this; 
    } 

    public IDataReader ToDataReader() 
    { 
     return this._dataTable.CreateDataReader(); 
    } 
} 

...然后你可以使用这样得到的数据读取器:

IDataReader customerDetailsReader = new PersonalDetailsBuilder() 
    .CreateNewTable() 
    .AddStandardData() 
    .AddRow(17, "Customer 17") 
    .ToDataReader(); 
+0

试想一下,我们的IDataReader的对象之一返回有关客户的详细信息:RS1 =个人信息; rs2 =权限; rs3 - xxx等。大多数测试将使用它作为默认数据集。一些测试可能希望使用大部分这些值,但是会覆盖数据表中的一些属性。那有多容易?几乎就像继承...... – DrGriff 2012-03-29 05:58:55

+0

我不确定我是否理解 - 您是指多个结果集或一组数据读取器的单个数据读取器?无论如何,我已经更新了我的答案。 – 2012-03-29 10:13:43

+0

为什么downvote?任何人...? – 2016-11-29 13:33:21