【问题标题】:Assert.AreEqual fails on a class derived from List<> that overrides Equals()Assert.AreEqual 在从 List<> 派生的类上失败,该类覆盖 Equals()
【发布时间】:2013-07-25 15:16:21
【问题描述】:

我在使用 NUnit 时遇到了麻烦。我有一个从 List 继承并覆盖 Equals() 的类(因此,当两个实例以不同的顺序包含相同的元素时,它们可以被视为相等)。使用 Assert.AreEqual 时会失败,但使用 Assert.True 并手动调用 Equals 可以:

[Test]
public void Equals()
{
    var dieSet1 = new DieSet {new Die(1), new Die(2)};
    var dieSet2 = new DieSet {new Die(2), new Die(1)};

    Assert.True(dieSet1.Equals(dieSet2)); //ok
    Assert.AreEqual(dieSet1, dieSet2);    //fails with an exception
}

这里是异常详情:

NUnit.Framework.AssertionException 未被用户代码处理 H结果=-2146233088 Message= 预期和实际都包含 2 个元素 索引 [0] 处的值不同 预期的: 但是是:

来源=nunit.framework 堆栈跟踪: 在 NUnit.Framework.Assert.That(实际对象,IResolveConstraint 表达式,字符串消息,对象 [] args) 在 NUnit.Framework.Assert.AreEqual(预期对象,实际对象) 在 C:\dev_code\DiceLib\DiceLibTest\DieSetTest.cs:line 47 中的 DiceLibTest.DieSetTest.Equals() 内部异常:

我在 Equals() 中设置了一个断点,并确保在调用 Assert.AreEqual 时它没有被调用。

我的课是这样的:

public class DieSet : List<Die>, IRollable
{
}

我已经阅读了一些相关的问题,例如: NUnit doesn't work well with Assert.AreEqual

但我仔细检查了,我的 Equals() 方法具有正确的签名。

public override bool Equals(object obj)
{
}

我的猜测是,NUnit 在内部通常对 List 和/或数组和/或集合有一些特殊行为,并且我的类属于这些类别之一。我的另一个猜测是我做错了什么,我没有看到明显的..

【问题讨论】:

    标签: c# .net nunit


    【解决方案1】:

    是的 - 这是documented

    从 2.4 版开始,可以比较多维数组、嵌套数组(数组的数组)和集合。如果两个数组或集合具有相同的维度并且每个对应的元素都相等,则 Assert.AreEqual 会将它们视为相等。

    所以基本上你可能想要Assert.True 版本。

    对于大多数用户来说,这种行为可能是可取的——它恰好与您的特定用途发生冲突。

    虽然我个人不会从 List&lt;T&gt; 派生一个集合语义类型开始 - 如果您实施 ISet&lt;T&gt; 代替(并使用组合),那么它可能会正常工作。

    【讨论】:

    • 哎呀,它在手册中,我一定错过了...感谢有关实现 ISet 和使用组合的建议。
    【解决方案2】:

    CollectionAssert.AreEqualCollectionAssert.AreEquivalent 是测试两个集合是否分别以相同顺序或任何顺序包含相同元素的稍微透明的方法。如果我知道我在比较集合,我倾向于尝试使用它们。

    【讨论】:

    • 感谢提示,不知道这些方法!我选择 Jon Skeet 的答案作为最佳答案,因为我认为它最好地回答了我的问题,但是您的建议实际上非常有帮助,现在我得到了 Equals() 方法的免费简单实现。我还在犹豫是否真的应该覆盖平等,现在我真的在想也许我应该在需要时使用 CollectionAssert.AreEquivalent
    猜你喜欢
    • 2012-03-13
    • 1970-01-01
    • 2018-07-31
    • 1970-01-01
    • 2017-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-12
    相关资源
    最近更新 更多