2009-06-09 11 views
11

Có ai nhìn thấy một thư viện kiểm tra WCF DataContracts không? Động lực đằng sau yêu cầu này là tôi chỉ tìm thấy một lỗi trong ứng dụng của tôi là kết quả của việc không chú thích một thuộc tính với thuộc tính DataMember - kết quả là thuộc tính đó đã không được đăng.Có ai đã tạo công cụ kiểm tra DataContract không?

Điều tôi lưu ý là một API, với một kiểu DataContract cụ thể, sẽ tự động điền các thành viên của nó với dữ liệu ngẫu nhiên, bao gồm mọi DataContracts con, sau đó tuần tự hóa nó thông qua một trong WCF Serializers/Formatters và sau đó kiểm tra tất cả dữ liệu đã được chuyển qua.

Bất kỳ ai?

Trả lời

9

Đủ đơn giản để sử dụng DataContractSerializer để nối tiếp đối tượng của bạn thành MemoryStream, sau đó deserialise nó trở thành sự tồn tại dưới dạng một phiên bản mới.

Dưới đây là một lớp học thể hiện serialization khứ hồi này:

public static class WcfTestHelper 
{ 
    /// <summary> 
    /// Uses a <see cref="DataContractSerializer"/> to serialise the object into 
    /// memory, then deserialise it again and return the result. This is useful 
    /// in tests to validate that your object is serialisable, and that it 
    /// serialises correctly. 
    /// </summary> 
    public static T DataContractSerializationRoundTrip<T>(T obj) 
    { 
     return DataContractSerializationRoundTrip(obj, null); 
    } 

    /// <summary> 
    /// Uses a <see cref="DataContractSerializer"/> to serialise the object into 
    /// memory, then deserialise it again and return the result. This is useful 
    /// in tests to validate that your object is serialisable, and that it 
    /// serialises correctly. 
    /// </summary> 
    public static T DataContractSerializationRoundTrip<T>(T obj, 
        IEnumerable<Type> knownTypes) 
    { 
     var serializer = new DataContractSerializer(obj.GetType(), knownTypes); 
     var memoryStream = new MemoryStream(); 
     serializer.WriteObject(memoryStream, obj); 
     memoryStream.Position = 0; 
     obj = (T)serializer.ReadObject(memoryStream); 
     return obj; 
    } 
} 

Hai nhiệm vụ mà bạn có trách nhiệm:

  • Populating trường hợp ở nơi đầu tiên với các dữ liệu nhạy cảm. Bạn có thể chọn sử dụng sự phản chiếu để thiết lập các thuộc tính hoặc cung cấp một hàm tạo với các đối số của nó, nhưng tôi đã tìm thấy cách tiếp cận này sẽ không làm việc cho bất kỳ thứ gì ngoài các kiểu cực kỳ đơn giản.
  • So sánh hai trường hợp sau khi bạn có chuyến đi khứ hồi de/serialized nó. Nếu bạn có triển khai thực hiện Equals/GetHashCode đáng tin cậy, thì điều đó có thể đã được thực hiện cho bạn. Một lần nữa bạn có thể thử sử dụng một bộ so sánh phản chiếu chung chung, nhưng điều này có thể không hoàn toàn đáng tin cậy.
+0

Sau khi vượt qua kiểm tra đối tượng hợp đồng dữ liệu bằng cách sử dụng phương pháp trên, tôi đã cố gắng sử dụng cài đặt máy khách/máy chủ thực và vẫn nhận được thông báo sau: "Luồng đầu vào chứa các mục bộ sưu tập không thể được thêm vào nếu thể hiện là null ". Bất kỳ ý tưởng làm thế nào đó là nhận được thông qua các bài kiểm tra? – slolife

+0

@slolife, bạn sẽ phải đảm bảo 'obj' bạn đang chuyển vào thử nghiệm đơn vị chứa cùng một loại mục trong bộ sưu tập đó đang gây ra sự cố mà bạn đang gặp phải. Việc đề cập đến 'null' trong lỗi cho thấy bộ sưu tập của bạn không được khởi tạo vì một lý do nào đó. Nếu bạn vẫn còn bị mắc kẹt, như một câu hỏi mới với nhiều thông tin hơn (và liên kết đến nó ở đây nếu bạn thích.) –

+0

Cảm ơn bạn đã trả lời câu trả lời này! Nó có thể dễ dàng được điều chỉnh để tuần tự hóa Json bằng cách sử dụng DataContract ** Json ** Serializer – Sebastian

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