Кто-нибудь создал инструмент тестирования DataContract? - PullRequest
12 голосов
/ 09 июня 2009

Кто-нибудь видел библиотеку, которая тестирует WCF DataContracts? Мотивация этого вопроса заключается в том, что я только что обнаружил ошибку в своем приложении, которая возникла из-за того, что я не аннотировал свойство атрибутом DataMember - в результате это свойство не сериализовалось.

Я имею в виду API, который, учитывая определенный тип DataContract, автоматически заполняет своих членов случайными данными, включая любые дочерние DataContracts, затем сериализует их через один из сериализаторов / форматировщиков WCF и затем проверяет данных было перенесено.

Любой

Ответы [ 2 ]

10 голосов
/ 10 июня 2009

Достаточно просто использовать DataContractSerializer, чтобы сериализовать ваш объект в MemoryStream, а затем десериализовать его обратно в существование как новый экземпляр.

Вот класс, демонстрирующий эту сериализацию в оба конца:

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

Две задачи, за которые вы отвечаете:

  • Заполнение экземпляра в первую очередь разумными данными. Вы можете использовать отражение для задания свойств или предоставить конструктору его аргументы, но я обнаружил, что этот подход просто не будет работать ни для чего, кроме невероятно простых типов.
  • Сравнение двух экземпляров после того, как вы в обе стороны де / сериализовали его. Если у вас есть надежная реализация Equals/GetHashCode, то это, возможно, уже сделано для вас. Опять же, вы можете попробовать использовать общий отражающий компаратор, но это может быть не совсем надежно.
0 голосов
/ 18 января 2013

Лучший подход: создать прокси, который сериализует / десериализует все аргументы при вызове метода. Код можно найти здесь: http://mkramar.blogspot.com/2013/01/unit-test-wcf-with-serialization.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...