【问题标题】:Convert IDataReader to SQLDataReader将 IDataReader 转换为 SQLDataReader
【发布时间】:2011-10-15 02:01:22
【问题描述】:

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

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

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

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

提前致谢。

编辑(1): 既然不能转换,那能不能mock SqlDataReader。

【问题讨论】:

  • 你说 - 它编译成功然后可能有另一个问题。请在此处发布相关代码。

标签: c# nunit typemock


【解决方案1】:

不,您不能将 IDataReader 转换为 SqlDataReaderSqlDataReader is a IDataReader - SqlDataReader 可以转换为 IDataReader 而不是相反。

您真正的问题是您的代码不是为了可测试而编写的。真的SqlHelper应该是一个实例类传入,可以mock,返回一个IDataReader。或者可以重构您正在测试的一个或多个方法,这样它们就不会依赖SqlHelper 直接使用IDataReader 的方法。

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

【讨论】:

  • 你说得对,我无法控制该代码。我可以创建自己的 DataReader,但这无助于现有的庞大代码库。就像我先做哪个?为遗留代码编写测试用例,以便我可以重构。或者重构,以便我可以为它编写测试用例。无论如何,非常感谢。
  • 注意:System.Data.SqlClient.SqlDataReader 不能被继承。帮助程序类必须实现 IDataReader 并包装 SqlDataReader 的实例。此外, IDataReader 在接口中,而不是抽象类。因此,IDataReader 的所有成员都必须在 helper 类中实现。
  • 你可以:IDataReader reader = (一些代码来获取结果) SqlDataReader sDataReader = (SqlDataReader) reader;
【解决方案2】:

所以你的 SqlHelper.ExecuteReader 应该返回一个 SqlDataReader?为什么不让 SqlHelper.ExecuteReader 使用 IDataReader。

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

【讨论】:

    猜你喜欢
    • 2016-05-14
    • 2011-09-02
    • 1970-01-01
    • 2014-12-13
    • 2011-04-03
    • 2013-06-19
    • 1970-01-01
    • 1970-01-01
    • 2011-07-02
    相关资源
    最近更新 更多