23 votos

¿Cómo prueba unitaria si mi objeto es realmente serializable?

Estoy usando C# 2.0 con prueba Nunit. Tengo un objeto que debe serializarse. Estos objetos son bastante complejos (herencia en diferentes niveles y contiene una gran cantidad de objetos, eventos y delegados).

¿Cómo puedo crear una prueba unitaria para asegurarse que mi objeto es serializable con seguridad?

35voto

GeverGever Puntos 319

Aquí está una manera genérica:

public static Stream Serialize(object source)
{
    IFormatter formatter = new BinaryFormatter();
    Stream stream = new MemoryStream();
    formatter.Serialize(stream, source);
    return stream;
}

public static T Deserialize<T>(Stream stream)
{
    IFormatter formatter = new BinaryFormatter();
    stream.Position = 0;
    return (T)formatter.Deserialize(stream);
}

public static T Clone<T>(object source)
{
    return Deserialize<T>(Serialize(source));
}

13voto

Scott Weinstein Puntos 11404

Además de la prueba de sobre - que hace que el serializador aceptará su objeto, tienes que hacer una prueba de ida y vuelta. Deserializar los resultados a un nuevo objeto y asegúrese de que las dos instancias son equivalentes.

12voto

Patrick Desjardins Puntos 51478

Tengo esto en alguna prueba de unidad aquí en el trabajo:

MyComplexObject dto = new MyComplexObject();
MemoryStream mem = new MemoryStream();
BinaryFormatter b = new BinaryFormatter();
try
{
    b.Serialize(mem, dto);
}
catch (Exception ex)
{
    Assert.Fail(ex.Message);
}

Te podría ayudar... tal vez otro método puede ser mejor pero este funciona bien.

3voto

Steven A. Lowe Puntos 40596

serializar el objeto (en memoria o en disco), deserializarlo, utilizar la reflexión para comparar los dos, y luego ejecutar todas las pruebas de unidad para ese objeto nuevo (excepto la serialización de curso)

Esto supone que las pruebas de unidad pueden aceptar un objeto como un objetivo en lugar de hacer sus propias

1voto

Zaid Masud Puntos 4536

Aquí es una solución que recurrentemente utiliza IsSerializable para comprobar el objeto y sus propiedades son Serializable.

    private static void AssertThatTypeAndPropertiesAreSerializable(Type type)
    {
        // base case
        if (type.IsValueType || type == typeof(string)) return;

        Assert.IsTrue(type.IsSerializable, type + " must be marked [Serializable]");

        foreach (var propertyInfo in type.GetProperties(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance))
        {
            if (propertyInfo.PropertyType.IsGenericType)
            {
                foreach (var genericArgument in propertyInfo.PropertyType.GetGenericArguments())
                {
                    if (genericArgument == type) continue; // base case for circularly referenced properties
                    AssertThatTypeAndPropertiesAreSerializable(genericArgument);
                }
            }
            else if (propertyInfo.GetType() != type) // base case for circularly referenced properties
                AssertThatTypeAndPropertiesAreSerializable(propertyInfo.PropertyType);
        }
    }

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by: