如何让模拟<idatareader>有字段数?

时间:2016-08-03 21:02:31

标签: c# unit-testing mocking moq

我正在使用moq来测试C#代码。测试方法传入IDataReader作为参数。我使用Mock通过设置每个字段的键和值来模拟数据读取器(redare.Setup(x =&gt; x [&#34; fieldName&#34;])。返回(值))。但是,我们还有一个在测试方法中调用的方法。被调用的方法是测试读者正在读取的字段是否存在。我发现,当模拟读者使用Mocked reader.Object转换为IDataReader时,Mocked读者没有计算任何字段。任何人都可以帮助我如何在模拟中设置字段计数/字段名称?非常感谢!

更新: 我用这篇文章解决了我的问题。谢谢你的回复。 How to mock IDataReader to test method which converts SqlDataReader to System.DataView

1 个答案:

答案 0 :(得分:0)

到目前为止,我所阅读的所有内容都表明,创建IDataReader的功能模拟将至少与您正在测试的代码一样复杂,可能更多。

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

This blog post更详细地描述了它。

对于这种操作,我相信它不仅仅是模拟,因为它测试数据库和我的存储过程。它不像单元测试那样精细,但它具有相同的用途。如果存储过程或从中读取的代码存在缺陷,我将很容易找到它们并修复它们。

我已经阅读了一些建议,对于某些操作,集成测试比单元测试更实用(除非你可以同时执行这两项操作。)这看起来像是其中一种情况。我用来模仿IDataReader的所有代码看起来都非常复杂,最终与您正在测试的现实有太大不同。

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

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

  1. 在集成测试中编写一个方法,&#34;安排&#34;通过插入一些测试数据。我通常在一个列中包含一些特定的字符串或数字,以便在测试后我可以准确删除那些记录。
  2. &#34;法&#34; - 调用方法我测试并从数据库中读取。这通常会返回一些对象集合。
  3. &#34;断言&#34;返回的对象的属性与我插入的值匹配。