C# · 12月 30, 2021

c# – 深层克隆的单元测试

假设我有一个复杂的.NET类,有很多数组和其他类对象成员.我需要能够生成一个这个对象的深层克隆,所以我写了一个Clone()方法,并用一个简单的BinaryFormatter序列化/反序列化来实现 – 或者也可以使用其他更容易出错的其他技术我想确保测试.

好的,所以现在(好的,我应该先做完了)我想编写测试,涵盖克隆.该类的所有成员都是私有的,而我的架构非常好(!),我不需要编写数百个公共属性或其他访问器.该类不是IComparable或IEquatable,因为这不是应用程序需要的.我的单元测试与生产代码分开组装.

人们采取什么方法来测试克隆的对象是一个好的副本?您是否编写(或一旦发现克隆需要重写)所有的类的单元测试,以便可以使用“处女”对象或克隆它进行调用?如果克隆的部分内容不够深入,您将如何进行测试 – 因为这只是以后可能会出现可疑的错误的问题?

解决方法 您的测试方法将取决于您提供的解决方案的类型.如果您编写了一些自定义克隆代码,并且必须在每个可克隆类型中手动实现,那么您应该真正测试克隆这些类型的每一个.或者,如果您决定使用更通用的路线(上述反射可能适合),则您的测试只需要测试克隆系统必须处理的具体情况.

回答你的具体问题:

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?

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