5

我最近偶然发现了谷歌完全无法解释的看似奇怪的行为。


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 中它失败了。它是打算这样还是一个错误?

4

5 回答 5

15

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

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

  • x.Equals(一个空引用(在 Visual Basic 中为无))返回 false。
于 2009-01-20T07:47:57.600 回答
5

测试空值时,不要使用Assert.AreEqual.

你必须使用Assert.IsNull()它。

于 2009-01-20T07:39:35.620 回答
1

第一次测试失败。测试“t”是否为空,但不是,因为您使用新的 TestClass 对象初始化了 t。

第二个测试通过了,因为 t.Equals 总是返回 true。

如果一个测试失败,则整个 TestMethod1 被标记为失败。

于 2009-01-20T07:40:30.687 回答
1

不,这是正确的 - 您已将 t 初始化为一个新的 TestClass 对象,该对象不为空,因此断言失败。

于 2009-01-20T07:48:01.263 回答
0

如果我说得对,实际上是打算AreEqual(anythingButNull, null)总是返回false?

(编辑)我想知道的原因是因为在对类进行单元测试时没有调用 Equals 合同所要求的 null 测试。因此,因为 AreEqual 依赖于合同,所以它无法检查我的班级是否也遵守合同。所以我想我必须使用Assert.IsFalse(blah.Equals(null)).

于 2009-01-20T07:48:49.033 回答