C#单元测试-断言。AreEqual()并不要求平等如果说法是空的
-
19-08-2019 - |
题
最近,我偶然发现了一个看似古怪的行为,谷歌完全未能解释。
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))
的解决方法。
不隶属于 StackOverflow