我正在写一些单元测试及以下断言失败:为什么在比较之前将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'。 –