自动化测试通常是一个明智的努力 :)
要能够测试这个功能的第一步是,让您的数据访问逻辑返回一个 IDataReader
而不是 SqlDataReader
-- 由于 SqlDataReader
实现了 IDataReader
,所以没有问题。
在您的单元测试中,您可以手动构建和填充 DataTable
对象,并调用 dataTable.CreateDataReader()
来获取一个 IDataReader
,然后将其传递给测试对象。
编辑
为了为您的测试提供一组示例数据,我建议为每个使用的数据表使用一个 ObjectMother,将创建数据表的过程放在一个专门的地方。然后,您可以在每个 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();
AddStandardData
方法,它只有一个类型为Action<DataRowCollection>
的参数;在你的重载方法内部,你将调用原始的AddStandardData
方法,然后执行该操作,传递this._DataTable.Rows
属性。然后你可以在操作中操纵数据表中行的内容。 - David Keaveny