program tip

Assert.AreEqual (T obj1, Tobj2)이 동일한 바이트 배열로 실패하는 이유

radiobox 2020. 9. 21. 07:32
반응형

Assert.AreEqual (T obj1, Tobj2)이 동일한 바이트 배열로 실패하는 이유


다음 코드 세그먼트에 두 개의 동일한 바이트 배열이 있습니다.

    /// <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);
    }

두 배열 모두 바로 바이트까지 동일합니다. 이 시나리오에서 Assert.AreEqual이 실패하는 이유는 무엇입니까?


Assert.EqualsEquals메서드를 사용하여 테스트 합니다. 기본적으로 참조 같음을 사용하며 서로 다른 개체이므로 같지 않습니다. 배열의 각 바이트를 비교하고 동일한 지 확인해야합니다. 이를 수행하는 한 가지 방법은 ICollection을 구현하는 것으로 변환하고 대신 CollectionAssert.AreEqual ()을 사용하는 것입니다.


배열은 Equals.

어떤 테스트 프레임 워크를 사용하고 있는지는 말하지 않았지만, 기본적으로 특별한 경우 배열에 대한 프레임 워크에 달려 있습니다. 물론이를 수행하기 위해 항상 고유 한 도우미 메서드를 구현할 수 있습니다. 나는 때때로 그것을했다. 빠르고 더러운 해킹을 위해 .NET 3.5를 사용하는 경우 Enumerable.SequenceEqual확장 방법을 사용할 수 있습니다 .

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

물론 사용자 지정 도우미 메서드는 차이점에 대한 자세한 내용을 제공 할 수 있습니다. 방법 MoreLINQ.TestExtensions이 상당히 거칠고 준비되어 있지만 도움 이 될 수 있습니다.


//Initialize your arrays here
byte[] array1 = new byte[0];
byte[] array2 = new byte[0];

Assert.AreEqual(System.Convert.ToBase64String(array1),
                System.Convert.ToBase64String(array2));

내부적으로 Assert.AreEqual 메서드는 null이 아닌 값에 대해 Object.Equals ()로 기본 설정됩니다. Object.Equals ()의 기본 구현은 참조 동등성입니다. 두 배열은 값이 동일하지만 참조가 다르므로 동일한 것으로 간주되지 않습니다.


byte[] a = new byte[] {x, y, z...};
byte[] b = new byte[] {x, y, z...};
assertArrayEquals(a , b );

물건을 비교해 볼게요 ... 저 한테는 효과가 있어요 ..


간단한 도우미 메서드 생성 :

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]);
    }
}

참고 URL : https://stackoverflow.com/questions/1375166/why-does-assert-areequalt-obj1-tobj2-fail-with-identical-byte-arrays

반응형