Argument equality is currently checked using EqualityComparer<object>. (The code for it is here:
http://bit.ly/fQ7ncu)
Can't for the life of me remember why we've done it this way (rather than use Object.Equals; I think it's a remnant of when this arg spec class was generic), but it basically means you get reference equality. :)
If this is causing you problems let me know; it is probably reasonable to use Equals() as defined on the specific argument type, although for reference types it could also be misleading if the right reference came through but the state was altered after the fact (say, by the call under test itself). Based on the method being tested in this example, I guess I'd expect "fakeMessageStore.Received().Add(built_message);" to pass regardless of built_message state changes (YMMV :)).
I realise this example is just a snapshot so there's lots of context I'm missing, but in general I'd recommend creating a new message for a new MessageId rather than mutating state, which neatly side-steps the whole issue. :)
Hope this helps a little. Please let me know if I'm missing anything obvious.
Regards,
David