Tôi có một lớp PagedModel mà thực hiện IEnumerable để chỉ trả về ModelData, bỏ qua dữ liệu phân trang. Tôi cũng đã ghi đè Equals và GetHashCode để cho phép so sánh hai đối tượng PagedModel với ModelData, PageNumber và TotalPages và PageSize của chúng.Assert.AreEqual không sử dụng .Equals của tôi ghi đè trên một thực hiện IEnumerable
Đây là vấn đề
Dim p1 As New PagedModel() With {
.PageNumber = 1,
.PageSize = 10,
.TotalPages = 10,
.ModelData = GetModelData()
}
Dim p2 As New PagedModel() With {
.PageNumber = 1,
.PageSize = 10,
.TotalPages = 10,
.ModelData = GetModelData()
}
p1.Equals(p2) =====> True
Assert.AreEqual(p1, p2) ======> False!
Dường như NUnit đang kêu gọi đó là phương pháp EnumerableEqual nội bộ để so sánh PagedModel tôi thay vì sử dụng các phương pháp Equals tôi cung cấp! Có cách nào để ghi đè hành vi này không hay tôi phải viết một Assertion tùy chỉnh.
Câu trả lời này là gì về cơ bản trong triển khai của bạn, bạn cần triển khai rõ ràng IEquatable .Equals ... xem http://stackoverflow.com/questions/1577149/explicit-interface-implementation-in-vb-net –
Jay
Không, việc triển khai IEquatable là không đủ. Việc thực hiện GetHashCode cũng quan trọng. Nó cũng quan trọng để hiểu rằng IEnumerable rơi trở lại để sử dụng bằng (đối tượng) nếu bạn không thực hiện IEquatable (xem báo giá trong bài của tôi), do đó, làm như vậy là không hoàn toàn cần thiết. –
csauve
Tôi đã nói rõ ràng việc triển khai IEquatable.Equals không nên cho phép dự phòng mặc định vì phương thức sẽ ghi đè và việc triển khai rõ ràng sẽ gọi cho phương thức đã nói ... – Jay