Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Why does Assert.AreEqual(T obj1, Tobj2) fail with identical byte arrays

I have two identical byte arrays in the following segment of code:

    /// <summary>     ///A test for Bytes     ///</summary>     [TestMethod()]     public void BytesTest() {         byte[] bytes = Encoding.UTF8.GetBytes(Properties.Resources.ExpectedPacketData);         TransferEventArgs target = new TransferEventArgs(bytes);          byte[] expected = Encoding.UTF8.GetBytes(Properties.Resources.ExpectedPacketValue);         byte[] actual;         actual = target.Bytes;          Assert.AreEqual(expected, actual);     } 

Both arrays are identical down to the very byte. In this scenario, why would Assert.AreEqual fail?

like image 623
David Anderson Avatar asked Sep 03 '09 18:09

David Anderson


2 Answers

Assert.Equals tests using the Equals method, which by default uses reference equality and, since they are different objects, they are not equal. You'll want to compare each byte in the array and verify that they are equal. One way to do this is convert them to something that implements ICollection and use CollectionAssert.AreEqual() instead.

like image 145
tvanfosson Avatar answered Sep 18 '22 09:09

tvanfosson


Because arrays don't override Equals.

You haven't said which test framework you're using, but basically it would be up to that framework to special-case arrays. You can always implement your own helper method to do that, of course. I've done that sometimes. For a quick and dirty hack, if you're using .NET 3.5 you can use the Enumerable.SequenceEqual extension method:

Assert.IsTrue(actual.SequenceEqual(expected)); 

A custom helper method could give you more details about how they differ, of course. You might find the methods in MoreLINQ.TestExtensions helpful, although they're fairly rough and ready too.

like image 29
Jon Skeet Avatar answered Sep 18 '22 09:09

Jon Skeet