c# - 深度克隆的单元测试

标签 c# .net unit-testing

假设我有一个复杂的 .NET 类,其中包含大量数组和其他类对象成员。我需要能够生成该对象的深度克隆 - 所以我编写了一个 Clone() 方法,并使用简单的 BinaryFormatter 序列化/反序列化实现它 - 或者我可能使用其他更容易出错的技术进行深度克隆我想确保已经过测试。

好吧,现在(好吧,我应该先做)我想编写涵盖克隆的测试。该类的所有成员都是私有(private)的,而且我的架构非常好(!)以至于我不需要编写数百个公共(public)属性或其他访问器。该类不是 IComparable 或 IEquatable,因为应用程序不需要它。我的单元测试位于生产代码的单独程序集中。

人们采用什么方法来测试克隆的对象是否是一个好的副本?您是否编写(或在发现需要克隆后重写)该类的所有单元测试,以便可以使用或者“处女”对象调用它们< em>或用它的克隆?如果部分克隆不够深入,您将如何测试 - 因为这种问题可能会在以后产生可怕的错误?

最佳答案

您的测试方法将取决于您提出的解决方案类型。如果您编写了一些自定义克隆代码并且必须在每种可克隆类型中手动实现它,那么您应该真正测试每种类型的克隆。或者,如果您决定走一条更通用的路线(上述反射可能适用),您的测试将只需要测试您的克隆系统必须处理的特定场景。

回答您的具体问题:

Do you write (or rewrite once you discover the need for the clone) all your unit tests for the class so that they can be invoked with either a 'virgin' object or with a clone of it?

您应该对可以在原始对象和克隆对象上执行的所有方法进行测试。请注意,设置一个简单的测试设计来支持这一点应该非常容易,而无需手动更新每个测试的逻辑。

How would you test if part of the cloning wasn't deep enough - as this is just the kind of problem which can give hideous-to-find bugs later?

这取决于您选择的克隆方法。如果您必须手动更新可克隆类型,那么您应该测试每种类型是否正在克隆所有(且仅)您期望的成员。然而,如果您正在测试克隆框架,我会创建一些测试可克隆类型来测试您需要支持的每个场景。

关于c# - 深度克隆的单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10949/

相关文章:

c# - 在 .NET 中将 int 转换为位数组

c# - MVC3 - 局部 View 中的多个 Ajax 表单在刷新时都填充了相同的数据

C# 线程同步

c# - 加载自定义 checkin 策略时出错 Visual Studio 2015

c# - WPF: Canvas 吞噬 MouseDownEvent?

.net - 如果线程监听事件并且线程已中止,该事件会发生什么?

c# - 未从路由 C# 接收数据

c# - 在 Web Api 中对 Web Api Controller 进行单元测试

java - JUnit 无法与 Lombok 一起使用 - 注释处理似乎不适用于测试类

java - Junit 在我的测试用例中断言 OR 条件