Assert.AreEqual (T obj1, Tobj2) neden aynı bayt dizileriyle başarısız oluyor?


86

Aşağıdaki kod segmentinde iki özdeş bayt dizim var:

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

Her iki dizi de bayta kadar aynıdır. Bu senaryoda, Assert.AreEqual neden başarısız olur?


1
Not olarak, NUnit kullanırsanız, dizilerin değer karşılaştırmaları sürüm 2.2'den beri desteklenmektedir, bu nedenle Assert.AreEqualiyi çalışacaktır.
AJ Richardson

Yanıtlar:


141

Assert.EqualsEqualsvarsayılan olarak referans eşitliğini kullanan ve farklı nesneler oldukları için eşit olmayan yöntemi kullanan testler . Dizideki her baytı karşılaştırmak ve eşit olduklarını doğrulamak isteyeceksiniz. Bunu yapmanın bir yolu, onları ICollection uygulayan bir şeye dönüştürmek ve bunun yerine CollectionAssert.AreEqual () kullanmaktır.


3
Bir dizi zaten bir ICollectiontabii ki. Hatta bir IList. "Koleksiyon eşitliğinizin" sıralamayı dikkate alması önemlidir (yani koleksiyonlar sadece matematiksel kümeler olarak değil, diziler olarak da eşit olmalıdır).
Jeppe Stig Nielsen

Bu cevap yanlış! "Assert.AreEqual, objectOne.Equals (objectTwo) öğesinin true döndüreceğini kontrol eder." (bakınız blog.robustsoftware.co.uk/2009/05/… ). Referans eşitliğini kontrol etmek istiyorsanız Assert.AreSame () kullanmanız gerekir. Assert.AreEqual () çıktısı tamamen nesne türüne bağlıdır.
user1027167

@ user1027167 - açıklığa kavuşturuldu. Bu durumda, referans eşitliğini kontrol etmeye çalışmıyordu, ancak aynı içeriği içerip içermediğini, bu yüzden cevabın bu tür bir kesinliğe ihtiyaç duyduğunu düşünmemiştim.
tvanfosson

2
Diğer CollectionAssert yöntemlerine de bakmanızı öneririm ... Bu birim test çerçevesini ne kadar süredir kullanıyorum ve CollectionAssert hakkında bilgim yok! Bunu çok uzun zamandır elle yapıyorum ve kendimi oldukça aptal hissediyorum.

44

Çünkü diziler geçersiz kılmaz Equals.

Hangi test çerçevesini kullandığınızı söylemediniz, ancak temelde özel durum dizileri bu çerçeveye bağlı. Elbette bunu yapmak için her zaman kendi yardımcı yönteminizi uygulayabilirsiniz. Bunu bazen yaptım. Hızlı ve kirli bir hack için, .NET 3.5 kullanıyorsanız, Enumerable.SequenceEqualuzantı yöntemini kullanabilirsiniz :

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

Özel bir yardımcı yöntem, elbette size nasıl farklı oldukları hakkında daha fazla ayrıntı verebilir. MoreLINQ.TestExtensionsOldukça kaba ve hazır olsalar da yöntemleri yararlı bulabilirsiniz .


VSTS birim testleri kullanıyorum. Kullanabileceğim yerleşik bir alternatif iddia var mı, yoksa bir for-loop yapıp baytları karşılaştırıp, hepsi eşitse, o zaman iddia edebilir miyim?
David Anderson

Korkarım VSTS birim testlerini kullanmadım - ancak tvanfosson'ın önerisi uygun görünüyor.
Jon Skeet

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

4
Karşılaştırma yapmak için neden baytı [] dizgeye dönüştürelim? Gereksiz ve hayal edin, hata baytta değil dönüşümün kendisinde olabilir []
Luis Filipe

2

Başlık altındaki Assert.AreEqual yöntemi, boş olmayan değerler için varsayılan olarak Object.Equals () yöntemini kullanır. Object.Equals () öğesinin varsayılan uygulaması, referans eşitliğidir. 2 dizi özdeş değerdir, ancak farklılık referansı açısından önemlidir ve bu nedenle eşit kabul edilmeyecektir.


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

şeyleri karşılaştıracak ... Benim için çalışıyor ..


0

Basit yardımcı yöntem oluşturuldu:

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]);
    }
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.