jueves, 31 de mayo de 2012

Usando Pruebas Unitarias en Visual Studio - Chapter 1

Hola amigos,

En las próximas días/semanas/meses/años/lustros... voy a hablaros del tema de las pruebas en visual studio, no quiere decir que solo publique sobre esto, pero si que es verdad  que para mi es una asignatura pendiente que tengo siempre ahí, y es la mejora de calidad y robustez de las aplicaciones que desarrollo.

La vida como programador me ha demostrado que nunca todas las pruebas son suficientes, que siempre hay millones de flujos, que siempre va a llegar alguien y le va a dar al botón que tu le diste 100 veces en otro orden y que la aplicación petará o "HASSSEEE PAAAAM!!!!" en algún sitio.

En este caso hay metodologías, técnica, herramientas... como presentación a está sección voy a hablaros sobre una herramienta, que seguramente todos los que leemos este foro conocemos, pero que muchos no aprovechamos todo lo que nos ofrece y es "Visual Studio" TACHAAAAAN!! que sorprendidos? Pues visual studio tiene una herramienta potentisima para por ejemplo hacer pruebas unitarias.

Para ver como funciona a modo básico (iremos ampliando en próximos post) vamos a crear una pequeña aplicación de consola en visual estudio y vamos a pegar el código siguiente:

 private string HelloWorldTest(string name)
        {
            name = "Bienvenido " + name;
            return name;
        }

Después de está maravilla de código mis neuronas han quedado destrozadas, y no me apetece pensar que tengo que probar, ya que el código tiene una complejidad que me requeriría pensar durante un par de semanas como probarlo, así que voy a darle al botón derecho sobre la definición de la función,
voy a pulsar crear pruebas unitarias en el cuadro de dialogo vamos a pulsar aceptar en próximos post iremos avanzando las configuraciones, le damos un nombre al proyecto que va a crear y pulsamos el botón crear.



 Una vez generado nos muestra el método de  test, si os dais gueta, se definene las variables espected, y name, y en el assert equeal se comparan los resultados, si ejecutamos en este momento esto nos generará un error.

        /// <summary>        /// Una prueba de HelloWorldTest        ///</summary>        [TestMethod()]
        [DeploymentItem("WFFortTestingUnitTEst.exe")]
        public void HelloWorldTestTest()
        {
            Form1_Accessor target = new Form1_Accessor(); // TODO: Inicializar en un valor adecuado
            string name = string.Empty; // TODO: Inicializar en un valor adecuado            string expected = string.Empty; // TODO: Inicializar en un valor adecuado            string actual;
            actual = target.HelloWorldTest(name);
            Assert.AreEqual(expected, actual);
            Assert.Inconclusive("Compruebe la exactitud de este método de prueba.");
        }

 Es te error viene provocado porque si le estamos pasando cadena vacía, el método dice que debería ser, vacía pero no es así, nuestra funcion debolvería "Bienvenido ", por lo que para que nos de un resultado positivo y nos muestre la ventana de resultados en verde, debemos cambiar el expecte a como sigue:

string expected = "Bienvenido ";

Beuno esto es todo por hoy, seguiremos avanzando en próximos días.

WS3 en visual studio 2010

Hola Amigos,

En un proyecto reciente era necesario conectar a los servicios de Oracle CRM On Demand (OCOD) , del tipo WS3 que son en este caso los que se encuentran en la sección de Administrative services me encontré que el modo de conexión no es el mismo que para WebServices 2.0, en concreto necesitaba utilizar el de SalesAssessmentTemplateService la dirección a la que hace referencia el endpoint es algo como lo siguiente:

../Services/cte/SalesAssessmentTemplateService

Este tipo de servicios así como el cascading dropdown ... etc, tienen un problema y es ue como tales no pueden ser utilizados por Visual Studio 2010







 
El problema se me presentaba en que la aplicación iba a ser desarrollada en VS10 y utilizaba otros servicios del contenedor 2.0, que si que usan la autentificación aceptada por VS10. Así que tras 1 día indagando, primero porque el error que daba no era demasiado descriptivo al principio:

