有没有人见过测试WCF DataContracts的库?问这个问题的动机是我刚刚在我的应用程序中发现了一个错误,该错误是由于我没有使用DataMember属性注释属性 - 因此,该属性未被序列化。
我想到的是一个API,在给定特定类型的DataContract的情况下,会自动使用随机数据(包括任何子DataContracts)填充其成员,然后通过其中一个WCF Serializers / Formatters对其进行序列化,然后检查所有数据已被传播。
任何?
答案 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