次のコードセグメントに2つの同一のバイト配列があります。
/// <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
メソッドを使用してテストします。このメソッドは、デフォルトでは参照の等価性を使用します。これらは異なるオブジェクトであるため、等しくありません。配列内の各バイトを比較して、それらが等しいことを確認します。これを行う1つの方法は、ICollectionを実装するものに変換し、代わりに CollectionAssert.AreEqual() を使用することです。
//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()のデフォルトの実装は参照等価です。 2つの配列は値は同じですが、参照は差があるため、等しいとは見なされません。
作成された単純なヘルパーメソッド:
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]);
}
}
byte[] a = new byte[] {x, y, z...};
byte[] b = new byte[] {x, y, z...};
assertArrayEquals(a , b );
ものを比較します...それは私のために働きます..