Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Wcf 有人创建了DataContract测试工具吗?_Wcf_Unit Testing - Fatal编程技术网

Wcf 有人创建了DataContract测试工具吗?

Wcf 有人创建了DataContract测试工具吗?,wcf,unit-testing,Wcf,Unit Testing,有人见过测试WCF数据契约的库吗?问这个问题的动机是,我刚刚在我的应用程序中发现了一个bug,这是由于我没有用DataMember属性注释一个属性造成的——因此,该属性没有被序列化 我想到的是一个API,给定一种特定类型的DataContract,它将自动使用随机数据填充其成员,包括任何子DataContract,然后通过一个WCF序列化程序/格式化程序对其进行序列化,然后检查所有数据是否已被携带 有人吗?使用DataContractSerializer将对象序列化为MemoryStream,然

有人见过测试WCF数据契约的库吗?问这个问题的动机是,我刚刚在我的应用程序中发现了一个bug,这是由于我没有用DataMember属性注释一个属性造成的——因此,该属性没有被序列化

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


有人吗?

使用
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;
    }
}
公共静态类WcfTestHelper
{
/// 
///使用将对象序列化为
///内存,然后再次反序列化并返回结果。这很有用
///在测试中,验证对象是否可序列化,以及
///连载正确。
/// 
公共静态T DataContractSerializationRoundTrip(T obj)
{
返回DataContractSerializationRoundTrip(obj,null);
}
/// 
///使用将对象序列化为
///内存,然后再次反序列化并返回结果。这很有用
///在测试中,验证对象是否可序列化,以及
///连载正确。
/// 
公共静态T DataContractSerializationRoundTrip(T obj,
IEnumerable knownTypes)
{
var serializer=新的DataContractSerializer(obj.GetType(),knownTypes);
var memoryStream=新的memoryStream();
serializer.WriteObject(memoryStream,obj);
memoryStream.Position=0;
obj=(T)serializer.ReadObject(memoryStream);
返回obj;
}
}
您负责的两项任务:

  • 首先用合理的数据填充实例。您可以选择使用反射来设置属性或提供一个带有参数的构造函数,但我发现这种方法只适用于非常简单的类型
  • 在对两个实例进行往返反序列化/序列化后,对其进行比较。如果您有一个可靠的
    Equals/GetHashCode
    实现,那么这可能已经为您完成了。同样,您可以尝试使用通用反射比较器,但这可能并不完全可靠

更好的方法:创建一个代理,在调用方法时序列化/反序列化所有参数。代码可以在这里找到:

在使用上述方法通过了对数据契约对象的测试后,我尝试使用真正的客户机/服务器实现,但仍然得到以下消息:“输入流包含集合项,如果实例为null,则无法添加这些项”。你知道这是如何通过测试的吗?@slolife,你必须确保你进入单元测试的
obj
集合中包含的项目与你看到的导致问题的项目相同。错误中提到的
null
,表明您的收藏由于某种原因没有被初始化。如果您仍然无法回答,请将其作为一个包含更多信息的新问题(如果您愿意,请在此处链接)。谢谢您的回答!通过使用DataContractJsonSerializer,它可以很容易地适应Json序列化