将IDataReader转换为SQLDataReader

本文关键字:SQLDataReader 转换 IDataReader | 更新日期: 2023-09-27 18:11:14

有办法将IDataReader对象转换为SqlDataReader对象吗?我试图通过使用我自己的IDataReader拦截SqlHelper(因为我不能创建SqlDataReader对象(来打破对API之一的数据库依赖。

这就是我的测试用例(以及评估TypeMock(的样子:

Isolate.Fake.StaticMethods(typeof(SqlHelper));
Isolate.WhenCalled(() => SqlHelper.ExecuteReader(string.Empty, CommandType.StoredProcedure, string.Empty))
     .WillReturn(myDataGenerator.ToDataReader() as SqlDataReader);

编译后不会出现任何问题,但不会返回任何行。当我调试时,我看到它根本没有任何行。有什么想法吗?

提前谢谢。

编辑(1(:由于转换是不可能的,是否可以模拟SqlDataReader。

将IDataReader转换为SQLDataReader

否,不能将IDataReader转换为SqlDataReaderSqlDataReaderIDataReader——SqlDataReader可以转换为IDataReader,而不是相反。

你真正的问题是你的代码不是为了可测试而写的。实际上SqlHelper应该是一个实例类,它被传入并可以被模拟并返回一个IDataReader。或者,您正在测试的一个或多个方法可以进行重构,这样它们就不会直接依赖于SqlHelper而采用IDataReader

但是,如果我怀疑您不能控制这段代码,您可以创建自己的DataReader,它继承自SqlDataReader。所有的IDataReader方法都是虚拟的,所以你可以自己覆盖它们。

那么您的SqlHelper.ExecuteReader应该返回SqlDataReader吗?为什么不让SqlHelper.ExecuteReader使用IDataReader呢。

shf301的答案刚刚发布,写得比我的好,但这正是你需要知道的。