C# 我是否可以创建SqlDataReader并为其提供值,而不必从另一个对象(例如SqlCommand.ExecuteReader()返回SqlDataReader)

C# 我是否可以创建SqlDataReader并为其提供值,而不必从另一个对象(例如SqlCommand.ExecuteReader()返回SqlDataReader),c#,.net,unit-testing,mocking,moq,C#,.net,Unit Testing,Mocking,Moq,我正在为我的数据访问层编写单元测试。为了实现这一点,我为SqlCommand创建了一个包装器(ISqlCommand),以便模拟它的功能 ISqlCommand command = _connection.GetSqlCommand(sqlCommand); 在我正在测试的一个方法中,正在调用SqlCommand的ExecuteReader方法,我必须返回一个SqlDataReader SqlDataReader reader = command.ExecuteReader(CommandBe

我正在为我的数据访问层编写单元测试。为了实现这一点,我为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);
}
我想要的是能够从mock命令.ExecuteReader()返回一个SqlDataReader对象,并提供一个值供我读取。能做到吗?SqlDataReader似乎只能从正在运行并返回SqlDataReader的实际SqlCommand.ExecuteReader实例化。 待测试的完整相关代码

ISqlCommand command = _connection.GetSqlCommand(sqlCommand);

using (command)
{
    SqlDataReader reader =  command.ExecuteReader(CommandBehavior.SingleRow);

    if (reader.Read())
    {
        dbVersion = reader.GetString(1);
    }
}

编辑:澄清我的问题。SqlDatareader没有公共构造函数。据我所知,我无法使用该类编写任何测试,因为如果不使用SqlCommand对数据库进行合法调用,我无法实例化它。即使尝试创建SqlDataReaderRapper的接口也帮不了我,因为问题是一样的。我没有试图编写集成测试(实际调用DB),因此DataReader似乎不可能按原样进行测试。我的问题是,在这种情况下,我能做些什么来将值放入SqlDataReader吗?

我假设您没有使用模拟框架。这样做会有所帮助,但您可能应该像上面建议的那样嘲笑IDataReader。这是前面一个使用Rhinomock的问题。这可能会有帮助

另外,我注意到您制作了一个ISqlCommand,我建议您在它的开箱即用界面上使用IDbCommand,这将使您的测试不那么脆弱,因为它将允许在需要时替换其他命令对象

我刚刚模拟了数据读取器,它运行良好:

 Mock<IDataReader> mockDataReader = new Mock<IDataReader>();
 bool success = true;
 mockDataReader.Setup(x => x.Read())
               .Returns(() => success).Callback(() => success = false);
 Assert.IsTrue(mockDataReader.Object.Read());
Mock mockDataReader=new Mock();
布尔成功=真;
mockDataReader.Setup(x=>x.Read())
.Returns(()=>success).Callback(()=>success=false);
Assert.IsTrue(mockDataReader.Object.Read());

这里有一个很好的例子:

我假设您正在寻找一个接口,该接口为DataReader提供对每行中列值的访问。您可以简单地将读取器转换为:
var-record=(IDataRecord)读取器。签出此MSDN链接IDataReader嘿,我正在使用Moq作为我的框架。我曾试图模仿数据读取器,但无济于事。它没有构造函数,所以即使我为它的包装器创建了一个接口,我仍然无法为它提供测试所需的值。我可能只是尝试重构代码,完全替换数据读取器,因为我发现它完全不稳定。