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.Equals
Equals
메서드를 사용하여 테스트 합니다. 기본적으로 참조 같음을 사용하며 서로 다른 개체이므로 같지 않습니다. 배열의 각 바이트를 비교하고 동일한 지 확인해야합니다. 이를 수행하는 한 가지 방법은 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]);
}
}
'program tip' 카테고리의 다른 글
느리게 순열 생성 (0) | 2020.09.21 |
---|---|
Java에서 오류 응답 본문 읽기 (0) | 2020.09.21 |
C ++에서 assert ()를 사용하고 있습니까? (0) | 2020.09.21 |
RoR 4에서 유효성 검사가있는 정규식 (0) | 2020.09.21 |
너비 / 높이에 영향을주지 않고 DIV 패딩을 변경하는 방법은 무엇입니까? (0) | 2020.09.20 |