2010-08-13 28 views
6

Trong thử nghiệm đơn vị (trong Visual Studio 2008) tôi muốn so sánh nội dung của đối tượng lớn (danh sách các loại tùy chỉnh, chính xác) với một tham chiếu được lưu trữ của đối tượng này. Mục đích là để đảm bảo rằng, bất kỳ phép tái cấu trúc nào sau này của mã tạo ra cùng một nội dung đối tượng.(Sâu) so sánh một đối tượng với tham chiếu trong các phép thử đơn vị (C#)

Ý tưởng bị loại bỏ: Ý tưởng đầu tiên là để tuần tự hóa thành XML và sau đó so sánh các chuỗi được mã hóa cứng hoặc nội dung tệp. Điều này sẽ cho phép dễ dàng tìm ra bất kỳ sự khác biệt nào. Tuy nhiên kể từ khi các loại của tôi không phải là XML serializable mà không có một hack, tôi phải tìm một giải pháp. Tôi có thể sử dụng nhị phân serialization nhưng điều này sẽ không thể đọc được nữa.

Có giải pháp đơn giản và thanh lịch nào cho điều này không?

EDIT: Theo đề nghị Marc Gravell của tôi làm bây giờ như thế này:

using (MemoryStream stream = new MemoryStream()) 
     { 
      //create actual graph using only comparable properties 
      List<NavigationResult> comparableActual = (from item in sparsed 
                 select new NavigationResult 
                 { 
                  Direction = item.Direction, 
                  /*...*/ 
                  VersionIndication = item.VersionIndication 
                 }).ToList(); 

      (new BinaryFormatter()).Serialize(stream, comparableActual); 
      string base64encodedActual = System.Convert.ToBase64String(stream.GetBuffer(), 0, (int)stream.Length);//base64 encoded binary representation of this     
      string base64encodedReference = @"AAEAAAD....";//this reference is the expected value 
      Assert.AreEqual(base64encodedReference, base64encodedActual, "The comparable part of the sparsed set is not equal to the reference."); 
     } 

Về bản chất tôi làm chọn các thuộc tính có thể so sánh đầu tiên, sau đó mã hóa đồ thị, sau đó so sánh nó với một tài liệu tham khảo mã hóa tương tự. Mã hóa cho phép so sánh sâu theo cách đơn giản. Lý do tôi sử dụng mã hóa base64 là, tôi có thể dễ dàng lưu trữ tham chiếu nó trong một biến chuỗi.

+1

Ý tưởng tuần tự hóa dường như là ý tưởng tốt nhất cho đồ thị sâu. – StuartLC

+0

Việc tuần tự hóa không hoàn toàn đáng tin cậy. Bạn có thể nhận được âm tính giả. Xem http://stackoverflow.com/questions/2244223/is-it-reliable-to-compare-two-instances-of-a-class-by-comparing-their-serialized –

Trả lời

5

Tôi vẫn muốn sử dụng tuần tự hóa. Nhưng thay vì phải , hãy biết nhị phân, chỉ cần tạo biểu đồ dự kiến, sắp xếp theo thứ tự đó. Bây giờ, hãy tuần tự hóa biểu đồ thực tế và so sánh các byte. Điều này chỉ hữu ích để cho bạn biết rằng có sự khác biệt; bạn cần kiểm tra để tìm số những gì, đó là một nỗi đau.

+0

Vâng, tôi hiện đang làm việc này như bạn nói, nhưng tôi muốn tránh cơn đau! – Marcel

+0

Vì vậy, bây giờ, tôi vẫn cảm thấy đau đớn, nhưng thử nghiệm của tôi bây giờ làm việc với các chỉnh sửa trong câu hỏi, làm nó giống như bạn đề xuất. – Marcel

+0

Có lẽ một sự kết hợp của serialization nhị phân và phân tích phản ánh sâu (như trong ý tưởng của tôi) trong trường hợp không phù hợp trong so sánh nhị phân sẽ giải quyết nó. – Migol

1

Tôi sẽ sử dụng tính năng hack để thực hiện so sánh XML. Hoặc bạn có thể sử dụng sự phản chiếu đến các thuộc tính đối tượng tự động đi qua (nhưng điều này sẽ đi qua TẤT CẢ chúng, cũng có một số bạn không thể muốn).

+0

Thật không may là hack, để thao tác một tập tin được tạo ra (được tạo ra bởi khung thực thể) – Marcel

+0

Không phải là khung thực thể tạo ra các lớp một phần? Bạn không thể áp dụng "hack" trong một tập tin mở rộng các lớp học một phần khi cần thiết? Nếu bạn đang sử dụng VS2010, nó cũng bao gồm mẫu ADO.NET EntityObject Generator. Sau đó, bạn thực sự có thể sửa đổi mẫu đối tượng Entity để phù hợp với yêu cầu của bạn. – FuleSnabel

1

Tôi sẽ làm cho mỗi loại tùy chỉnh kế thừa IComparable và cung cấp phương thức bình đẳng, so sánh từng loại tùy chỉnh, cũng như tạo lớp chính ICompareble, Bạn có thể chỉ cần so sánh 2 đối tượng (nếu bạn có chúng trong bộ nhớ khi chạy đơn vị kiểm tra) Nếu không thì tôi sẽ đề nghị hoặc serializing, hoặc xác định hằng số mà bạn mong đợi các đối tượng refactored để có.

+0

Vâng, đó là một giải pháp tốt đẹp vì nó thêm một số chức năng cho các lớp học với chi phí viết mã và rò rỉ có thể (nếu một số đối tượng không cung cấp IComparable, sau đó nó sẽ không đáng tin cậy). – Migol

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