NUnit で問題が発生しています。List から継承し、Equals() をオーバーライドするクラスがあります (したがって、2 つのインスタンスは、同じ要素が異なる順序で含まれている場合に等しいと見なすことができます)。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 はユーザー コードによって処理されませんでした。
Source=nunit.framework StackTrace: NUnit.Framework.Assert.That(Object actual, IResolveConstraint expression, String message, Object[] args) at NUnit.Framework.Assert.AreEqual(Object expected, Object actual) at DiceLibTest.DieSetTest. c:\dev_code\DiceLib\DiceLibTest\DieSetTest.cs:47 行目の Equals() InnerException:
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<> および/または配列および/またはコレクション全般に対していくつかの特別な動作をしており、私のクラスはこれらのカテゴリのいずれかに分類されます。私の他の推測は、私が何か間違ったことをしていて、明らかなことを見ていないということです..