[英]Best place to override Equals and GetHashcode methods only required for testing in C#
我需要重写Equals()
和GetHashCode()
以便可以在单元测试中比较同一类的两个对象。
假设我有一个类:生产中的MyClass
,目前对于重写上述方法没有特殊要求。
但是,在测试中,我想使用overridden Equals
比较它们。 我是不是该:
直接在MyClass中实现方法
从保存覆盖的MyClass创建一个派生类,然后在我的测试中适当地投射MyClass的实例:
//获取预期的MyClass的实例
//获取实际MyClass的实例
Assert.AreEqual((TestMyClass)expected,(TestMyClass)actual);
我倾向于选择2,因为我认为它可以使生产代码更整洁。 它还将允许将来直接在MyClass
上进行特定于业务逻辑的重写,如果MyClass
,这样做可能会与我在测试中所做的方式不同。
我想缺点是测试和测试项目变得更加复杂。
首选方法是什么?
我建议在您的测试项目中实现IEqualityComparer<T>
接口。 .NET还注意到此接口用于某些集合类和LINQ中的自定义相等性比较。
您有一个选择,在自定义断言中执行所需的相等逻辑。
选项1将代码添加到您的类中,这对于您的业务逻辑是不需要的,但是它可能会添加新的错误。 考虑一下使用相等和哈希码的linq操作。 因此,您的班级会有不良行为。 选项2的工作量很大。 而且在单元测试中您将遇到维护问题。 除此之外,您还将测试不同的类作为生产代码。 您可能正在测试的代码完全正常,而在生产环境中却没有代码。
我将使用派生的TestMyClass选项来简化生产代码。 但是我不相信您能够将MyClass对象转换为TestMyClass对象,相反,您极有可能需要使用将MyClass作为参数的构造函数来创建TestMyClass的新实例。
创建一个扩展方法,并在测试项目中使用它。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.