我最近偶然发现了Google完全无法解释的看似奇怪的行为。
using Microsoft.VisualStudio.TestTools.UnitTesting;
class TestClass
{
public override bool Equals(object obj)
{
return true;
}
}
[TestMethod]
public void TestMethod1()
{
TestClass t = new TestClass ();
Assert.AreEqual (t, null); // fails
Assert.IsTrue (t.Equals (null)); // passes
}
我希望这个测试能够成功。但是,在Visual Studio 2008 / .NET 3.5中,它失败了。它是打算像那样还是一个错误?
答案 0 :(得分:15)
您的TestClass违反了Object.Equals
的合同。 Assert.AreEqual
非常合理地依赖合同。
文档状态(在要求列表中):
答案 1 :(得分:5)
测试空值时,请勿使用Assert.AreEqual
。
你必须使用Assert.IsNull()
。
答案 2 :(得分:1)
第一次测试失败。测试“t”是否为null,这不是,因为你用一个新的TestClass对象初始化了t。
第二次测试,传递,因为t.Equals总是返回true。
如果一个测试失败,则整个TestMethod1被标记为失败。
答案 3 :(得分:1)
不,这是正确的 - 你已经初始化了一个新的TestClass对象,它不是null,因此断言失败。
答案 4 :(得分:0)
如果我说得对,那么AreEqual(anythingButNull, null)
实际上是否会返回false?
(编辑)我想知道的原因是因为在对类进行单元测试时,不会调用Equals合同所要求的null测试。因为AreEqual依赖于合同,所以它无法检查我的班级是否也符合合同。所以我想我必须使用Assert.IsFalse(blah.Equals(null))
的解决方法。