有没有人创建过DataContract测试工具?

时间:2009-06-09 15:33:19

标签: wcf unit-testing

有没有人见过测试WCF DataContracts的库?问这个问题的动机是我刚刚在我的应用程序中发现了一个错误,该错误是由于我没有使用DataMember属性注释属性 - 因此,该属性未被序列化。

我想到的是一个API,在给定特定类型的DataContract的情况下,会自动使用随机数据(包括任何子DataContracts)填充其成员,然后通过其中一个WCF Serializers / Formatters对其进行序列化,然后检查所有数据已被传播。

任何?

2 个答案:

答案 0 :(得分:10)

使用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实施,那么可能已经为您完成了。您可以尝试使用通用的反射比较器,但这可能不完全可靠。

答案 1 :(得分:0)

更好的方法:创建一个代理,在调用方法时序列化/反序列化所有参数。代码可以在这里找到:http://mkramar.blogspot.com/2013/01/unit-test-wcf-with-serialization.html