如何制作Mock<;IDataReader>;有字段计数

本文关键字:字段 gt IDataReader 何制作 lt Mock | 更新日期: 2023-09-27 18:00:02

我正在使用moq来测试C#代码。测试的方法有一个传入的IDataReader作为参数。我使用Mock通过设置每个字段的键和值来模拟数据读取器(redare.setup(x=>x["fieldName"]).Returs(value))。然而,我们在测试的方法中也调用了一个方法。被调用的方法是测试读取器正在读取的字段是否存在。当模拟阅读器使用模拟阅读器向IDataReader广播时,我发现模拟阅读器没有任何字段计数。对象有人能帮我如何在Mock中设置字段计数/字段名称吗?非常感谢!

更新:我用这个帖子来解决我的问题。感谢您的回复。如何模拟IDataReader以测试将SqlDataReader转换为System.DataView 的方法

如何制作Mock<;IDataReader>;有字段计数

到目前为止,我所读到的一切都表明,创建IDataReader的函数模拟至少与您正在测试的代码一样复杂,可能更复杂。

我的建议是编写一个集成测试,而不是单元测试。我的测试项目中通常有一些辅助方法,这些方法将我期望的记录插入到开发数据库中,这样我就可以确切地知道测试应该返回什么。执行测试后,我清除测试数据。

这篇博客文章更详细地描述了它。

对于这种操作,我更信任它,而不是mock,因为它正在测试数据库和我的存储过程。它不像单元测试那样细粒度,但它具有相同的目的。如果存储过程或从中读取的代码中存在缺陷,我会很容易地找到并修复它们。

我读过很多建议,认为对于某些操作来说,集成测试比单元测试更实用(除非两者都可以)。我看到的所有用于嘲笑IDataReader的代码看起来都非常复杂,而且最终与您正在测试的实际情况相差太大。


在博客文章中的示例代码中,我使用一个类插入数据,然后进行测试以确保SELECT返回预期的数据。

对于测试一个读取数据的类,我会做相反的事情。

  1. 在集成测试中编写一个方法,通过插入一些测试数据来"排列"。我通常会把一些东西放在至少一列中,比如一个特定的字符串或数字,这样在测试之后我就可以准确地删除这些记录
  2. "Act"-调用我正在测试的方法,并从数据库中读取它。这通常会返回一些对象集合
  3. "断言"返回的对象的属性与我插入的值匹配