I recently attempted to use the method Assert.Equals() when writing a new NUnit test. Upon execution this method throws an AssertionException
stating that
Assert.Equals should not be used for Assertions.
This is a bit baffling at first glance. What's going on here?
Assert
is a static class inheriting from System.Object, as all classes do implicitly in C#. System.Object implements the following method:
static bool Equals(object a, object b)
The methods on Assert which are intended for equality comparison are the Assert.AreEqual()
methods. Therefore, calling the Object.Equals()
method through the Assert class in a unit test is certainly a mistake. In order to prevent this mistake and avoid confusion, the developers of NUnit have intentionally hidden Object.Equals
in the Assert class with an implementation that throws an exception. Here's the implementation:
/// <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");
}
Of course the exception message itself is confusing, but at least it lets you know you've done something wrong.