私はいくつかのユニットテストを書いていると、次のアサーションが失敗:なぜAssert.AreEqual()は比較する前にオブジェクトにキャストしますか?
Assert.AreEqual(expected.Episode, actual.Episode);
私が代わりにこれを呼び出した場合、それは成功します。
Assert.IsTrue(expected.Episode.Equals(actual.Episode));
私はAssert.AreEqual()
が最終的にのためにEquals()
メソッドを呼び出すことを想定していましたこの場合はEpisode.Equals()
と入力します。これはAreEqual()
方法は、両方のキャストされていることを私に暗示
public static void AreEqual<T>(T expected, T actual, string message, params object[] parameters)
{
if (object.Equals((object)expected, (object)actual))
return;
Assert.HandleFail...
}
:
はしかし、Microsoft.VisualStudio.TestTools.UnitTesting.Assertでカバーの下に私は(ReSharperので逆コンパイル)、次のコードを見つけましたexpected
とactual
~object
は、Episode
クラスで記述したオーバーロードではなく、ベースの使用を強制的に行うために使用されます(Equals()
)。基本メソッドは、参照が同じであるかどうかを確認するだけです。
私は2つの質問があります。
- は私の説明が実際に正しいですか、私が何かを見逃していますか?
- なぜフレームワークはそのメソッドのオーバーロードではなくobject.Equals()の使用を強制しますか?
それは、関連するなら、ここに私の方法は次のとおりです。
public bool Equals(Episode other)
{
return Number == other.Number &&
CaseNote.Equals(other.CaseNote) &&
Patient.Equals(other.Patient);
}
Offtopic:どのバージョンのReSharperを逆コンパイルできますか? – sll
私は、そこにどれくらいの時間があったのか分かりませんが、私の経験では少なくともv5です。内部オブジェクトに対して初めてF12(宣言に行く)では、あなたがしたいことを尋ねます。オプションの1つは逆コンパイルです。 Jetbrainsからの無料のスタンドアロンデコンパイラもあります。 –
btw、表示されるメソッドは*オーバーロード*であり、オーバーライドではありません。 –