Unit testing 单元测试-删除SqlDataReader
我们有一个n层web应用程序,它从SQL Server提取数据。我们的数据访问逻辑返回一个SqlDataReader,其数据随后用于创建业务对象(也称为数据传输对象) 我们希望构建单元测试来检查解释这些SqlDataReader对象返回的数据以构建业务对象的代码 因此,在单元测试期间,似乎有必要构建存根来替换SqlDataReader对象。正如可能相当典型的那样,我们的SqlDataReader对象通常返回多个记录集,每个记录集都有多行Unit testing 单元测试-删除SqlDataReader,unit-testing,nunit,sqldatareader,stub,stub-data-generation,Unit Testing,Nunit,Sqldatareader,Stub,Stub Data Generation,我们有一个n层web应用程序,它从SQL Server提取数据。我们的数据访问逻辑返回一个SqlDataReader,其数据随后用于创建业务对象(也称为数据传输对象) 我们希望构建单元测试来检查解释这些SqlDataReader对象返回的数据以构建业务对象的代码 因此,在单元测试期间,似乎有必要构建存根来替换SqlDataReader对象。正如可能相当典型的那样,我们的SqlDataReader对象通常返回多个记录集,每个记录集都有多行 这是明智的做法吗 我们应该如何构建这些存根对象 非常感谢
Griff自动化测试基本上总是一项明智的努力:) 要测试这一点,第一步是让数据访问逻辑返回一个
IDataReader
,而不是SqlDataReader
-SqlDataReader
实现IDataReader
,因此没有问题
在单元测试中,您可以手动构建和填充DataTable
对象,并调用DataTable.CreateDataReader()
获取IDataReader
以传递到被测对象中
编辑
为了向您的测试提供一组样本数据,我建议对您使用的每个数据表使用一个,将数据表的创建保持在一个专用的位置。然后可以在每个ObjectMethod
类上放置方法,以强类型方式更新某些数据。例如:
public class PersonalDetailsBuilder
{
private DataTable _dataTable;
public PersonalDetailsBuilder CreateNewTable()
{
this._dataTable = new DataTable("CustomerPersonalDetails")
{
Columns =
{
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();
假设我们的一个IDataReader对象返回有关客户的详细信息:rs1=个人详细信息;rs2=权限;rs3-xxx等。大多数测试将使用此作为默认数据集。某些测试可能希望使用这些值中的大部分,但会覆盖数据表中的某些属性。这有多容易?几乎和继承一样……我不确定我是否理解——你是指一个用于多个结果集的数据读取器,还是一组数据读取器?无论如何,我已经更新了我的答案。