Boris Callens
Boris Callens

Reputation: 93407

Assert.Equals of Two objects implementing IEquatable(T) doesn't use the equals method

I have a custom type Type that implement IEquatable(Type). Then I new up two instances of the type, none of them are Null

Assert.IsTrue(obj1.equals(obj2)) //Success
Assert.AreEqual(obj1, obj2) //False
Assert.AreEqual(Type)(obj1, obj2) //False

The first one hits my equals, the second one hits the ToString() Any suggestions?

update
some code to illustrate: http://pastebin.com/1uecrfeW

more update
If I have to override the base equals, even if a better (generic) equals is available, then what's the use of implementing IEquals(T)?

Upvotes: 9

Views: 1019

Answers (2)

Marc Gravell
Marc Gravell

Reputation: 1064204

IIRC Assert.AreEqual is non-generic, so only object.Equals applies; try checking the override of non-generic object.Equals.

In addition to the inconvenience of calling a generic method via reflection, the objects could also implement multiple IEquatable<T> (for different T). So the non-generic version makes sense here, IMO.

Upvotes: 2

Jon Skeet
Jon Skeet

Reputation: 1503839

My guess is that it's actually hitting Equals(object) instead of Equals(T). If you haven't overridden Equals(object) then it's probably failing the assertion, which then uses ToString to create a useful failure message.

If you could show a short but complete program which demonstrates the problem (including which Assert method you're calling - NUnit? Something else?) that would help.

Upvotes: 6

Related Questions