2009-06-09 6 views
11

¿Alguien ha visto una biblioteca que prueba WCF DataContracts? La motivación detrás de preguntar esto es que acabo de encontrar un error en mi aplicación que resultó de no anotar una propiedad con el atributo DataMember, como resultado, esa propiedad no se estaba serializando.¿Alguien ha creado una herramienta de prueba DataContract?

Lo que tengo en mente es una API que, dado un tipo particular de DataContract, completará automáticamente sus miembros con datos aleatorios, incluyendo cualquier DataContracts hijo, a continuación serialícelo a través de uno de los Serializadores/Formateadores WCF y luego verifique todos los datos han sido transmitidos.

¿Alguien?

Respuesta

9

Es bastante simple utilizar DataContractSerializer para serializar su objeto a un MemoryStream, luego deserializarlo de nuevo a la existencia como una nueva instancia.

Aquí es una clase que demuestra esta serialización de ida y vuelta:

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

Dos tareas que son responsables de:

  • Rellenar la instancia en el primer lugar con los datos sensibles. Puede optar por usar la reflexión para establecer propiedades o proporcionarle un constructor con sus argumentos, pero he descubierto que este enfoque no funcionará para nada más que tipos increíblemente simples.
  • Comparando las dos instancias después de que lo haya/serializado de ida y vuelta. Si tiene una implementación confiable Equals/GetHashCode, entonces eso ya podría estar hecho para usted. De nuevo, puede intentar usar un comparador reflexivo genérico, pero esto puede no ser completamente confiable.
+0

Después de pasar una prueba de objeto de contrato de datos usando el método anterior, intenté usar la implementación real de cliente/servidor y todavía recibí el siguiente mensaje: "La secuencia de entrada contiene elementos de colección que no pueden agregado si la instancia es nula ". ¿Alguna idea de cómo se está obteniendo a través de la prueba? – slolife

+0

@slolife, tendrá que asegurarse de que el 'obj' que está pasando a la prueba de la unidad contiene los mismos tipos de elementos en esa colección que están causando el problema que está viendo. La mención de 'null' en el error sugiere que su colección no se inicializa por algún motivo. Si todavía está atascado, como una nueva pregunta con más información (y enlace aquí si lo desea) –

+0

¡Gracias por esta respuesta! Se puede adaptar fácilmente para la serialización de Json mediante el uso de DataContract ** Json ** Serializer – Sebastian

Cuestiones relacionadas