0

我一直在使用 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 HResult=-2146233088 消息= 预期和实际都具有 2 个元素 索引 [0] 处的值不同预期:但是是:

Source=nunit.framework StackTrace:在 DiceLibTest.DieSetTest 的 NUnit.Framework.Assert.AreEqual(预期对象,实际对象)的 NUnit.Framework.Assert.That(实际对象,IResolveConstraint 表达式,字符串消息,对象 [] args)。 c:\dev_code\DiceLib\DiceLibTest\DieSetTest.cs:line 47 InnerException 中的 Equals():

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

我的课是这样的:

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

我读过一些相关的问题,例如: NUnit does not work well with Assert.AreEqual

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

public override bool Equals(object obj)
{
}

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

4

2 回答 2

5

是的 - 它已记录在案

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

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

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

就我个人而言,我不会从List<T>一开始就派生出一个集合语义类型——如果你实现ISet<T>了(并使用了组合),那么它很可能会起作用。

于 2013-07-25T15:55:32.043 回答
3

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

于 2013-07-25T16:02:48.680 回答