Khẳng định rằng các mảng bằng nhau trong khung kiểm tra Visual Studio 2008


81

Có cách nào dễ dàng để kiểm tra trong một bài kiểm tra đơn vị rằng hai mảng có bằng nhau (nghĩa là có cùng số phần tử và mỗi phần tử đều giống nhau không?).

Trong Java, tôi sẽ sử dụng assertArrayEquals (foo, bar);, nhưng dường như không có tương đương cho C #. Tôi đã thử Assert.AreEqual(new string[]{"a", "b"}, MyFunc("ab"));, nhưng mặc dù hàm trả về một mảng có "a", "b", việc kiểm tra vẫn không thành công

Điều này đang sử dụng Visual Studio 2008 Team Suite, với khung kiểm tra đơn vị được tích hợp sẵn.

Câu trả lời:


147

Đó là CollectionAssert.AreEqual, hãy xem thêm tài liệu cho CollectionAssert .


Chỉ cần ghi nhớ những điều sau, stackoverflow.com/questions/5194966/… các đối tượng có thể được so sánh rõ ràng với object.EqualsIEqualityComparer<T>có thể phải được xác định để vượt qua một xác nhận không thành công.
atconway

2
Tôi ước điều này cung cấp thông báo chi tiết hơn khi nó không thành công. "Số phần tử khác nhau" và "Phần tử ở chỉ số 0 không khớp nhau" hơi vô dụng. Sau đó họ là gì ?!
Colonel Panic

2
CollectionAssert.AreEquivalent(có sẵn từ Visual Studio 2010) cho kết quả nhiều thông tin hơn. Ví dụ: khi số lượng phần tử khác nhau, thông báo cho biết số lượng phần tử được mong đợi và thực tế
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");
        }

Kiểm tra thành công, tìm thấy lỗi:


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

Khỉ thật, tôi đã vô tình phản đối câu trả lời này và bây giờ tôi không thể hoàn tác phản đối của mình - Tôi nhận được "Phiếu bầu của bạn hiện đã bị khóa trừ khi câu trả lời này được chỉnh sửa" :(
Roman Pekar

Câu trả lời này trông không tốt hơn câu trả lời từ năm trước.
Konstantin

3

Trong .NET 3.5, có lẽ nên xem xét Assert.IsTrue(foo.SequenceEqual(bar));- tuy nhiên, nó sẽ không cho bạn biết nó khác ở chỉ số nào.


1

Ok, đây là một cách làm dài hơn một chút ...

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;
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.