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



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

假设我在生产中有一个类:MyClass,它目前对覆盖上述方法没有特殊要求。

然而,在我的测试中,我想使用overridden Equals对它们进行比较。我应该:

  1. 直接在MyClass 中实现这些方法

  2. 从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的新实例

创建一个扩展方法并在测试项目中使用它。。。

最新更新