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

前端 未结 6 2008
日久生厌
日久生厌 2021-02-03 16:56

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

    /// 
    ///A test for Bytes
    ///
    [TestMethod()]
            


        
相关标签:
6条回答
  • 2021-02-03 17:02

    The method Assert.AreEqual under the hood will end up defaulting to Object.Equals() for non-null values. The default implementation of Object.Equals() is referential equality. The 2 arrays are identical value wise but difference reference wise and hence will not be considered equal.

    0 讨论(0)
  • 2021-02-03 17:04

    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.

    0 讨论(0)
  • 2021-02-03 17:05
    //Initialize your arrays here
    byte[] array1 = new byte[0];
    byte[] array2 = new byte[0];
    
    Assert.AreEqual(System.Convert.ToBase64String(array1),
                    System.Convert.ToBase64String(array2));
    
    0 讨论(0)
  • 2021-02-03 17:12

    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.

    0 讨论(0)
  • 2021-02-03 17:16

    Created simple helper method:

    private static void CompareArrays<T>(T[] expected, T[] actual)
    {
        Assert.AreEqual(expected == null, actual == null, "Expected {0}null value and {1}null found.", expected == null ? "" : "not", actual == null ? "" : "not");
        if (expected == null || actual == null)
                return;
    
        Assert.AreEqual(expected.LongLength, actual.LongLength, "Expected Length is {0} actual: {1}", expected.LongLength, actual.LongLength);
    
        for (int i = 0; i < expected.Length; i++)
        {
            Assert.AreEqual(expected[i], actual[i], "Values on index {0} are not equal. Expected {1} actual: {2}", i, expected[i], actual[i]);
        }
    }
    
    0 讨论(0)
  • 2021-02-03 17:17
    byte[] a = new byte[] {x, y, z...};
    byte[] b = new byte[] {x, y, z...};
    assertArrayEquals(a , b );
    

    will compare the stuff... It works for me..

    0 讨论(0)
提交回复
热议问题