NUnit的Assert.Equals引发异常“ Assert.Equals不应用于断言”


132

我最近尝试在编写新的NUnit测试时使用方法Assert.Equals()。一旦执行该方法抛出AssertionException,指出 Assert.Equals should not be used for Assertions. 这是乍一看有点莫名其妙。这里发生了什么?


您能给我们一些上下文,例如它所在的特定代码吗?您正在比较什么类型的对象,等等?
Mike Parkhill 2012年

9
抱歉,但是我已经找到了答案。我只是问这个问题,所以我可以张贴后代答案。正如您将通过阅读答案看到的那样,上下文并不是很重要。我希望可以通过对异常消息的网络搜索轻松找到此答案。
奥德拉德(Odrade)2012年

Answers:


201

Assert是从System.Object继承的静态类,因为所有类在C#中都隐式地执行。System.Object实现以下方法:

static bool Equals(object a, object b)

旨在进行相等性比较的Assert Assert.AreEqual()方法就是这些方法。因此,Object.Equals()在单元测试中通过Assert类调用该方法肯定是错误的。为了防止此错误并避免混淆,NUnit的开发人员有意隐藏Object.Equals在Assert类中,并带有引发异常的实现。这是实现:

/// <summary>
 /// The Equals method throws an AssertionException. This is done
 /// to make sure there is no mistake by calling this function.
 /// </summary>
 /// <param name="a"></param>
 /// <param name="b"></param>
 [EditorBrowsable(EditorBrowsableState.Never)]
 public static new bool Equals(object a, object b)
 {
     // TODO: This should probably be InvalidOperationException
     throw new AssertionException("Assert.Equals should not be used for Assertions");
 }

当然,异常消息本身令人困惑,但是至少它使您知道自己做错了什么


13
该消息令人困惑,但是将其输入Google,您就可以在此得到答案,一切都很好。感谢Odrade。
Stephen Holt

25
NUnit的开发人员可以将消息更改为“ ...使用Assert.AreEqual()”。
WillC 2015年

为什么他们只是没有将Equals方法设为私有?
shytikov 2015年

4
@shytikov因为那是不可能的。您不能使用私有方法重写基类中的虚拟方法。
奥德拉德(Odrade)2015年

18

tldr;

Assert.AreEqual(a, b); // <-- Compares a, b

不:

Assert.Equals(a, b); // <-- Irrelevant equality operator on Assert itself
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.