viernes, 28 de enero de 2011

DataContracts and Constructors

Imaginemos el siguiente escenario, tengo una clase que será un DataContract utilizado en un método de un servicio WCF y queremos inicializar una variable de esta clase en el constructor.

namespace FooNamespace
{
[ServiceContract]
public interface Foo
{
[OperationContract]
void StartProcess(FooData dataEntrada);
}

[DataContract]
public class FooData
{
[DataMember]
public string FooProperty { get; set; }

protected string InitializedData {get; set;}

public FooData()
{
InitializedData = "Hello world!";
}
}
}


Bueno pues hemos de ser consciente que esa llamada al constructor no se llamará nunca durante la deserialización.



Por lo que si queremos simular esto podemos usar los Serialization Callbacks. De esta forma en el servidor podremos tener inicializada esa clase con el valor que queramos.



namespace FooNamespace
{
[ServiceContract]
public interface Foo
{
[OperationContract]
void StartProcess(FooData dataEntrada);
}

[DataContract]
public class FooData
{
[DataMember]
public string FooProperty { get; set; }

protected string InitializedData {get; set;}

[OnDeserializing]
public void Initialize(StreamingContext context)
{
InitializedData = "Hello world!";
}
}
}

jueves, 27 de enero de 2011

Data Contract Known Types

Hoy me he encontrado con un problemilla (bueno más que un problemilla era que desconocía la manera correcta de hacerlo) a la hora de desarrollar un sevicio WCF.

El problema era que quería construir un método que recibía por parametro un objeto de tipo x, pero quería ofrecer al cliente la opción de poder pasar como parámetro objetos derivados de tipo x que había construido. Yo habia declarado todas estas clases con el atributo [DataContract], pero parece ser que esto no era suficiente, sino que había que especificar en la clase base, que también podiamos pasar objetos derivados usando el atributo [KnownType(typeof(claseBase)]

Aquí va la solución:

using System;
using System.Runtime.Serialization;
using System.ServiceModel;

namespace FooNamespace
{
[ServiceContract]
public interface IFoo
{
[OperationContract]
void DoSomething(FooDataBase dataEntrada);
}

[DataContract]
[KnownType(typeof(FooDataDerived))]
public class FooDataBase
{
[DataMember]
public string FooProperty1 { get; set; }
}

[DataContract]
public class FooDataDerived:FooDataBase
{
[DataMember]
public string FooProperty2 { get; set; }
}
}

miércoles, 26 de enero de 2011

Unit Testing con Pex and Moles

Siguiendo la llamada de mi compañero Luis Ruiz, voy a entrar un poco en el mundo de Pex and Moles. A ver que es lo que me encuentro. Para ello empezaremos con una mini guia de tutoriales que voy a ir leyendo. Tal y como los vaya leyendo intentaré postear un pequeño resumen y las prácticas que voy realizando.

- Getting Started with Microsoft Pex and Moles: Aquí podemos ver lo que yo llamo un meta-tutorial, es decir, un tutorial de tutoriales, o más bien un tutorial que nos dice los siguientes pasos a realizar y que tutoriales podemos seguir.

En definitiva lo primero que deberiamos hacer es instalarnos Pex and Moles y continuar con otros tutoriales. Lo que me ha gustado es que nos muestra un conjunto de conceptos básicos sobre unit testing en forma de glosario de términos que puede ser muy útil para los neófitos, algunos de estos conceptos serian:

  • code coverage
  • integration test
  • mock
  • mole type
  • stub type

- Getting Started with Microsoft Code Contracts and Microsoft Pex: Este tutorial esta dividido en dos secciones, una primera en la que crearemos un proyecto en Visual Studio (una clase llamada StringExtensions con un método estático que devuelva un substring, desde el inicio hasta la primera aparición de otro string que nos pasen, también por parámetro) y ejecutamos lo que se conoce como Pex Explorations, esto lo que hace es ejecutar nuestro código muchas veces con diferentes valores de entrada, entonces se nos muestra una tabla con las diferentes salidas o excepciones de nuestro código. Para hacer eso sólo tendremos que hacer botón derecho en la función que queramos probar y hacer click en Run Pex.

image

Vemos que lo que hace Pex es intentar crear diferentes combinaciones de parámetros de entrada para cubrir la mayor parte de nuestro código. Entonces hace diferentes llamadas a nuestro método, pasándole como parámetros los que ha calculado, acto seguido nos muestra una tabla con estos resultados.

image