【发布时间】:2016-03-03 11:48:12
【问题描述】:
我经常使用代表工厂生产的实体的类。
为了轻松测试我的工厂,我通常实现IEquatable<T>,同时覆盖GetHashCode 和Equals(如MSDN 所建议的那样)。
例如;以以下简化的实体类为例。通常我的课程有更多的属性。偶尔也有一个集合,在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 肯定是不合适的,因为对于一个产品来说不只有一个相等的概念。但是您可以使用 Resharper 也可以为您生成的
IEqualityComparer。是否测试这样一个生成的比较器是一个选择。 -
GetHashCode 基于可变字段是个坏主意blogs.msdn.com/b/ericlippert/archive/2011/02/28/…
标签: c# unit-testing factory-pattern iequatable