繁体   English   中英

重写仅在C#中测试所需的Equals和GetHashcode方法的最佳位置

[英]Best place to override Equals and GetHashcode methods only required for testing in C#

我需要重写Equals()GetHashCode()以便可以在单元测试中比较同一类的两个对象。

假设我有一个类:生产中的MyClass ,目前对于重写上述方法没有特殊要求。

但是,在测试中,我想使用overridden Equals比较它们。 我是不是该:

  1. 直接在MyClass中实现方法

  2. 从保存覆盖的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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM