1. ホーム
  2. .net

[解決済み] NUnitのAssert.Equalsで例外が発生する "Assert.Equalsはアサーションに使うべきではない" と言われた

2022-06-04 08:59:09

質問

最近、新しい NUnit テストを書くときに Assert.Equals() メソッドを使おうとしました。 このメソッドを実行すると AssertionException というステートメントが表示されます。 Assert.Equals should not be used for Assertions. これは一見するとちょっと不可解です。 どうなっているのでしょうか?

どのように解決するのか?

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

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