2012-07-20 10 views
110

最近、新しいNUnitテストを書くときにAssert.Equals()メソッドを使用しようとしました。このメソッドを実行すると、 Assert.Equals should not be used for Assertions.というように、AssertionExceptionがスローされます。何が起きてる?NUnitのAssert.Equals例外がスローされる "Assert.Equalsをアサーションに使用すべきではありません"

+0

あなたは私たちにこれがあったことなど、特定のコードなど、いくつかのコンテキストを与えることはできますがでているのですか?どのような種類のオブジェクトを比較していましたか? –

+9

申し訳ありませんが、私はすでにこの回答を見つけました。私は後輩のために答えを投稿できるように頼んだだけです。文脈は本当に重要ではありません。答えを読むことで分かります。私はこの答えが例外メッセージのWeb検索で簡単に発見できることを期待しています。 – Odrade

+2

+1正直! – stannius

答えて

164

Assertは、System.Objectを継承する静的クラスです。すべてのクラスが暗黙的にc#で実行されるためです。

static bool Equals(object a, object b) 

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

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

例外メッセージ自体が紛らわしいですが、少なくともそれはあなたが間違っ何かをやったかを知ることができます。

+1

頭痛の時間が節約されました。 – fregas

+12

メッセージが混乱していますが、Googleに入力してください。ここでこの回答が終わり、すべて正常です。ありがとうオードレード。 –

+18

NUnitの開発者は、 "... assert.AreEqual()"を使用するようにメッセージを変更する可能性があります。 – WillC

3

tldr;

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

ない:

Assert.Equals(a, b); // <-- Irrelevant equality operator on Assert itself 
関連する問題