Visual Studio 2008 test çerçevesinde dizilerin eşit olduğunu onaylayın


81

Birim testinde iki dizinin eşit olduğunu (yani, aynı sayıda öğeye sahip olduğunu ve her öğenin aynı olduğunu) kontrol etmenin kolay bir yolu var mı?

Java'da kullanırdım assertArrayEquals (foo, bar);, ancak C # için eşdeğeri yok gibi görünüyor. Denedim Assert.AreEqual(new string[]{"a", "b"}, MyFunc("ab"));, ancak işlev "a", "b" içeren bir dizi döndürmesine rağmen kontrol hala başarısız oluyor

Bu, yerleşik birim testi çerçevesine sahip Visual Studio 2008 Team Suite kullanıyor.

Yanıtlar:


147

Ayrıca CollectionAssert.AreEqual, CollectionAssert belgelerine de bakın .


Şunu aklınızda bulundurun, stackoverflow.com/questions/5194966/… nesneler açıkça karşılaştırılabilir object.Equalsve IEqualityComparer<T>başarısız bir iddiadan geçmek için tanımlanmaları gerekebilir.
atconway

2
Keşke bu başarısız olduğunda daha detaylı mesajlar verseydi. "Farklı eleman sayısı" ve "0 dizinindeki eleman eşleşmiyor" biraz işe yaramaz. Öyleyse onlar ne ?!
Albay Panic

2
CollectionAssert.AreEquivalent(Visual Studio 2010'dan edinilebilir) daha bilgilendirici sonuçlar verir. Örneğin, öğelerin sayısı farklı olduğunda, mesaj beklenen ve gerçek öğe sayısını belirtir
Dennie

21

Class1.cs:


namespace ClassLibrary1
{
    public class Class1
    {
        Array arr1 = new[] { 1, 2, 3, 4, 5 };
        public Array getArray()
        {
            return arr1;
        }
    }
}

ArrayEqualTest.cs:


        [TestMethod()]
        public void getArrayTest()
        {
            Class1 target = new Class1(); 
            Array expected = new []{1,2,3,4,5}; 
            Array actual;
            actual = target.getArray();
            CollectionAssert.AreEqual(expected, actual);
            //Assert.IsTrue(expected.S actual, "is the test results");
        }

Test Başarılı, hatayı buldu:


   CollectionAssert.AreEqual failed. (Element at index 3 do not match.)

Lanet olsun, bu yanıta kazara oy verdim ve şimdi olumsuz oyumu geri alamıyorum - "Bu yanıt düzenlenmedikçe oyunuz kilitlendi" :(
Roman Pekar

Bu cevap, ondan önceki yıldan daha iyi görünmüyor.
Konstantin

3

NET 3.5'te, belki düşünün Assert.IsTrue(foo.SequenceEqual(bar));- size hangi dizinde farklı olduğunu söylemez.


1

Tamam işte bunu yapmanın biraz daha uzun bir yolu ...

static void Main(string[] args)
{
    var arr1 = new[] { 1, 2, 3, 4, 5 };
    var arr2 = new[] { 1, 2, 4, 4, 5 };

    Console.WriteLine("Arrays are equal: {0}", equals(arr1, arr2));
}

private static bool equals(IEnumerable arr1, IEnumerable arr2)
{

    var enumerable1 = arr1.OfType<object>();
    var enumerable2 = arr2.OfType<object>();

    if (enumerable1.Count() != enumerable2.Count())
        return false;

    var iter1 = enumerable1.GetEnumerator();
    var iter2 = enumerable2.GetEnumerator();

    while (iter1.MoveNext() && iter2.MoveNext())
    {
        if (!iter1.Current.Equals(iter2.Current))
            return false;
    }

    return true;
}
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.