NUnitのAssert.Equalsが例外をスローする「Assert.Equalsをアサーションに使用しないでください」


132

最近、新しいNUnitテストを作成するときにメソッドAssert.Equals()を使用しようとしました。実行するAssertionExceptionと、 このメソッドは、Assert.Equals should not be used for Assertions. これは一見すると少し困惑していることを示します。何が起きてる?


これが含まれていた特定のコードなどのコンテキストを教えていただけますか?比較しているオブジェクトの種類などは?
Mike Parkhill、2012

9
申し訳ありませんが、これに対する答えはすでに見つかりました。私は後世のために答えを投稿できるように尋ねました。答えを読むとわかるように、コンテキストはそれほど重要ではありません。この回答が例外メッセージのウェブ検索で簡単に見つけられることを願っています。
Odrade

回答:


201

AssertすべてのクラスがC#で暗黙的に行うように、System.Objectから継承する静的クラスです。System.Objectは次のメソッドを実装します。

static bool Equals(object a, object b)

等価比較を目的としたAssertのメソッドはAssert.AreEqual()メソッドです。したがって、Object.Equals()ユニットテストでAssertクラスを介してメソッドを呼び出すのは間違いです。この間違いを防ぎ、混乱を避けるために、NUnitの開発者はObject.Equals、例外をスローする実装を使用して、意図的にAssertクラスに隠しています。ここに実装があります:

/// <summary>
 /// The Equals method throws an AssertionException. This is done
 /// to make sure there is no mistake by calling this function.
 /// </summary>
 /// <param name="a"></param>
 /// <param name="b"></param>
 [EditorBrowsable(EditorBrowsableState.Never)]
 public static new bool Equals(object a, object b)
 {
     // TODO: This should probably be InvalidOperationException
     throw new AssertionException("Assert.Equals should not be used for Assertions");
 }

もちろん、例外メッセージ自体は混乱を招きますが、少なくとも、何か間違ったことをしたことがわかります。


13
メッセージは紛らわしいですが、それをGoogleに入力すると、この答えでここに到着し、すべてが順調です。Odradeに感謝します。
Stephen Holt

25
NUnitの開発者はメッセージを変更して、「... use Assert.AreEqual()」と言うことができます。
WillC、2015年

なぜ彼らは代わりにEqualsメソッドをプライベートにしないのですか?
shytikov

4
@shytikovそれは不可能だからです。基本クラスの仮想メソッドをプライベートメソッドでオーバーライドすることはできません。
Odrade

18

tldr;

Assert.AreEqual(a, b); // <-- Compares a, b

ない:

Assert.Equals(a, b); // <-- Irrelevant equality operator on Assert itself
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.