2012-06-21 31 views
5

Tôi đang sử dụng khung công tác XUnit để kiểm tra mã C# của tôi.XUnit Xác nhận để kiểm tra sự bình đẳng của các đối tượng

Có phương pháp khẳng định nào có sẵn trong khuôn khổ này so sánh đối tượng không? Ý định của tôi là kiểm tra sự bình đẳng của từng biến thành viên công cộng và tư nhân của đối tượng.

tôi đã cố gắng những lựa chọn thay thế nhưng hiếm khi nó hoạt động:

1) bool IsEqual = (Obj1 == Obj2) 
2) Assert.Same(Obj1, Obj2) which I couldnt understand what happens internally 
+1

Có "so sánh sâu" trong xUnit. Bạn sẽ phải thực hiện IEquatable cho các đối tượng của bạn, và sau đó Assert.Equals sẽ hoạt động. – seldary

+1

'Assert.Same()' so sánh theo tham chiếu; nó xác nhận rằng 'Obj1' và' Obj2' là đối tượng ** giống ** thay vì chỉ ** trông giống nhau. – TeaDrivenDev

Trả lời

6

Bạn cần có một comparer tùy chỉnh để đạt được điều này, khi bạn so sánh đối tượng nếu không họ được kiểm tra trên cơ sở cho dù họ đang đề cập đến cùng đối tượng trong bộ nhớ. Thay đổi hành vi này, bạn cần phải ghi đè phương pháp EqualsGetHashCode và sau đó bạn có thể làm:

Assert.True(obj1.Equals(obj2)); 

Dưới đây là một MSDN trang abt quá tải Bằng phương pháp: http://msdn.microsoft.com/en-us/library/ms173147(v=vs.80).aspx

Cũng apt bình luận về câu hỏi: What's the difference between IEquatable and just overriding Object.Equals()?

+1

Tôi hiểu rằng bằng cách triển khai phương thức "Bình đẳng" tùy chỉnh, kiểm tra này có thể được thực hiện. Nhưng liệu có phương pháp nào để thực hiện so sánh byte mù, điều này sẽ giúp việc kiểm tra dễ dàng hơn không? Điều này là bởi vì tôi sẽ kết thúc việc thực hiện "Equals" trong "Software under test" chỉ vì mục đích thử nghiệm đơn vị. – inquisitive

+1

Tôi đã thử sử dụng các phương thức tuần tự hóa để chuyển đổi cả hai đối tượng thành mảng byte và nó hoạt động. Nhưng nó đi kèm với một ràng buộc của việc thêm thuộc tính [serializable] vào lớp của tôi có các biến thành viên riêng. Tôi đoán điều này là không tốt trong quan điểm thiết kế – inquisitive

8

tôi có vấn đề tương tự, nhưng sau đó may mắn tôi đã sử dụng

using Newtonsoft.Json; 

Vì vậy, tôi chỉ cần serialize nó để đối tượng json sau đó so sánh như chuỗi.

var obj1Str = JsonConvert.SerializeObject(obj1); 
var obj2Str = JsonConvert.SerializeObject(obj2); 
Assert.Equal(obj1Str, obj2Str); 
+0

Tôi xem xét điều này hữu ích hơn so với việc thực hiện một phương thức Equals bởi vì tôi muốn không khẳng định của tôi để cho tôi biết một cái gì đó về những gì đã sai. Những gì tôi muốn lý tưởng là có cái gì đó có thể đi qua một cây đối tượng và tích lũy thông tin về những thuộc tính/subtrees nào không bằng nhau và thất bại với thông tin đó. –

+0

@RikkiGibson không thực hiện Equals đúng cách để làm điều đó? Chỉ cần thêm ngoại lệ vào danh sách trong bằng cho mỗi thuộc tính khác nhau, sau đó ở cuối hoặc trả về true hoặc ném tất cả ngoại lệ –

+0

Có, nhưng có thể cần phải cẩn thận để thực hiện từng trường hợp, đó là lý do tại sao tôi có xu hướng tìm kiếm các giải pháp dựa trên phản chiếu trong quá khứ khi so sánh các cây của các đối tượng cũ, nguyên thủy và các bộ sưu tập. –

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