139

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

4

2 に答える 2

217

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");
 }

もちろん、例外メッセージ自体は紛らわしいですが、少なくとも、何か間違ったことをしたことを知らせてくれます。

于 2012-07-20T17:52:28.297 に答える
20

tldr;

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

いいえ:

Assert.Equals(a, b); // <-- Irrelevant equality operator on Assert itself
于 2017-09-21T05:42:19.600 に答える