87

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

4

6 に答える 6

145

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

于 2009-09-03T18:36:39.920 に答える
49

配列はオーバーライドしないためEqualsです。

使用しているテスト フレームワークについては言及していませんが、基本的には、特殊なケースの配列はそのフレームワーク次第です。もちろん、いつでも独自のヘルパー メソッドを実装してそれを行うことができます。私は時々それをしました。.NET 3.5 を使用している場合は、次のEnumerable.SequenceEqual拡張メソッドを使用できます。

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

もちろん、カスタム ヘルパー メソッドを使用すると、それらがどのように異なるかについてより詳細な情報を得ることができます。これらの方法MoreLINQ.TestExtensionsはかなり大まかで準備が整っていますが、役立つ場合があります。

于 2009-09-03T18:35:38.457 に答える
5
//Initialize your arrays here
byte[] array1 = new byte[0];
byte[] array2 = new byte[0];

Assert.AreEqual(System.Convert.ToBase64String(array1),
                System.Convert.ToBase64String(array2));
于 2012-02-28T15:42:32.163 に答える
2

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

于 2009-09-03T18:37:55.190 に答える
-1
byte[] a = new byte[] {x, y, z...};
byte[] b = new byte[] {x, y, z...};
assertArrayEquals(a , b );

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

于 2015-04-25T06:07:41.373 に答える