2009-06-09 14 views
11

Czy ktoś widział bibliotekę, która testuje WCF DataContracts? Motywacją do zadawania tego pytania jest to, że znalazłem błąd w mojej aplikacji, który wynikał z tego, że nie notowałem właściwości atrybutu DataMember - w rezultacie ta właściwość nie była serializowana.Czy ktoś utworzył narzędzie do testowania DataContract?

Co mam na myśli to API, które, biorąc pod uwagę określony typ DataContract, automatycznie zapełni swoich członków losowymi danymi, w tym dowolnymi potomnymi DataContracts, a następnie serializuje je za pomocą jednego z Serializerów/Formaterów WCF, a następnie sprawdza, czy wszystkie dane zostały przeniesione.

Ktoś?

Odpowiedz

9

To dość proste, aby użyć DataContractSerializer do serializowania obiektu do MemoryStream, a następnie przekształcić go z powrotem w istniejącą instancję.

Oto klasa, która demonstruje to w obie serializacji:

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; 
    } 
} 

Dwa zadania, które są odpowiedzialne za:

  • wypełniania instancji w pierwszej kolejności z danych zmysłowych. Możesz użyć odbicia, aby ustawić właściwości lub dostarczyć konstruktorowi jego argumenty, ale odkryłem, że to podejście nie zadziała tylko dla niewiarygodnie prostych typów.
  • Porównywanie dwóch instancji po zakończeniu cyklu de/serializacji. Jeśli masz pewną implementację Equals/GetHashCode, możesz to już zrobić. Ponownie możesz spróbować użyć generycznego porównywalnego współczynnika odbicia, ale może to nie być całkowicie niezawodne.
+0

Po przejściu testu obiektu kontraktu danych za pomocą powyższej metody, próbowałem użyć rzeczywistej implementacji klient/serwer i nadal otrzymałem następujący komunikat: "Strumień wejściowy zawiera elementy kolekcji, które nie mogą być dodane, jeśli instancja jest pusta ". Masz pomysł, jak to przetrwać test? – slolife

+0

@lolife, musisz upewnić się, że 'obj', który przechodzisz do testu jednostki, zawiera te same elementy w kolekcji, ponieważ powodują one problem, który widzisz. Wzmianka o wartości 'null' w błędzie sugeruje, że twoja kolekcja nie została zainicjowana z jakiegoś powodu. Jeśli nadal utkniesz, jako nowe pytanie z dodatkowymi informacjami (i link do niego tutaj, jeśli chcesz). –

+0

Dziękuję za tę odpowiedź! Można go łatwo przystosować do serializacji Json za pomocą DataContract ** Json ** Serializer – Sebastian

Powiązane problemy