web-dev-qa-db-ja.com

Assert.AreEqual(T obj1、Tobj2)が同一のバイト配列で失敗する理由

次のコードセグメントに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が失敗するのはなぜですか?

82
David Anderson

Assert.EqualsEqualsメソッドを使用してテストします。このメソッドは、デフォルトでは参照の等価性を使用します。これらは異なるオブジェクトであるため、等しくありません。配列内の各バイトを比較して、それらが等しいことを確認します。これを行う1つの方法は、ICollectionを実装するものに変換し、代わりに CollectionAssert.AreEqual() を使用することです。

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

Assert.AreEqual(System.Convert.ToBase64String(array1),
                System.Convert.ToBase64String(array2));
4
José Brazeta

内部のAssert.AreEqualメソッドは、null以外の値の場合、デフォルトでObject.Equals()になります。 Object.Equals()のデフォルトの実装は参照等価です。 2つの配列は値は同じですが、参照は差があるため、等しいとは見なされません。

2
JaredPar

作成された単純なヘルパーメソッド:

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
Gh61
byte[] a = new byte[] {x, y, z...};
byte[] b = new byte[] {x, y, z...};
assertArrayEquals(a , b );

ものを比較します...それは私のために働きます..

0
user2682078