有没有办法将IDataReader
对象转换为SqlDataReader
对象?我试图通过使用我自己的SqlHelper
拦截IDataReader
来破坏数据库依赖关系到API之一(因为我无法创建SqlDataReader
对象)。
这是我的测试用例的样子(并评估TypeMock):
Isolate.Fake.StaticMethods(typeof(SqlHelper));
Isolate.WhenCalled(() => SqlHelper.ExecuteReader(string.Empty, CommandType.StoredProcedure, string.Empty))
.WillReturn(myDataGenerator.ToDataReader() as SqlDataReader);
这个编译没有问题,但不返回任何行。当我调试时,我发现它根本没有任何行。有什么想法吗?
提前致谢。
修改(1): 由于无法进行转换,因此可以模拟SqlDataReader。
答案 0 :(得分:1)
不,您无法将IDataReader
转换为SqlDataReader
。 SqlDataReader
is a IDataReader
- SqlDataReader
可以转换为IDataReader
而非其他方式。
您真正的问题是您的代码编写不可测试。实际上SqlHelper
应该是传入的实例类,可以进行模拟并返回IDataReader
。或者您正在测试的方法或方法可以重构,因此它们不依赖于SqlHelper
direclty并取IDataReader
个。
但是,如果我怀疑您不控制此代码,则可以创建自己的继承自SqlDataReader
的DataReader。所有IDataReader
方法都是虚拟的,因此您可以自己覆盖它们。
答案 1 :(得分:0)
那么你的SqlHelper.ExecuteReader应该返回一个SqlDataReader?你为什么不让你的SqlHelper.ExecuteReader使用IDataReader。
shf301的答案刚刚发布,写的比我的好,但正是你需要知道的。