我正在编写一些单元测试,以下断言失败:
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);
}
覆盖
。 - Marc Gravell