我需要重写Equals()
和GetHashCode()
,以便在单元测试中比较同一类的两个对象。
假设我在生产中有一个类:MyClass
,它目前对覆盖上述方法没有特殊要求。
然而,在我的测试中,我想使用overridden Equals
对它们进行比较。我应该:
-
直接在MyClass 中实现这些方法
-
从MyClass创建一个包含重写的派生类,然后在我的测试中适当地转换MyClass的实例:
//获取所需MyClass的实例
//获取实际MyClass的实例
Assert.AreEqual(应为(TestMyClass),实际为(TestMySlass));
我倾向于选项2,因为我认为它可以使生产代码更干净。它还允许将来直接在MyClass
上进行特定于业务逻辑的覆盖,如果有意义的话,它可能会以与我在测试中所做的不同的方式进行覆盖。
我想不利的一面是测试和测试项目变得更加复杂。
首选的方法是什么?
我建议在您的测试项目中实现IEqualityComparer<T>
接口。NET还注意到在一些集合类和LINQ中使用此接口进行自定义相等比较。
您有第三个选项,实现一个自定义断言,在这里您可以预成型所需的equals逻辑。
选项1为您的类添加了业务逻辑不需要的代码,但它可能会添加新的错误。想象一下linq操作,它使用了一个equal和hashcode。所以你们班的行为会很恶劣。选项2,是一项艰巨的工作。在单元测试中,您会遇到维护问题。此外,您将测试不同的类作为您的生产代码。您可能在测试中有可以完美工作的代码,而在生产中没有可以工作的代码。
我会选择派生的TestMyClass选项,以使生产代码更简单。然而,我不相信您能够将MyClass对象强制转换为TestMyClass对象,相反,您很可能需要使用将MyClass作为参数的构造函数来创建TestMyClass的新实例
创建一个扩展方法并在测试项目中使用它。。。