改变对象以验证测试中的深度克隆

时间:2018-02-21 17:50:55

标签: c# unit-testing clone

我有一个名为IDeepClonable的界面,它公开了方法DoDeepClone

但是出于性能原因,每个深度克隆都是手工实现的。

我想编写一个测试,它能够检查在我的程序集中实现接口的任何对象,它确实可以正确深度克隆。

验证很简单,我有一个名为DeepEqual的库来检查这个。

问题是要确保所有字段都没有默认值!

ef:null表示字符串,0表示int,等等。

此外,用户可能会执行以下操作:

public int MyNumber = 5;

好吧,我可以忘记深度克隆它,但测试仍然是b =通过,因为原始和克隆都有5作为值。

什么方法可以改变任意对象(主要是值类型)以确保每个字段都不同?

我也有像TimeSpans这样的东西。

天真的解决方案是简单地为类型构建一个人为维护的默认值列表,但我想知道是否有办法自动化它。

1 个答案:

答案 0 :(得分:1)

基于反射和随机值实现目标的一些高级想法:

  1. 为给定类型创建1个对象
  2. 循环使用Reflection Api的对象的所有成员(属性和字段)。递归处理引用类型的子成员
  3. 对于对象图中的每个值类型成员,使用随机函数设置它的值(为每种可能的值类型单独生成随机值)。
  4. 执行DoDeepClone以创建克隆对象
  5. 对原始和克隆对象执行DeepEqual并声明其相等性
  6. 至关重要的是,阶段3中的随机函数会产生纯随机值。在bool-type的情况下,生成的值可能与默认值相同(因为有2个可能的值)。但是您可以多次执行此算法以确保至少使用一次唯一值。