2012-02-18 24 views
6

Tôi muốn để có thể so sánh hai đối tượng sau cho sự giống nhau sử dụng AutoFixture.SemanticComparison:AutoFixture chân dung - So sánh các chỉ phù hợp với tính chất

public class Object1 
{ 
    public int a; 
} 

public class Object2 
{ 
    public int a; 
    public int b; 
} 

Bây giờ, khi tôi làm điều đó theo cách này:

var o1 = new Object1 { a = 1 }; 
var o2 = new Object2 { a = 1, b = 2}; 
o1.AsSource().OfLikeness<Object2>().ShouldEqual(o2); 

Tôi nhận được ngoại lệ sau: "Các thành viên sau không khớp: - b."

tôi phát hiện ra rằng tôi có thể bỏ qua các thành viên 'b' như thế này:

var o1 = new Object1 { a = 1 }; 
var o2 = new Object2 { a = 1, b = 2}; 
o1.AsSource().OfLikeness<Object2>().Without(object2 => object2.b).ShouldEqual(o2); 

Tuy nhiên, tôi thấy rằng đây là khá cồng kềnh, vì bất cứ khi nào tôi thêm một thành viên mới vào lớp Object2, tôi phải sửa các bài kiểm tra đơn vị của tôi (hoặc ít nhất là người trợ giúp bài kiểm tra đơn vị).

Có cách nào để nói "Tôi muốn so sánh về sự giống nhau chỉ dành cho tập hợp con tồn tại trong cả hai đối tượng"?

Trả lời

7

Có vẻ như bạn muốn so sánh hai đối tượng dựa trên giao lộ giao nhau thuộc tính của chúng. Điều này hiện không được lớp Likeness hỗ trợ. Lý do là:

Ngay bây giờ loại đích (trong ví dụ trên, đó sẽ là Object2) là mẫu quyết định khi kết hợp được thực hiện. Điều này cung cấp một tuyên bố mạnh mẽ để xác nhận: mọi thuộc tính công khai hoặc trường của lớp này phải được đối sánh.

Tuy nhiên, một tuyên bố về kết hợp giao điểm của thuộc tính sẽ là một tuyên bố rấtyếu, bởi vì đó ngã tư có thể là rỗng. Điều này có thể dẫn đến False Negatives.

Thậm chí nếu bạn đang TDDing và theo chu kỳ Red/Green/Refactor và bạn đã nhìn thấy một kiểm tra đơn vị thất bại với giao điểm giả định Likeness, các phép tái cấu trúc tiếp theo có thể biến xác nhận đó thành Sai âm, khi bạn xóa thuộc tính hoặc trường cuối cùng mà hai đối tượng có chung - và bạn sẽ không bao giờ nhận thấy.

Tuy nhiên, AutoFixture là nguồn mở và tất cả, vì vậy, bạn được chào đón đến suggest this feature hoặc gửi yêu cầu kéo.

+1

Đối số bạn mô tả khá mạnh. Nó khiến tôi suy nghĩ về những gì là cồng kềnh hơn - thêm các thuộc tính mới vào Không() hoặc theo dõi hai đối tượng để thay đổi tên thuộc tính để tránh các mặt tích cực sai. Cảm ơn bạn đã hướng sự chú ý của mình đến điều này! –

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