最近,我偶然发现了一个看似古怪的行为,谷歌完全未能解释。


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 Studio2008/.净3.5它失败。是它的意图像,或者它是一个错误?

有帮助吗?

解决方案

你TestClass违反了合同的 Object.Equals. Assert.AreEqual 是依靠这一合同,相当合理。

该文件状态(在该列表的要求):

  • x.等于(a null参考(没有Visual Basic))returns false.

其他提示

当空值测试,不使用Assert.AreEqual

您必须使用Assert.IsNull()为。

在第一个测试失败。测试如果“t”为空,这不是,因为则用一个新的TestClass对象初始化吨。

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

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

没有,它是正确的 - 你已经初始化吨至一个新的TestClass对象,这是不为空,所以断言失败

如果我得到你的权利,它实际上是打算AreEqual(anythingButNull, null)总是返回false?

(编辑)我不知道的原因是因为为空的试验所要求的的Equals的合同,是不是单元测试类时调用。所以,因为AreEqual依赖合同,它不能检查,如果我的课也符合合同规定。所以我想我不得不使用Assert.IsFalse(blah.Equals(null))的解决方法。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top