xUnit: Khẳng định hai List <T> bằng nhau?


108

Tôi mới sử dụng TDD và xUnit nên tôi muốn thử nghiệm phương pháp của mình trông giống như sau:

List<T> DeleteElements<T>(this List<T> a, List<T> b);

Có bất kỳ phương pháp Assert nào mà tôi có thể sử dụng không? Tôi nghĩ một cái gì đó như thế này sẽ tốt

List<int> values = new List<int>() { 1, 2, 3 };
List<int> expected = new List<int>() { 1 };
List<int> actual = values.DeleteElements(new List<int>() { 2, 3 });

Assert.Exact(expected, actual);

Có một cái gì đó như thế này?

Câu trả lời:


135

xUnit.Net nhận dạng các bộ sưu tập nên bạn chỉ cần làm

Assert.Equal(expected, actual); // Order is important

Bạn có thể xem các xác nhận bộ sưu tập có sẵn khác trong CollectionAsserts.cs

Đối với các phương pháp so sánh bộ sưu tập thư viện NUnit

CollectionAssert.AreEqual(IEnumerable, IEnumerable) // For sequences, order matters

CollectionAssert.AreEquivalent(IEnumerable, IEnumerable) // For sets, order doesn't matter

Thêm chi tiết tại đây: CollectionAssert

MbUnit cũng có các xác nhận tập hợp tương tự như NUnit: Assert.Collections.cs


1
Đã thay đổi liên kết mã nguồn cho xunit.codeplex.com/SourceControl/changeset/view/…
Julien Roncaglia

1
Liên kết mới trong bình luận cũng bị hỏng.
Scott Stafford

1
Dự án hiện đã được chuyển sang GitHub, nhưng tôi cũng không thể tìm thấy tệp nguồn cụ thể đó ở đó.
MEMark

1
Đối với đối tượng phức tạp, đừng quên rằng bạn cần có Equal + GetHasCode để điều này hoạt động hoặc cung cấp cho phương thức Equal một EqulityComparer tùy chỉnh
maracuja-juice

2
Phương thức xUnit Equal trả về false cho hai IEnumerables có nội dung bằng nhau.
Vladimir Kocjancic 28/09/18

31

Trong phiên bản XUnit (1.5) hiện tại, bạn chỉ có thể sử dụng

Assert.Equal (dự kiến, thực tế);

Phương pháp trên sẽ thực hiện so sánh từng phần tử của hai danh sách. Tôi không chắc liệu điều này có phù hợp với bất kỳ phiên bản nào trước đó hay không.


7
Vấn đề tôi gặp phải với Assert.Equal cho các bộ sưu tập là nó không thành công nếu các phần tử của bộ sưu tập có thứ tự khác nhau, ngay cả khi các phần tử có trong cả hai.
Scott Lawrence

1
@ ScottA.Lawrence Danh sách cũng có thứ tự! Bạn có nhận được hành vi tương tự với HashSets không?
johv

@johv Tôi chưa thử nghiệm nó với HashSets, nhưng đó là một ý kiến ​​hay. Một khi tôi có cơ hội để thử nó, tôi sẽ cố gắng ghi nhớ để trả lời ở đây.
Scott Lawrence

2
Nó cũng có vẻ không thành công nếu các loại bộ sưu tập khác nhau, ngay cả khi cả hai đều chứa các mục giống nhau theo cùng một thứ tự.
James White

3
Nhưng nó có một đầu ra rất tồi tệ. Nó không cho bạn biết hai danh sách khác nhau ở đâu! :(
Zordid

16

Với xUnit, nếu bạn muốn chọn các thuộc tính của từng phần tử để kiểm tra, bạn có thể sử dụng Assert.Collection.

Assert.Collection(elements, 
  elem1 => Assert.Equal(expect1, elem1.SomeProperty),
  elem2 => { 
     Assert.Equal(expect2, elem2.SomeProperty);
     Assert.True(elem2.TrueProperty);
  });

Điều này kiểm tra số lượng dự kiến ​​và đảm bảo rằng mỗi hành động được xác minh.


2

Gần đây, tôi đã sử dụng xUnit 2.4.0Moq 4.10.1đóng gói trong ứng dụng asp.net core 2.2 của mình.

Trong trường hợp của tôi, tôi đã quản lý để làm cho nó hoạt động với quy trình hai bước:

  1. Xác định việc triển khai IEqualityComparer<T>

  2. Truyền cá thể so sánh làm tham số thứ ba vào Assert.Truephương thức:

    Assert.True(expected, actual, new MyEqualityComparer());

Nhưng có một cách khác tốt hơn để có được kết quả tương tự bằng cách sử dụng gói FluentAssertions . Nó cho phép bạn làm những việc sau:

// Assert          
expected.Should().BeEquivalentTo(actual));

Điều thú vị là Assert.Equal()luôn không thành công ngay cả khi tôi đã sắp xếp các phần tử của hai danh sách để chúng theo cùng một thứ tự.


2
cái gì là sai với trật tự chăm sóc BeEquivalentTo doesnt của bạn về trật tự (thats lý do tại sao thử nghiệm của bạn đi với BeEquivalentTo và không phải với assert.Equal)
RagnaRock
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.