私はいくつかの単体テストを書いていますが、次のアサーションは失敗します:
Assert.AreEqual(expected.Episode, actual.Episode);
代わりにこれを呼び出すと、成功します。
Assert.IsTrue(expected.Episode.Equals(actual.Episode));
この場合、指定されたタイプAssert.AreEqual()
のメソッドを最終的に呼び出すと想定していました。Equals()
Episode.Equals()
ただし、Microsoft.VisualStudio.TestTools.UnitTesting.Assertの内部で、次のコード(ReSharperによって逆コンパイルされたもの)が見つかりました。
public static void AreEqual<T>(T expected, T actual, string message, params object[] parameters)
{
if (object.Equals((object)expected, (object)actual))
return;
Assert.HandleFail...
}
これは、メソッドが両方をAreEqual()
キャストしていることと、クラスで記述したオーバーロードではなく、基本メソッドの使用を強制することを意味します。基本メソッドは、参照が同じであるかどうかを確認するだけですが、そうではありません。expected
actual
object
Equals()
Episode
2つの質問があります:
- 私の説明は実際に正しいですか、それとも何かを逃したことがありますか?
- フレームワークがそのメソッドのオーバーロードではなくobject.Equals()の使用を強制したいのはなぜですか?
関連する場合は、ここに私の方法があります:
public bool Equals(Episode other)
{
return Number == other.Number &&
CaseNote.Equals(other.CaseNote) &&
Patient.Equals(other.Patient);
}