ERROR: Server?

Investigando la traza nos dimos cuenta que es que utilizaba el protocolo WS3.

Para solucionarlo es necesario hacer un WorkAround que a mi personal mente no me gustan este tipo de chapuzas a no ser que sean necesarias (En este caso lo es) que os explico a continuación:

1. Descargar el WSE 3.0 para visual studio e instalarlo.
2. En la carpeta C:\ProgramData\Microsoft\MSEnvShared\Addins buscar el fichero WSESettingsVS3.Addin y abrirlo.
3. Buscar la secciones donde ponga <Version>8.0</Version> y cambiarlas por <Version>10.0</Version>
4. Abrir Visual Studio seleccionar Herramientas > Opciones > Entornos Y comprobar que se ha agregado correctamente, en caso contrario reiniciar visual estudio.

Una vez importado el WDSL del servicio tenemos que irnos a la clase que ha generado, y cambiar la herencia que VS pone por defecto

System.Web.Services.Protocols.SoapHttpClientProtocol

Cambiarla por

Microsoft.Web.Services3.WebServicesClientProtocol

Ahora ya toca disfrutar ya no aparecerá el error tan descriptivo y maravilloso de "Server", podremos conectarnos y lanzar las operaciones.

PD: esta solución sirve para cualquier tipo de servicio que utilice WSE 3.0

Gestionar Fechas UTC en MSCRM 2011

Hola Amigos,

Hoy me he encontrado con un problema, el escenario es el siguiente:

CRM 2011, SQL SERVER 2008, Aplicación ASP.NET que realiza consultas a la Base de datos del CRM.

Pues bien, resulta que se cargaron datos del cliente antiguos a su nuevo sistema CRM, en estos datos teníamos actividades, de las cuales solo se guarda la fecha, por lo que en el hipotético caso que hiciéramos una visita ayer se pasaría  a MSCRM 2011 la fecha 28/05/2012. Hasta aqui todo normal, se carga correctamente en el CRM y si la buscamos, se muestra correctamente.

Ahora viene lo bueno, al tener una aplicación .NET que consulta directa mente en la base de datos sin utilizar los servicios para mostrar reports, está obtiene los datos guardados en la BBDD, y aquí está la chicha, MSCRM 2011 guarda la fecha UTC así que en lugar de guardar y aparecer 28/05/2012 00:00:00 en base de datos se guarda 27/05/2012 22:00:00.

¿Porque? pues esto está pensado para que realmente cuando tu conectes desde cualquier franja horaria del mundo te diga a que hora local tuya se realizo la operación, en este caso la actividad.

Al tener en España ahora mismo GTM + 2 el le resta a la fecha 2 horas, que al venir sin hora informada el interpreta que son las 12 de la noche exactamente.

Volviendo a la aplicación de reports en asp .net, al buscar entre dos fechas en este caso entre el 28/05/2012 y el 29/05/2012 no encontraba nada porque claro buscaba con la fecha de BBDD y no existía nada,  he solucionado este problema de una forma elegante y que funcionaría en cualquier horario, ya sea invierno y verano, haciendo lo siguiente en SQL, si lo haces directa mente en la consulta:

DATEADD(hh, DATEDIFF(hh, GETUTCDATE(), GETDATE()), FECHA_A_RECUPERAR)

Para C# lo explicaremos en el siguiente post.

martes, 24 de abril de 2012

Desarrollando C#

Hola amigos,

Ponemos en marcha la creación de este blog donde recogere las cosas que me resulten interesantes sobre la programación en .NET y en especial en C# que me vaya encontrando en mi día a día como programador, así como cosas que recuerde me han ocurrido en mis muchos años de Experiencia.