Assert.AreEqual在从List <>派生的类上失败,它覆盖了Equals()

mis*_*frb 0 .net c# nunit

我一直在遇到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
}
Run Code Online (Sandbox Code Playgroud)

这是一个例外细节:

NUnit.Framework.AssertionException未被用户代码处理HResult = -2146233088消息=预期和实际都有2个元素值在index [0]处不同预期:但是:

Source = nunit.framework StackTrace:在NUnit.Framework.Assert.That(Object actual,IResolveConstraint expression,String message,Object [] args)在DiceLibTest.DieSetTest的NUnit.Framework.Assert.AreEqual(Object expected,Object actual). c:\ dev_code\DiceLib\DiceLibTest\DieSetTest.cs中的Equals():第47行InnerException:

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

我的班级是这样的:

public class DieSet : List<Die>, IRollable
{
}
Run Code Online (Sandbox Code Playgroud)

我已经阅读了一些相关的问题,例如: NUnit与Assert.AreEqual不兼容

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

public override bool Equals(object obj)
{
}
Run Code Online (Sandbox Code Playgroud)

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

Jon*_*eet 5

是的 - 它记录在案:

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

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

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

就个人而言,我不会从一List<T>开始就使用set-semantics类型- 如果你实现了ISet<T>(并使用了组合),那么它可能正常工作.