我經常使用代表工廠生產實體的類。 爲了能夠輕鬆地輕鬆測試我的工廠,我通常實施IEquatable<T>
,同時覆蓋GetHashCode
和Equals
(如MSDN所示)。我應該使用IEquatable來簡化工廠測試嗎?
例如;以下面的實體類爲例進行簡化。通常我的課有更多的屬性。偶爾也有一個集合,它在Equals
方法中使用SequenceEqual
進行檢查。
public class Product : IEquatable<Product>
{
public string Name
{
get;
private set;
}
public Product(string name)
{
Name = name;
}
public override bool Equals(object obj)
{
if (obj == null)
{
return false;
}
Product product = obj as Product;
if (product == null)
{
return false;
}
else
{
return Equals(product);
}
}
public bool Equals(Product other)
{
return Name == other.Name;
}
public override int GetHashCode()
{
return Name.GetHashCode();
}
}
這意味着然後我可以做簡單的單元測試像這樣(假設構造方法中的其他地方進行測試)。
[TestMethod]
public void TestFactory()
{
Product expected = new Product("James");
Product actual = ProductFactory.BuildJames();
Assert.AreEqual(expected, actual);
}
然而這引起了許多問題。
GetHashCode
實際上沒有使用,但我花了時間來實現它。- 我很少真的想在我的實際應用中使用
Equals
超出測試。 - 我花更多時間編寫更多測試以確保
Equals
實際上正常工作。 - 我現在有另外三種方法來維護,例如,向類中添加一個屬性,更新方法。
但是,這確實給了我一個非常整潔TestMethod
。
這是否適合使用IEquatable
,還是我應該採取另一種方法?
使用IEquatable肯定是不合適的,因爲產品不僅有一個平等的概念。但是你可以使用一個'IEqualityComparer',Resharper也可以爲你生成。是否測試這樣一個生成的比較器是一個選擇。 – usr
基於可變字段的GetHashCode是一個壞主意http://blogs.msdn.com/b/ericlippert/archive/2011/02/28/guidelines-and-rules-for-gethashcode.aspx –