0

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<> および/または配列および/またはコレクション全般に​​対していくつかの特別な動作をしており、私のクラスはこれらのカテゴリのいずれかに分類されます。私の他の推測は、私が何か間違ったことをしていて、明らかなことを見ていないということです..

4

2 に答える 2

3

CollectionAssert.AreEqualまたはCollectionAssert.AreEquivalent、2 つのコレクションに同じ要素が同じ順序または任意の順序で含まれているかどうかをテストする、もう少し透過的な方法です。コレクションを比較していることがわかっている場合は、それらを試して使用する傾向があります。

于 2013-07-25T16:02:48.680 に答える