我正在为我的数据访问层编写单元测试。为了实现这一目的,我创建了一个SqlCommand的包装器(ISqlCommand),以便我可以模拟其功能。
ISqlCommand command = _connection.GetSqlCommand(sqlCommand);
在我正在测试的一个方法中,调用了SqlCommand的ExecuteReader方法,我必须返回一个SqlDataReader。
SqlDataReader reader = command.ExecuteReader(CommandBehavior.SingleRow);
在同样的方法中,会调用reader.Read。
if (reader.Read())
{
someVariable = reader.GetString(1);
}
我希望能从模拟的command.ExecuteReader()方法中返回一个SqlDataReader对象,并且这个对象中要有值供我读取。能做到吗?似乎只有在运行并返回SqlDataReader的实际SqlCommand.ExecuteReader时,才能实例化SqlDataReader。
需要测试的完整相关代码。
ISqlCommand command = _connection.GetSqlCommand(sqlCommand);
using (command)
{
SqlDataReader reader = command.ExecuteReader(CommandBehavior.SingleRow);
if (reader.Read())
{
dbVersion = reader.GetString(1);
}
}
编辑:为了澄清我的问题,SqlDataReader没有公共构造函数。据我所知,如果不使用SqlCommand进行合法调用,我无法实例化该类,因此无法使用该类编写任何测试。即使尝试创建SqlDataReaderWrapper接口也无济于事,因为问题是相同的。我并非试图编写集成测试(实际调用数据库),因此DataReader似乎无法像现在这样进行测试。我的问题是,在这种情况下,是否有什么方法可以将值放入SqlDataReader中?
IDataRecord
接口,它提供了对于DataReader中每一行的列值的访问。你可以简单地将reader强制转换为它:var record = (IDataRecord)reader;
。 - Tim Schmelter