Cách so sánh Danh sách trong Kiểm tra đơn vị


181

Làm thế nào thử nghiệm này có thể thất bại?

[TestMethod]
public void Get_Code()
{
    var expected = new List<int>();
    expected.AddRange(new [] { 100, 400, 200, 900, 2300, 1900 });

    var actual = new List<int>();
    actual.AddRange(new [] { 100, 400, 200, 900, 2300, 1900 });

    Assert.AreEqual(expected, actual);
    // Assert.AreSame(expected, actual)       fails
    // Assert.IsTrue(expected.Equals(actual)) fails
}

Câu trả lời:


371

Để xác nhận về các bộ sưu tập, bạn nên sử dụng CollectionAssert:

CollectionAssert.AreEqual(expected, actual);

List<T>không ghi đè Equals, vì vậy nếu Assert.AreEqualchỉ gọi Equals, nó sẽ kết thúc bằng cách sử dụng đẳng thức tham chiếu.


6
Tôi muốn điều này đã đưa ra thông điệp chi tiết hơn khi nó thất bại. "Số lượng phần tử khác nhau" và "Phần tử tại chỉ số 0 không khớp" là hơi vô dụng. Vậy thì họ là gì?!
Đại tá Panic

32
Nếu bạn không quan tâm đến thứ tự vật phẩm: {A, B, C} == {C, B, A}, thì hãy sử dụng CollectionAssert.AreEquivalentthay vì msdn.microsoft.com/en-us/l
Library / ms243779.aspx

2
Lưu ý rằng CollectionAssert.AreEqualcó thể chậm hơn đáng kể so vớiAssert.IsTrue...SequenceEqual
Mark Sowul

1
@MarkSowul: Nhưng nó đi kèm với chẩn đoán thất bại tốt hơn nhiều, phải không?
Jon Skeet

2
@MarkSowul: Hmm ... nghe có vẻ đáng báo cáo như một lỗi sau đó. Không có lý do gì nó phải là xấu.
Jon Skeet

34

Tôi đoán điều này sẽ giúp

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

4
Đó cũng là dự phòng của tôi, nhưng tôi hy vọng rằng CollectionAssert sẽ cung cấp nhiều thông báo thất bại hữu ích hơn.
Jon Skeet

4
Đáng buồn thay, nó không thực sự: "CollectionAssert.AreEqual thất bại. (Yếu tố tại chỉ số 0 không khớp.)" (Các yếu tố là gì?)
tên là

17

Nếu bạn muốn kiểm tra xem mỗi cái có chứa cùng một tập hợp các giá trị thì bạn nên sử dụng:

CollectionAssert.AreEquivalent(expected, actual);

Biên tập:

"Hai bộ sưu tập là tương đương nếu chúng có cùng các phần tử có cùng số lượng, nhưng theo bất kỳ thứ tự nào. Các phần tử bằng nhau nếu giá trị của chúng bằng nhau, không phải nếu chúng tham chiếu đến cùng một đối tượng." - https://msdn.microsoft.com/en-us/l Library / ms243779.aspx


14

Tôi đã thử các câu trả lời khác trong chuỗi này và chúng không hoạt động với tôi và tôi đang so sánh các bộ sưu tập các đối tượng có cùng giá trị được lưu trữ trong các thuộc tính của chúng, nhưng các đối tượng thì khác.

Phương thức gọi:

CompareIEnumerable(to, emailDeserialized.ToIndividual,
            (x, y) => x.ToName == y.ToName && x.ToEmailAddress == y.ToEmailAddress);

Phương pháp so sánh:

private static void CompareIEnumerable<T>(IEnumerable<T> one, IEnumerable<T> two, Func<T, T, bool> comparisonFunction)
    {
        var oneArray = one as T[] ?? one.ToArray();
        var twoArray = two as T[] ?? two.ToArray();

        if (oneArray.Length != twoArray.Length)
        {
            Assert.Fail("Collections are not same length");
        }

        for (int i = 0; i < oneArray.Length; i++)
        {
            var isEqual = comparisonFunction(oneArray[i], twoArray[i]);
            Assert.IsTrue(isEqual);
        }
    }

3
Ngoài ra, hoặc bạn cũng có thể ghi đè lên Equalsphương thức và CollectionAssertsẽ hoạt động.
Ray Cheng

6

kiểm tra này so sánh đầu vào ngày, kiểm tra xem đó có phải là năm nhuận hay không, nếu vậy, sẽ tạo ra 20 năm nhuận kể từ ngày được nhập, nếu không, sẽ đưa ra năm nhuận 20 NEXT, myTest.Testing đề cập đến trường hợp myTest lần lượt gọi các giá trị từ một Danh sách gọi là Kiểm tra có chứa các giá trị được tính toán cần thiết. một phần của bài tập tôi phải làm

[TestMethod]
        public void TestMethod1()
        {
            int testVal = 2012;
            TestClass myTest = new TestClass();
            var expected = new List<int>();
            expected.Add(2012);
            expected.Add(2016);
            expected.Add(2020);
            expected.Add(2024);
            expected.Add(2028);
            expected.Add(2032);
            expected.Add(2036);
            expected.Add(2040);
            expected.Add(2044);
            expected.Add(2048);
            expected.Add(2052);
            expected.Add(2056);
            expected.Add(2060);
            expected.Add(2064);
            expected.Add(2068);
            expected.Add(2072);
            expected.Add(2076);
            expected.Add(2080);
            expected.Add(2084);
            expected.Add(2088);
            var actual = myTest.Testing(2012);
            CollectionAssert.AreEqual(expected, actual);
        }

0
List<AdminUser> adminDetailsExpected = new List<AdminUser>()
{
new AdminUser  {firstName = "test1" , lastName = "test1" , userId = 
"001test1"  },
new AdminUser {firstName = "test2" , lastName = "test2" , userId = 
"002test2"   }
};

// Đạo luật

List<AdminUser> adminDetailsActual = RetrieveAdmin(); // your retrieve logic goes here

// Khẳng định

Assert.AreEqual(adminDetailsExpected.Count, adminDetailsActual.Count);  //Test succeeds if the count matches else fails. This count can be used as a work around to test

0

Các xác nhận thông thạo không so sánh sâu các mảng actualArray.Should().BeEquivalentTo(expectedArray)

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.