使用线程,事件和私有方法测试类

时间:2010-10-26 22:54:59

标签: c# .net unit-testing nunit private-methods

普遍共识

我已经做了很多关于测试复杂类和私有方法的主题的阅读。

普遍的共识似乎是:

  • “如果你需要测试私有方法,那么你的课程设计很糟糕”
  • “如果你的课很复杂,那么你需要把它分开”

所以,我需要你的帮助。

问题类

所以我有一个相对简单的课程,其长期工作是:

  • 轮询数据源
  • 做一些非常简单的数据映射
  • 将该数据发送到其他地方

的方法,另外:

  • 如果出现某些错误,它需要能够重试各种任务才能具备相当的容错能力。

测试问题

该类的要点是抽象大量的容错和线程...基本上通过使用一个简单的Timer类和一些内部列表来跟踪错误等。

由于Timer,某些方法在异步上在不同的线程上调用...另外一堆方法依赖于全局私有字段。

我应该如何测试这个类...特别是因为有很多方法是私有的?

欢呼人们

2 个答案:

答案 0 :(得分:4)

我会提取代码以将数据轮询到可以模拟的单独类中,并且还提取出于相同原因发送该数据的代码。您可能希望提取数据映射代码,具体取决于它的简单程度。

我肯定会在单元测试中使用模拟计时器,否则你的测试很难设置并且运行缓慢。您可以在构造函数中传入计时器,也可以公开可以设置的属性。我经常在构造函数中创建一个常规计时器,然后从我的单元测试中覆盖它。

您也可以提取重试逻辑,以便可以与其他代码分开测试。传递代码的代理以尝试重试可能是将数据代码与重试逻辑分离的一种方法。您还可以使用IEnumerableyield语句生成数据并将其提供给重试代码。本质上,我正在寻找方法来使重试代码不直接调用它应该尝试重试的目标代码。这样可以更容易地测试并生成所有可能的错误,尽管只需模拟目标代码就可以获得一些相同的好处。

如果您确实需要测试多线程方案,那么可以使用一些工具来协调测试中的线程。其中一个是我创建的名为Java MultithreadedTCTickingTest端口。

答案 1 :(得分:1)

您可以尝试使用JMock之类的内容。这将让你用你可以控制的模拟计时器替换真正的计时器。然后,您可以设置以定义的顺序触发方法调用的测试用例,还可以通过创建模拟数据源来设置错误条件。

编辑:哎呀!没看到C#标签。也许有一个C#等同于JMock。