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

普遍共识

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

普遍的共识似乎是:

>“如果您需要测试私有方法,那么您的类设计不佳”
>“如果您的课程很复杂,那么您需要将其分开”

所以,我需要你的帮助.

问题类

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

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

附加地:

>它需要能够在某些错误的情况下重试各种任务,从而具有足够的容错能力.

测试问题

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

由于使用了Timer,因此某些方法会在不同的线程上异步调用……另外,还有许多方法依赖于全局私有字段.

我应该如何测试该类……尤其是因为有很多方法是私有的?

欢呼的家伙

解决方法:

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

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

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

如果您确实有需要测试的多线程方案,则可以使用一些工具来协调测试中的线程.其中之一是我创建的Java MultithreadedTC端口,称为TickingTest.

上一篇:【ybtoj高效进阶 21285】独立生物(图论)(博弈论)(DP)


下一篇:题解 CF494E 【Sharti】