我一直在遇到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 <>和/或数组和/或集合中一般有一些特殊的行为,而且我的类属于这些类别之一.我的另一个猜测是,我做错了什么,我没有看到明显的......