2013-01-17 60 views
4

在我當前的項目中,我有幾個IEqualitycomparers。
這些對象具有多個屬性並進行比較。
屬性可以是相等的,也可以是不同的,這既適用於值,也適用於空值。考慮開發人員時間的單元測試GetHashCode

我想單元測試這些,但所有不同的可能性都是瘋狂的。 如何有效測試這些?

更新
目前他們得到他們通過屬性和值不會作爲構造他們充滿entlib的數據塊。

例如(在vb.net,但我跟C#太):

Public Class GuarantyEqualityComparer 
    Implements IEqualityComparer(Of Guaranty) 

    Public Overloads Function Equals(x As Guaranty, y As Guaranty) As Boolean Implements IEqualityComparer(Of Guaranty).Equals 
     Return x.ClientCode = y.ClientCode AndAlso x.LocationCode = y.LocationCode AndAlso x.CategoryCode = y.CategoryCode AndAlso x.GuarantyCode = y.GuarantyCode 
    End Function 

    Public Overloads Function GetHashCode(obj As Guaranty) As Integer Implements IEqualityComparer(Of Guaranty).GetHashCode 
     Const format As String = "{0}{1}{2}{3}" 
     Return String.Format(CultureInfo.InvariantCulture, format, obj.ClientCode, obj.LocationCode, obj.CategoryCode, obj.GuarantyCode).GetHashCode() 
    End Function 
End Class 
+1

順便說一句,這真的不是生成哈希碼的好方法。 +1對於一個有用的問題:) –

+0

你能告訴我們更多關於你正在比較的類型是如何構建的嗎?例如,是否總會有一個構造函數與所有相關的部分? –

+0

當前沒有要求這些值的構造函數。它們可以爲null。關於你的話:真的,我記得現在有一個關於好hashcode的答案或文章。說實話,所有的平等和散列碼系統一直困擾着我。 –

回答

3

好吧,鑑於其構造的可能性,我會嘗試寫一個實用工具類,它允許您指定樣本值對於每一個構造函數的參數:

var comparer = new GuarantyEqualityComparer(); 
var tester = EqualityTester<Guaranty>.CreateBuilder(comparer) 
       .AddValue("ClientCode", "Sample1", "Sample2", null) 
       .AddValue("LocationCode", 1, 3, 0) 
       .Builder(); 
tester.Test(); 

測試人員會去通過每一個可能的排列,並在至少檢查:

  • x.Equals(y)xy用相同的價值觀
  • x.GetHashCode() == y.GetHashCode()xy
  • !x.Equals(y)xy都建有不同的值相同內置內置

可能還檢查x.GetHashCode() != y.GetHashCode()xy是用di不同的價值。這是而不是合同所要求的GetHashCode,甚至一個好的哈希碼總是會有失敗的情況(對於超過2個可能值的任何類型),但它仍然是一個合理的完整性檢查 - 當代碼正確時,通常不得不選擇失敗的樣本值。


在哈希代碼生成方面,我總是用線沿線的東西:

int hash = 19; 
hash = hash * 31 + HashOfField1; 
hash = hash * 31 + HashOfField2; 
... 
return hash; 

對於野田的時間,我們已經有了一些這方面的helper class它允許這樣的方法:

public override int GetHashCode() 
{ 
    int hash = HashCodeHelper.Initialize(); 
    hash = HashCodeHelper.Hash(hash, LocalInstant); 
    hash = HashCodeHelper.Hash(hash, Offset); 
    hash = HashCodeHelper.Hash(hash, Zone); 
    return hash; 
} 

幫助程序爲您處理無效。所有這一切都是很多比每次需要計算哈希碼時通過格式化創建一個字符串更好。

相關問題