2013-05-03 34 views
0

我有一个.NET类,其中我实现了GetHashCode和Equals。单元测试平等涵盖所有属性

虽然我相信我涵盖了所有的属性并对这些函数进行了测试,但未来可能会有人添加属性并忘记将其添加到GetHashCode和Equals函数中。忘记这些函数将导致Equals函数对于由新属性不同的对象返回true。

我正在寻找一些工具或代码,我可以在测试代码中使用,这将循环通过对象的所有现有属性,并测试是否遗忘了某些东西。

单元测试将是这个样子:

for each property in TargetType 
    dim instance1 as new TargetType 
    dim instance2 as new TargetType 
    instance1.property=1 
    instance2.property=2 
    Assert.AreNotEqual(instance1,instance2) 
next 

当然的财产分配应该是聪明地使用正确的数据类型

+0

即使上面的代码为'Equals'工作,GetHashCode会变得相当复杂(因为两个不相等的对象可能具有相同的哈希码) – 2013-05-03 06:28:15

+0

甚至在Equals上捕获错过的属性总比不好抓住它。我可以希望修复也将包括GetHashCode – 2013-05-03 09:38:18

回答

0

如果您担心新的属性添加到您的类,我建议先序列化对象,然后比较结果字符串。

这将确保在应用程序和单元测试中始终考虑所有属性进行比较。

序列化的辅助方法看起来像下面(我称之为this SO线程)

'Meant to be an extension method 
Public Shared Function SerializeObject(Of T)(ByVal input As T) As String 
     Dim xmlSerializer = New XmlSerializer(input.GetType()) 
     Dim textWriter = New StringWriter() 
     xmlSerializer.Serialize(textWriter, input) 
     Return textWriter.ToString() 
End Function 

您可以在您的自定义Equals方法使用上面的方法。 希望这有助于。

+0

这看起来很有趣VB :-) – 2013-05-03 06:26:27

+0

@Damien_The_Unbeliever - 我更喜欢C#,所以首先发布。现在,我已经将它改为VB.NET:o) – Channs 2013-05-03 06:27:10

+0

所以如果equals返回true,但是XML序列化不同,那么我知道equals是缺少的东西。好主意!但正如我写的,我正在寻找一个工具/代码来做到这一点,并将处理所有的属性。底线是仍然需要为两个实例上的同一个属性分配不同的值并进行某种匹配(不管它是XML还是这里或其他地方) – 2013-05-03 09:36:44