C#UnitTest - 如果参数为null,Assert.AreEqual()不会调用Equals

时间:2009-01-20 07:36:28

标签: c# visual-studio unit-testing equals

我最近偶然发现了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中,它失败了。它是打算像那样还是一个错误?

5 个答案:

答案 0 :(得分:15)

您的TestClass违反了Object.Equals的合同。 Assert.AreEqual非常合理地依赖合同。

文档状态(在要求列表中):

  • x.Equals(null引用(在Visual Basic中为Nothing))返回false。

答案 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))的解决方法。