3

普遍共识

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

普遍的共识似乎是:

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

所以,我需要你的帮助。

问题类

所以我有一个相对简单的类,它的长期工作是:

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

另外:

  • 它需要能够通过在出现某些错误时重试各种任务来具有相当的容错性。

测试问题

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

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

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

欢呼伙计们

4

2 回答 2

4

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

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

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

如果您确实有需要测试的多线程场景,那么有一些工具可以在测试中协调线程。其中之一是我为Java MultithreadedTC创建的一个名为TickingTest的端口。

于 2010-10-27T17:33:16.473 回答
1

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

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

于 2010-10-26T23:04:37.013 回答