我正在寫一些單元測試及以下斷言失敗:爲什麼在比較之前將Assert.AreEqual()強制轉換爲對象?
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
類中的超負荷。基本方法將簡單地檢查引用是否相同,哪些不是。
我有兩個問題:
- 是我的解釋實際上是正確的,或者有我錯過了什麼?
- 爲什麼框架要強制使用object.Equals()而不是該方法的重載?
如果是相關的,這裏是我的方法:
public bool Equals(Episode other)
{
return Number == other.Number &&
CaseNote.Equals(other.CaseNote) &&
Patient.Equals(other.Patient);
}
Offtopic:其中ReSharper的版本可以反編譯? – sll
我不知道它已經有多久,但至少V5在我的經驗......你第一次F12(去申報)內部的物體上,它會問你想要做什麼;其中一個選項是反編譯。 Jetbrains還提供免費的獨立反編譯器。順便說一句 –
,示出的方法是一個過載* *,而不是一個'override'。 –