0

有没有办法将IDataReader对象转换为SqlDataReader对象?我试图SqlHelper通过用我自己的拦截IDataReader(因为我无法创建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。

4

2 回答 2

1

不,您不能将 a 转换IDataReaderSqlDataReader. SqlDataReader is a IDataReader - anSqlDataReader可以转换为IDataReadernot 相反。

您真正的问题是您的代码不是为了可测试而编写的。真的SqlHelper应该是一个实例类被传入并且可以被mock并返回一个IDataReader. 或者您正在测试的一个或多个方法可以被重构,因此它们不依赖于SqlHelper直接和 take IDataReader's。

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

于 2011-10-15T02:31:01.280 回答
0

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

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

于 2011-10-15T02:34:09.033 回答