【问题标题】:Has anyone created a DataContract testing tool?有没有人创建过 DataContract 测试工具?
【发布时间】:2023-03-12 15:19:01
【问题描述】:

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

我想到的是一个 API,给定特定类型的 DataContract,它会自动使用随机数据填充其成员,包括任何子 DataContract,然后通过 WCF 序列化程序/格式化程序之一对其进行序列化,然后检查所有的数据已被传递。

有人吗?

【问题讨论】:

    标签: wcf unit-testing


    【解决方案1】:

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

    【讨论】:

    • 使用上述方法通过数据合约对象测试后,我尝试使用真正的客户端/服务器实现,仍然得到以下消息:“输入流包含无法添加的集合项,如果实例为空”。知道这是如何通过测试的吗?
    • @slolife,您必须确保您传递给单元测试的obj 在该集合中包含与您所看到的问题相同类型的项目。错误中提到null 表明您的集合由于某种原因没有被初始化。如果您仍然卡住,作为一个新问题,提供更多信息(如果您愿意,可以在此处链接。)
    • 感谢您的回答!它可以通过使用 DataContractJsonSerializer 轻松适应 Json 序列化
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2011-06-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-07
      • 2020-09-23
      • 1970-01-01
      • 2021-04-09
      相关资源
      最近更新 更多