2012-04-20 9 views
8

Tôi cố gắng để so sánh hai Lists sử dụngCollectionAssert.AreEqual Không

CollectionAssert.AreEqual(ListExpected, ListActual); 

Nhưng tôi nhận được một ngoại lệ

Expected and actual are both <System.Collections.Generic.List`1[API.Program.Relation]> with 11 elements 
    Values differ at index [0] 
    Expected: <API.Program.Relation> 
    But was: <API.Program.Relation> 

Nhưng khi tôi so sánh yếu tố không sử dụng Assert.AreEqual trên sân bởi lĩnh vực mọi thứ khỏe.

Bất cứ ý tưởng tại sao tôi không thể so sánh bằng CollectionAssert

+0

Chúng thực sự có tham chiếu bằng nhau không? Ngay cả khi tất cả các dữ liệu là như nhau, nó có thể không phải là cùng một ví dụ. – Tejs

+3

là các mục trong bộ sưu tập bạn đang so sánh việc thực hiện 'Equals' và' GetHashCode' đúng cách? –

+0

Các tham chiếu của mục không giống nhau hay chỉ các giá trị trường? – ken

Trả lời

11

Một đối tượng là "tuyên bố" bằng một đối tượng trong .NET là nếu phương pháp Equals(object other) nó trả về true. Bạn cần phải thực hiện phương thức đó cho lớp API.Program.Relation của bạn, nếu không .NET xem xét các đối tượng của bạn khác nhau trừ khi chúng có tham chiếu bằng nhau. Thực tế là tất cả các trường đều giống nhau không quan trọng với .NET. Nếu bạn cần ngữ nghĩa bình đẳng theo trường, bạn cần cung cấp một sự thực thi của Equals để hỗ trợ nó.

Khi bạn ghi đè Equals, đừng quên ghi đè lên GetHashCode - chúng phải được ghi đè lại với nhau.

Nếu bạn không muốn hoặc không thể ghi đè Equals vì một số lý do, bạn có thể sử dụng an overload of CollectionAssert.AreEqual có phiên bản IComparer để hỗ trợ so sánh các yếu tố thu thập.

+3

Và khi bạn ghi đè Equals/GetHashCode, hãy xem xét việc làm cho lớp không thay đổi được. –

+0

@HenkHolterman hoặc ít nhất các trường được sử dụng để tính toán bình đẳng và mã băm – phoog

Các vấn đề liên quan