<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://andorradotnet.com/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Crossposting from IdeSeg.com</title><link>http://andorradotnet.com/blogs/csegura/default.aspx</link><description /><dc:language /><generator>CommunityServer 2007 SP2 (Build: 20611.960)</generator><item><title>Testeo unitario para SharePoint: La importancia de llamarse "Test" </title><link>http://andorradotnet.com/blogs/csegura/archive/2008/12/01/testeo-unitario-para-sharepoint-la-importancia-de-llamarse-quot-test-quot.aspx</link><pubDate>Tue, 02 Dec 2008 03:34:49 GMT</pubDate><guid isPermaLink="false">b0fcac78-2c75-4423-8c0a-4c16f1829272:396</guid><dc:creator>csegura</dc:creator><slash:comments>0</slash:comments><description>&lt;p&gt;Testing es algo que todos los desarrolladores deberíamos hacer, y muy pocos hacen. Por no decir “&lt;strong&gt;Testing intensivo y consecuente&lt;/strong&gt;”, pues los números se reducen a prácticamente cero... si le da curiosidad, revise las estadísticas mostradas en:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.methodsandtools.com/dynpoll/oldpoll.php?UnitTest2"&gt;http://www.methodsandtools.com/dynpoll/oldpoll.php?UnitTest2&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://blog.davebouwman.net/2008/06/04/DeveloperSurveyUnitTestingAmpOtherTools.aspx"&gt;http://blog.davebouwman.net/2008/06/04/DeveloperSurveyUnitTestingAmpOtherTools.aspx&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;&lt;a href="http://telerikwatch.com/2008/05/survey-says-unit-testing-still-not.html"&gt;http://telerikwatch.com/2008/05/survey-says-unit-testing-still-not.html&lt;/a&gt;. &lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;Especialmente el segundo vinculo es interesante, aunque por experiencia propia me arriesgaría a decir que los porcentajes de aplicación de testeo son mucho, mucho mas bajos.&lt;/p&gt;
&lt;p&gt;Siendo sincero, escribir software es una de las cosas más divertidas para hacer en el mundo (lo digo por deformación profesional, probablemente), pero hacer pruebas para ese mismo software es una de las más aburridas. Y en algunos casos, es simplemente imposible, como lo es hacer pruebas para SharePoint. &lt;/p&gt;
&lt;p&gt;Pero para comenzar por el principio, hay que hablar algo sobre testing en general.&lt;/p&gt;
&lt;p&gt;El mundo del testing es amplio y ajeno: hay tantos tipos de testeo como tipos de desarrolladores... pero mirándolo desde una perspectiva global, podemos decir que hay:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;- “Unit Test” (Prueba unitaria)&lt;/strong&gt; – verifica que las unidades individuales de código fuente funcionan como se espera. Normalmente la unidad de código más pequeña es una función, método o propiedad.&lt;br /&gt;- &lt;strong&gt;“Regression Test” (Pruebas de regresión)&lt;/strong&gt; – Cuando se modifica algo que ya ha sido probado que funciona (con el Unit Test), es necesario garantizar que sigue funcionando apropiadamente después de algún tiempo: este es el trabajo de Regression Test&lt;br /&gt;- &lt;strong&gt;“Integration Test” (Pruebas de Integración)&lt;/strong&gt; – Cuando todas las unidades (que ya han sido probadas con Unit y Regression Test) se unen para trabajar conjuntamente, es necesario garantizar que todas funcionen como una unidad apropiadamente. Este es el trabajo del Integration Test&lt;br /&gt;- &lt;strong&gt;“System Integration Test” (Pruebas de Integración de sistemas) &lt;/strong&gt;– puede ser visto como una ampliación del anterior: este test garantiza que nuestro sistema (que ya ha sido probado con Unit, Regression e Integration Tests) puede funcionar con otros sistemas externos apropiadamente&lt;/p&gt;
&lt;p&gt;En cuanto a metodologías, mis dos hermanas sicólogas me enseñaron que hay tres tipos de pruebas: Black Box, White Box y Grey Box testing (el modelo ha sido tomado “prestado” de la psicología).&lt;/p&gt;
&lt;p&gt;- &lt;strong&gt;“Black Box Testing”&lt;/strong&gt; – la prueba no sabe nada sobre cómo funciona internamente el sistema a probar... solamente que si se le entregan algunos parámetros de entrada, deben salir algunos resultados. Black Box Testing le entrega parámetros a una función (correctos e incorrectos) y observa los resultados que la función devuelve&lt;br /&gt;- &lt;strong&gt;“White Box Testing”&lt;/strong&gt; – por el contrario, la prueba conoce perfectamente el funcionamiento interno del sistema a probar, y crea las pruebas basado en el.&lt;br /&gt;-&lt;strong&gt; “Grey Box Testing”&lt;/strong&gt; – ya se imaginaran lo que es, una mezcla de los dos.&lt;/p&gt;
&lt;p&gt;Finalmente, es necesario hablar de algo que está de moda, “Test-driven development” (TDD). Esta es una técnica de programación basada en escenarios de prueba o de funcionamiento (Test o User Cases), bastante ligada a metodologías de desarrollo como Agiles, que indica que primero hay que hacer el diseño del software (sus clases, métodos, propiedades y eventos), luego generar las definiciones (el “esqueleto” del código), luego crear los métodos de prueba ANTES que el código mismo, y finalmente, crear el código para rellenar el esqueleto.&lt;/p&gt;
&lt;p&gt;Bien, esto es más o menos la parte teórica. Como los desarrolladores de código que somos, ¿Qué es lo importante de todo esto?&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Primero que todo, y antes que nada, Unit Test. Unit Test me permite dormir tranquilo, pues me asegura que mi código funciona correctamente y seguirá funcionando después de que lo he modificado (¿se puede usar Unit Test como Regression Test? Esta es una discusión bizantina a la que nunca nadie llega a una conclusión, algo por el estilo a que es mejor CSharp o Visual Basic, o Windows o Linux. Vea por la ejemplo la discusión que surgió en el ultimo PDC al respecto en &lt;a href="http://channel9.msdn.com/pdc2008/TL61/"&gt;http://channel9.msdn.com/pdc2008/TL61/&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;Como segunda medida, si se está usando (o se quiere usar) TDD, la decisión de usar Black o White Test es importante... o, mejor dicho, si se quiere usar TDD, hay que usar Black Box Testing. Punto. O hay que iniciar una nueva discusión bizantina sobre si es posible iniciar el desarrollo en Black Box y luego continuarlo en White Box, lo que lleva al modelo de Grey Box...&lt;/li&gt;&lt;/ol&gt;
&lt;p&gt;Noten que hasta ahora he intentado no tomar partido por ninguno de los puntos mencionados. Todo porque mi punto es SharePoint, no discusiones teológicas sobre cómo, cuando y donde hacer testeo de software. Pero llegamos a la parte interesante: &lt;strong&gt;SharePoint.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Cuando se trata de crear Testeo Unitario para software creado por uno mismo, es decir, en donde se tiene el código fuente, construir las clases de prueba es largo y tedioso, pero es posible de hacer con las herramientas estándar para el efecto (como las que tiene Visual Studio mismo, por ejemplo). Cuando lo que se desea es testear código que utiliza el Modelo de Objetos de otro programa, como ocurre cuando se escribe software para SharePoint o cualquier otro servidor (&lt;em&gt;SQL, Exchange, BizTalk, etc&lt;/em&gt;), es necesario “hacerle creer” a nuestro código que esta interactuando con el servidor, pero sin que lo haga en realidad, porque no se desean tener dependencias con él.&lt;/p&gt;
&lt;p&gt;Imagínese una situación no tan hipotética: se crea un método que comprueba los derechos de una Librería de SharePoint; si se utiliza una instalación real de SharePoint para hacer las pruebas, es necesario mantener esa configuración por todo el tiempo del desarrollo y mas allá para garantizar que los resultados de las pruebas sean consistentes en el tiempo. Peor aún, todos los desarrolladores del grupo tienen que disponer de la misma instalación para que sus pruebas también sean consistentes entre desarrolladores. Esto es prácticamente imposible de conseguir y, además, muy engorroso. Para solucionar el problema existen diferentes tipos de herramientas que “falsifican” el Modelo de Objetos del servidor (Mockers, Stubbers, etc)&lt;/p&gt;
&lt;p&gt;Como ya hemos dicho varias veces Carlos y yo, el problema con SharePoint y Unit Test es que el Modelo de Objetos de SharePoint tiene muchas clases selladas o sin constructor público. Este ha sido el gran problema hasta ahora para poder usar Mockers y Stubbers, pues ellos no saben qué hacer con un objeto sellado o sin constructor público. El posting “&lt;a href="http://www.ideseg.com/TesteoUnitarioParaSharePointAcercandoseALaRespuestaDefinitivaParte1.aspx"&gt;Testeo Unitario para SharePoint: acercándose a la respuesta definitiva – parte 1&lt;/a&gt;”&amp;nbsp;que escribimos anteriormente comenzó a mostrar cómo se puede iniciar el testeo unitario para SharePoint usando la última versión de &lt;a href="http://www.typemock.com"&gt;TypeMock&lt;/a&gt;. Las próximas partes continuaran con la parte práctica de la creación y codificación de las clases de prueba. Pero en esta segunda parte &lt;strong&gt;se trata de discutir la importancia de Unit Test, Regression Test, Black y White Box Testing y TDD&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Uno de las características más importantes de &lt;a href="http://www.typemock.com"&gt;TypeMock&lt;/a&gt; es la relación intrínseca entre el código de trabajo y el código de testeo, es decir, el fabricante ha escogido por un modelo de “White Box Testing”. Veamos un ejemplo el ejemplo de una función que simplemente imprime los elementos de una Lista de SharePoint:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Código de trabajo:&lt;/strong&gt;&lt;br /&gt;&lt;pre class="csharpcode"&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; GetCollection01()
        {
            SPSite mySite = &lt;span class="kwrd"&gt;new&lt;/span&gt; SPSite(&lt;span class="str"&gt;&amp;quot;http://wsses&amp;quot;&lt;/span&gt;);

            &lt;span class="kwrd"&gt;using&lt;/span&gt; (SPWeb myWeb = mySite.OpenWeb())
            {
                &lt;span class="kwrd"&gt;foreach&lt;/span&gt; (SPList myList &lt;span class="kwrd"&gt;in&lt;/span&gt; myWeb.Lists)
                {
                    &lt;span class="kwrd"&gt;foreach&lt;/span&gt; (SPItem myItem &lt;span class="kwrd"&gt;in&lt;/span&gt; myList.Items)
                    {
                        Console.WriteLine(mySite.Url + &lt;span class="str"&gt;&amp;quot; - &amp;quot;&lt;/span&gt; + myWeb.Title + &lt;span class="str"&gt;&amp;quot; - &amp;quot;&lt;/span&gt; + myList.Title + &lt;span class="str"&gt;&amp;quot; - &amp;quot;&lt;/span&gt; + myItem.ID.ToString());
                    }
                }
            }
        }
&lt;/pre&gt;&lt;strong&gt;&lt;br /&gt;Código de Prueba:&lt;br /&gt;&lt;/strong&gt;&lt;pre class="csharpcode"&gt;        [TestMethod()]
        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; GetCollection01Test()
        {
            SPWeb fakeWeb = Isolate.Fake.Instance&amp;lt;SPWeb&amp;gt;(Members.ReturnRecursiveFakes);
            SPList fakeList = Isolate.Fake.Instance&amp;lt;SPList&amp;gt;(Members.ReturnRecursiveFakes);
            SPItem fakeItem01 = Isolate.Fake.Instance&amp;lt;SPItem&amp;gt;(Members.ReturnRecursiveFakes);

            &lt;span class="kwrd"&gt;using&lt;/span&gt; (var recorder = RecorderManager.StartRecording())
            {
                SPSite myFakeSite = &lt;span class="kwrd"&gt;new&lt;/span&gt; SPSite(&lt;span class="str"&gt;&amp;quot;&amp;quot;&lt;/span&gt;);
                recorder.ExpectAndReturn(myFakeSite.Url, &lt;span class="str"&gt;&amp;quot;fakeSiteUrl&amp;quot;&lt;/span&gt;).RepeatAlways(); 
                recorder.ExpectAndReturn(myFakeSite.OpenWeb(), fakeWeb);
            }

            Isolate.WhenCalled(() =&amp;gt; fakeWeb.Title).WillReturn(&lt;span class="str"&gt;&amp;quot;fakeWeb&amp;quot;&lt;/span&gt;);
            Isolate.WhenCalled(() =&amp;gt; fakeWeb.Lists[2].Title).WillReturn(&lt;span class="str"&gt;&amp;quot;fakeList&amp;quot;&lt;/span&gt;);
            Isolate.WhenCalled(() =&amp;gt; fakeItem01.ID).WillReturn(1);

            Isolate.WhenCalled(() =&amp;gt; fakeWeb.Lists[2].Items).WillReturnCollectionValuesOf(&lt;span class="kwrd"&gt;new&lt;/span&gt; List&amp;lt;SPItem&amp;gt;
               {
                    fakeItem01
               });

            Class1 target = &lt;span class="kwrd"&gt;new&lt;/span&gt; Class1();
            target.GetCollection01();

            var fakeItemList = fakeWeb.Lists[2].Items;

            &lt;span class="kwrd"&gt;foreach&lt;/span&gt; (SPItem item &lt;span class="kwrd"&gt;in&lt;/span&gt; fakeItemList)
            {
                Isolate.Verify.WasCalledWithAnyArguments(() =&amp;gt; item.ID);
            }
        }
&lt;/pre&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;Para la prueba unitaria se está usando una combinación de “Natural Mocks” y el nuevo “AAA API” de TypeMocks. Observe un par de puntos específicos:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Cada objeto “real” necesita un objeto “mockeado”: myWeb -&amp;gt; fakeWeb, myList -&amp;gt; fakeList, etc&lt;/li&gt;
&lt;li&gt;Para cinco líneas de código de trabajo se necesitan 17 líneas de código de prueba&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Esto conlleva las siguientes consecuencias generales:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Para poder crear un objeto “fantasma” (un mock) que sustituya efectivamente al objeto “real” en la clase de trabajo, es necesario conocer explícitamente su construcción. &lt;strong&gt;&lt;font color="#a52a2a"&gt;Esto excluye directamente la utilización de TDD: código de prueba debe ser escrito antes del código de trabajo&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Una consecuencia de esta consecuencia es que el código unitario deberá ser escrito por el desarrollador mismo que está escribiendo el código de trabajo: al final, es él/ella el que sabe que está haciendo. El peligro con esta construcción es que se van a escribir clases de prueba que casi siempre van a pasar el examen... voluntaria o involuntariamente, el desarrollador va a omitir las pruebas que tienen más posibilidades de fallar&lt;/li&gt;
&lt;li&gt;Una segunda consecuencia de esta consecuencia es que el desarrollador probablemente utilizara más tiempo creando las clases de prueba que las clases de trabajo&lt;/li&gt;
&lt;li&gt;Por la relación tan estrecha entre código de trabajo y de prueba, cuando se modifica algo en el código de trabajo, hay que modificar también el código de prueba. &lt;strong&gt;Es decir, Regression Test es imposible de realizar&lt;/strong&gt;&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;El fabricante de &lt;strong&gt;TypeMocks&lt;/strong&gt; está trabajando intensivamente para darle solución a estos problemas, y los primeros resultados van saliendo: ciertas partes del Framework de TypeMocks es capaz de crear mocks para trabajar con Black Box Testing, es decir, entregando un objeto “mockeado” al método de trabajo y revisando los resultados producidos, sin tener conocimientos de su funcionamiento interno.&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;En cualquier caso, la discusión de si testeo blanco o negro es el mejor, o si Test-Driven Development es realmente valido continuaran hasta el fin de los siglos&lt;/strong&gt;. Lo importante para nosotros, los que estamos metidos en el lio de hacer que código funcione apropiadamente no son las discusiones teóricas, sino los Frameworks que nos permitan trabajar confortablemente. TypeMocks es hasta el momento lo que más se acerca a una solución viable para hacer testeo de código de SharePoint, así que vale más que la pena de darle por lo menos una mirada e intentar hacerlo funcionar.&lt;br /&gt;&lt;/p&gt;&lt;img width="0" height="0" src="http://www.ideseg.com/cptrk.ashx?id=561f5dba-d5ac-40d5-830c-1dafcbadeb34" alt="" /&gt;&lt;img src="http://andorradotnet.com/aggbug.aspx?PostID=396" width="1" height="1"&gt;</description><category domain="http://andorradotnet.com/blogs/csegura/archive/tags/SharePoint/default.aspx">SharePoint</category></item><item><title>Drupal and SharePoint. Dos formas de hacer una tortilla (charla en Navarra)</title><link>http://andorradotnet.com/blogs/csegura/archive/2008/12/01/drupal-and-sharepoint-dos-formas-de-hacer-una-tortilla-charla-en-navarra.aspx</link><pubDate>Mon, 01 Dec 2008 21:10:30 GMT</pubDate><guid isPermaLink="false">b0fcac78-2c75-4423-8c0a-4c16f1829272:395</guid><dc:creator>csegura</dc:creator><slash:comments>0</slash:comments><description>&lt;p&gt;El próximo día 18 de diciembre tendremos en el Grupo de Usuarios de Navarra la charla (&lt;strong&gt;de los huevos y de los CKarlos&lt;/strong&gt;), Karlos G. Liberal y un servidor hablaremos de algunas de las&amp;nbsp;bondades&amp;nbsp;de nuestras herramientas de trabajo (Drupal y SharePoint).&lt;/p&gt;
&lt;p&gt;El magnifico cartel ha sido realizado por nuestros amigos de &lt;a href="http://www.sistemaformacion.com/"&gt;Sistema Formación&lt;/a&gt;. &lt;/p&gt;
&lt;p&gt;&lt;img src="http://www.ideseg.com/content/binary/carteldotnet_final.jpg" border="0" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;La Agenda del evento es la siguiente:&lt;/p&gt;
&lt;p&gt;La jornada será el jueves, 18 de diciembre&lt;br /&gt;Hora de recepción: 18:00&lt;/p&gt;
&lt;p&gt;&lt;a title="ces" href="http://www.cesnavarra.net/"&gt;&lt;strong&gt;Centros de Excelencia Software&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;Salón de actos&lt;br /&gt;Plaza Cein, 1, Polígono Mocholi&lt;br /&gt;Noáin Navarra 31110&lt;br /&gt;España &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;AGENDA&lt;br /&gt;&lt;/strong&gt;18:30 - 19:30: &lt;strong&gt;Drupal and SharePoint. Dos formas de hacer una tortilla. Los CKarlos&lt;/strong&gt;.&lt;br /&gt;19:30 - 20:00: &lt;font color="#a52a2a"&gt;&lt;strong&gt;Celebración 2º aniversario de NavarraDotNet: zorionak zuri y tarta de cumpleaños&lt;/strong&gt;&lt;/font&gt;&lt;br /&gt;20:00 - 21:00: &lt;strong&gt;Drupal and SharePoint. Dos formas de hacer una tortilla. Los CKarlos&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;&lt;u&gt;21:00 - ... : Cena!&lt;/u&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Para apuntarse podéis hacerlos desde este enlace*&lt;br /&gt;&lt;a title="http://msevents.microsoft.com/CUI/EventDetail.aspx?EventID=1032393640&amp;amp;Culture=es-ES" href="http://msevents.microsoft.com/CUI/EventDetail.aspx?EventID=1032393640&amp;amp;Culture=es-ES"&gt;http://msevents.microsoft.com/CUI/EventDetail.aspx?EventID=1032393640&amp;amp;Culture=es-ES&lt;/a&gt;&lt;/p&gt;&lt;img width="0" height="0" src="http://www.ideseg.com/cptrk.ashx?id=ad0d8c65-6941-4761-8f1d-80221d8758ce" alt="" /&gt;&lt;img src="http://andorradotnet.com/aggbug.aspx?PostID=395" width="1" height="1"&gt;</description><category domain="http://andorradotnet.com/blogs/csegura/archive/tags/SharePoint/default.aspx">SharePoint</category></item><item><title>Cenando, Buenas Practicas, Historia de terror</title><link>http://andorradotnet.com/blogs/csegura/archive/2008/11/28/cenando-buenas-practicas-historia-de-terror.aspx</link><pubDate>Fri, 28 Nov 2008 20:36:06 GMT</pubDate><guid isPermaLink="false">b0fcac78-2c75-4423-8c0a-4c16f1829272:392</guid><dc:creator>csegura</dc:creator><slash:comments>0</slash:comments><description>&lt;p&gt;&lt;strong&gt;Cenando&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;El otro día paso &lt;strong&gt;&lt;a href="http://geeks.ms/blogs/unai/Default.aspx"&gt;Unai&lt;/a&gt;&lt;/strong&gt; por Pamplona y estuvimos cenando y departiendo sobre todas esas cosas frikis que nos gustan. Una suerte para los que habéis podido asistir a los cursos que ha impartido de Entity Framework&amp;nbsp; y WCF.&lt;br /&gt;&lt;br /&gt;Durante la cena, [[degustábamos unos “Penne Arrabiata” (&lt;em&gt;no seáis mal pensados, que son macarrones con tomate un poco picante&lt;/em&gt;) y un “Ochoa Tempranillo” (recomendado)]], hablamos de; libros, de código, de más código, de bugs, de depuración, de tecnología, del bien y del mal (lo típico), no sé si ayer hablamos de sexo (no me acuerdo, pero con el frio que hacía es posible que no :-).&lt;br /&gt;&lt;br /&gt;Bueno, la cosa es que le comenté algunas de las cositas del Api de SharePoint. &lt;br /&gt;&lt;br /&gt;&lt;strong&gt;¿Buenas Prácticas?&lt;br /&gt;&lt;/strong&gt;&lt;br /&gt;Como ya he contado en alguna ocasión, las colecciones de SharePoint, son a la antigua usanza (Net 1.0), es decir que implementan IEnumerable, en una clase contenida, esto lo hacen en una clase abstracta SPBaseCollection del cual heredan el resto de colecciones de SP.&lt;br /&gt;&lt;br /&gt;Bien, hasta el momento no hay mucho problema, es un tema de diseño, necesario para implementar las serializaciones de los objetos además de la persistencia que realiza sharepoint via COM.&lt;br /&gt;&lt;br /&gt;Si realicemos una consulta usando SPQuery, (SPQuery nos permite recuperar elementos de una lista usando CAML, que es un meta-lenguaje basado en XML que tiene SharePoint para muchas cosas, entre ellas recuperar elementos de las listas)&lt;/p&gt;&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Where&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Geq&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;FieldRef&lt;/span&gt; &lt;span class="attr"&gt;Name&lt;/span&gt;=”&lt;span class="attr"&gt;ID&lt;/span&gt;” &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Value&lt;/span&gt; &lt;span class="attr"&gt;Type&lt;/span&gt;=”&lt;span class="attr"&gt;Integer&lt;/span&gt;”&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;10&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Value&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Geq&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Where&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;Nos devolverá todos los elementos de una lista donde el ID sea mayor que 10.&lt;br /&gt;&lt;br /&gt;Para poder ejecutar una consulta CAML sobre una lista tenemos una clase llamada &lt;strong&gt;SPQuery&lt;/strong&gt; a través de la cual montamos la consulta.&lt;br /&gt;&lt;br /&gt;&lt;pre class="csharpcode"&gt;SPQuery query = &lt;span class="kwrd"&gt;new&lt;/span&gt; SPQuery
                {
                   Query = &lt;span class="str"&gt;&amp;quot;CONSULTITA EN CAML&amp;quot;&lt;/span&gt;
                };&lt;/pre&gt;&lt;br /&gt;Para recuperar una colección de Items que cumplen esta consulta basta con indicar a la lista los items que queremos pasandole un SPQuery:&lt;br /&gt;&lt;pre class="csharpcode"&gt;SPListItemCollection ítems = lista.GetItems(query);&lt;/pre&gt;Bien, como muchos ya sabéis que no es muy buena práctica devolver null, para no tener que comprobar si ítems es null antes de acceder, de modo que lo correcto es devolver una colección vacía (en este caso, como veremos luego tiene otro fundamento).&lt;br /&gt;&lt;br /&gt;GetItems internamente nos devuelve una nueva colección &lt;br /&gt;&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; SPListItemCollection GetItems(SPQuery query)
{
    &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="kwrd"&gt;new&lt;/span&gt; SPListItemCollection(&lt;span class="kwrd"&gt;this&lt;/span&gt;, query);
} 
&lt;/pre&gt;&lt;br /&gt;
&lt;p&gt;Pero qué pasa si la consulta está mal formada ó es incompleta.&amp;nbsp; Lo que cabe de esperar es:&lt;br /&gt;&lt;br /&gt;1.-&amp;nbsp;Que nos devuelva una excepción en el momento de crear SPQuery (&lt;strong&gt;cosa que no hace&lt;/strong&gt;)&lt;br /&gt;2.-&amp;nbsp;Que nos ofrezca una propiedad o algo para comprobar si la consulta es correcta (&lt;strong&gt;cosa que no hace&lt;/strong&gt;)&lt;br /&gt;3.- Que nos devuelva una colección vacía (&lt;strong&gt;cosa que hace peligrosamente a medias&lt;/strong&gt;)&lt;br /&gt;&lt;br /&gt;¿Por qué lo hace a medias? Porque aparentemente nos devuelve una colección vacía, es decir si la consulta está mal, ítems no es null. &lt;strong&gt;Pero OJO no es una colección valida&lt;/strong&gt;.&lt;br /&gt;&lt;pre class="csharpcode"&gt;SPQuery query = &lt;span class="kwrd"&gt;new&lt;/span&gt; SPQuery
                {
                        Query = &lt;span class="str"&gt;&amp;quot;MI mala CAML Query&amp;quot;&lt;/span&gt;
                };

SPListItemCollection items = list.GetItems(query);

&lt;span class="kwrd"&gt;if&lt;/span&gt; (items!= &lt;span class="kwrd"&gt;null&lt;/span&gt;)
{
    Debug.WriteLine(&lt;span class="str"&gt;&amp;quot;Soy una colección no nula. Parece que valgo...&amp;quot;&lt;/span&gt;);
    
    &lt;span class="rem"&gt;// Ahora reviento&lt;/span&gt;
    &lt;span class="kwrd"&gt;foreach&lt;/span&gt; (SPListItem item &lt;span class="kwrd"&gt;in&lt;/span&gt; items)
    {
    }
}
&lt;/pre&gt;
&lt;p&gt;Las colecciones de este tipo en SharePoint, son de carga retardada de modo que la colección se carga cuando realmente vamos a usarla (Lazy-Load / Proxy), en ese momento se hace una petición SPRequest que es al que se encarga de recuperar el contenido y obtener la colección de elementos. (fundamento)&lt;br /&gt;&lt;br /&gt;En ese momento se usa la consulta &lt;strong&gt;SPQuery&lt;/strong&gt; que le hemos pasado para recuperar los datos, y al tratar de cargarla, como la consulta está mal formada,&amp;nbsp;da una excepción (&lt;strong&gt;no advertida ni documentada&lt;/strong&gt;), y la colección sigue siendo una colección hasta que usemos alguna de sus propiedades o tratemos de recorrerla. Es decir no es una colección vacia, si no una colección donde todo se ha quedado mal inicializado si intentas un items.Count antes de recorrer la colección tambien dará una excepción ya esta va a producirse de igual manera al cargar los datos.&lt;br /&gt;&lt;br /&gt;De &lt;strong&gt;modo que la buena práctica se convierte en mala práctica&lt;/strong&gt; ya que se pasa de hacer una comprobación de null antes, a tener que hacer un Try/Catch en el momento de recorrer la colección (como decimos por aquí, cojonudo).&lt;br /&gt;&lt;br /&gt;Como alternativa, se puede implementar un método por ejemplo, vía extensión; &amp;nbsp;para comprobar que la consulta es valida y en caso de no serla que nos devuelva una colección bien formada cuando menos. Otra alternativa podría ser otro método como &lt;em&gt;EnsureCollection&lt;/em&gt;, a través del cual podamos recuperar la excepción si nos interesa comunicar que la consulta esta mál formada.&lt;br /&gt;&lt;br /&gt;La cosa sería algo así: &lt;/p&gt;
&lt;p&gt;&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; SPListItemCollection TryGetItems(&lt;span class="kwrd"&gt;this&lt;/span&gt; SPList list, SPQuery query)
{
    SPListItemCollection items; 

    &lt;span class="kwrd"&gt;try&lt;/span&gt;
    {
        items = list.GetItems(query);
        &lt;span class="kwrd"&gt;int&lt;/span&gt; count = items.Count;
    }
    &lt;span class="kwrd"&gt;catch&lt;/span&gt;(SPException ex)
    {
        query.Query = &lt;span class="kwrd"&gt;string&lt;/span&gt;.Empty;
        items = list.GetItems(query);                
    }
    
    &lt;span class="kwrd"&gt;return&lt;/span&gt; items;
}&lt;/pre&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;JA, pero ahí no termina la cosa …&amp;nbsp; los señores de SharePoint son unos fenómenos optimizando y lo que hacen SPQuery internamente es generar una Vista (propiedad ViewXml de SPQuery), para optimizar el rendimiento, esta vista en Xml, se genera reuniendo&amp;nbsp;todas las propiedades de SPQuery, y se genera siempre y cuando no se ha generado antes (optimización)&lt;br /&gt;&lt;br /&gt;De modo, que si cambiamos la propiedad Query de SPQuery, la consulta interna ViewXml no cambia (ya se genero antes), manteniendo la última consulta generada,&amp;nbsp;para lo cual debemos limpiar ViewXml. &lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;pre class="csharpcode"&gt;query.Query = &lt;span class="kwrd"&gt;string&lt;/span&gt;.Empty;
query.ViewXml = &lt;span class="kwrd"&gt;string&lt;/span&gt;.Empty;
items = list.GetItems(query); &lt;/pre&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;¿Por qué que les habría costado implementar un flag de suciedad y reconstruir la ViewXml cada vez que el objeto este sucio? ¿por qué no documentarlo?&lt;br /&gt;&lt;br /&gt;En fin,&amp;nbsp;la cena estuvo genial.&lt;/p&gt;&lt;img width="0" height="0" src="http://www.ideseg.com/cptrk.ashx?id=bc60f384-f4de-4889-ac94-3ddb5d39ca05" alt="" /&gt;&lt;img src="http://andorradotnet.com/aggbug.aspx?PostID=392" width="1" height="1"&gt;</description><category domain="http://andorradotnet.com/blogs/csegura/archive/tags/SharePoint/default.aspx">SharePoint</category></item><item><title>He leido "Code Clean", de Robert C. Martin</title><link>http://andorradotnet.com/blogs/csegura/archive/2008/11/17/he-leido-quot-code-clean-quot-de-robert-c-martin.aspx</link><pubDate>Tue, 18 Nov 2008 04:16:37 GMT</pubDate><guid isPermaLink="false">b0fcac78-2c75-4423-8c0a-4c16f1829272:387</guid><dc:creator>csegura</dc:creator><slash:comments>0</slash:comments><description>&lt;p&gt;He terminado de leer el último libro de Robert C. Martin, Clean Code.&amp;nbsp; &lt;br /&gt;&lt;br /&gt;De Robert, había leído otros dos libros, “UML para programadores Java”, una guía práctica y sin rodeos de cómo usar UML en proyectos reales; y cuando digo práctica es que no se anda por las ramas y en ocasiones en un tono incluso “irónico” explica perfectamente cómo debemos usar UML.&lt;br /&gt;&lt;/p&gt;
&lt;p align="center"&gt;&lt;a href="http://www.amazon.com/gp/product/0132350882?ie=UTF8&amp;amp;tag=codesegm-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=0132350882"&gt;&lt;img src="http://www.ideseg.com/content/binary/rcmartin_books.jpg" border="0" alt="" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img style="BORDER-RIGHT:medium none;BORDER-TOP:medium none;MARGIN:0px;BORDER-LEFT:medium none;BORDER-BOTTOM:medium none;" height="1" alt="" src="http://www.assoc-amazon.com/e/ir?t=codesegm-20&amp;amp;l=as2&amp;amp;o=1&amp;amp;a=0132350882" width="1" border="0" /&gt; &lt;/a&gt;&lt;br /&gt;El otro libro es &lt;a href="http://www.amazon.com/gp/product/0131857258?ie=UTF8&amp;amp;tag=codesegm-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=0131857258"&gt;Agile Principles, Patterns, and Practices in C# (Robert C. Martin Series)&lt;/a&gt;&lt;img style="BORDER-RIGHT:medium none;BORDER-TOP:medium none;MARGIN:0px;BORDER-LEFT:medium none;BORDER-BOTTOM:medium none;" height="1" alt="" src="http://www.assoc-amazon.com/e/ir?t=codesegm-20&amp;amp;l=as2&amp;amp;o=1&amp;amp;a=0131857258" width="1" border="0" /&gt;, que puedo decir de este libro ampliamente comentado, uno de los que se deben tener.&amp;nbsp; (Ya sabéis que se lo recomiendo a todo el mundo)&lt;br /&gt;&lt;br /&gt;Bueno, de modo que “&lt;a href="http://www.amazon.com/gp/product/0132350882?ie=UTF8&amp;amp;tag=codesegm-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=0132350882"&gt;Clean Code: A Handbook of Agile Software Craftsmanship (Robert C. Martin Series)&lt;/a&gt;&lt;img style="BORDER-RIGHT:medium none;BORDER-TOP:medium none;MARGIN:0px;BORDER-LEFT:medium none;BORDER-BOTTOM:medium none;" height="1" alt="" src="http://www.assoc-amazon.com/e/ir?t=codesegm-20&amp;amp;l=as2&amp;amp;o=1&amp;amp;a=0132350882" width="1" border="0" /&gt; ” tenía todos los boletos de ser un gran libro. &lt;strong&gt;No ha defraudado en absoluto&lt;/strong&gt;.&lt;br /&gt;&lt;br /&gt;Apenas empezarlo, en la introducción ya me había pillado. (Ilstración de la introducción)&lt;/p&gt;
&lt;p align="center"&gt;&lt;img alt="http://www.osnews.com/images/comics/wtfm.jpg" src="http://www.osnews.com/images/comics/wtfm.jpg" /&gt;&lt;/p&gt;
&lt;p&gt;El libro explica cómo escribir buen código, código legible y eficiente.&amp;nbsp; Los ejemplos son en Java, pero tener en cuenta que estamos hablando de cómo escribir buen código, habla del significado de los nombres, de las funciones,&amp;nbsp; de los argumentos, del tipo de retorno, de cómo comentamos el código, de las reglas de formato, de objetos y estructuras de datos, de la gestión de errores, de las pruebas unitarias, del diseño simple, de sistemas, de concurrencia, de refinamiento, de olores y heurística.&amp;nbsp; &lt;strong&gt;Habla de estilo, de buen estilo.&lt;br /&gt;&lt;/strong&gt;&lt;br /&gt;De veras, me ha parecido un libro impresionante, con unos ejemplos claros, con un estilo cuidado y detallado, sin dejar cosas fuera, insistiendo en las cosas importantes (esto a mí me gusta, así entran mejor las cosas)&lt;br /&gt;&lt;br /&gt;Vamos un libro que entra de lleno en mi TOPTEN.&lt;/p&gt;&lt;img width="0" height="0" src="http://www.ideseg.com/cptrk.ashx?id=c9b4f86c-6cd5-4763-a321-a5b95404ad06" alt="" /&gt;&lt;img src="http://andorradotnet.com/aggbug.aspx?PostID=387" width="1" height="1"&gt;</description><category domain="http://andorradotnet.com/blogs/csegura/archive/tags/Books+Libros/default.aspx">Books Libros</category></item><item><title>Resumen del DevCamp en NavarraDotNet</title><link>http://andorradotnet.com/blogs/csegura/archive/2008/11/17/resumen-del-devcamp-en-navarradotnet.aspx</link><pubDate>Mon, 17 Nov 2008 18:05:40 GMT</pubDate><guid isPermaLink="false">b0fcac78-2c75-4423-8c0a-4c16f1829272:385</guid><dc:creator>csegura</dc:creator><slash:comments>0</slash:comments><description>&lt;p&gt;Un &amp;quot;poquito&amp;quot; tarde (&lt;strong&gt;y con mucha ayudita&lt;/strong&gt;) os dejo el resumen con todos los detalles del DevCamp en el blog de &lt;strong&gt;NavarraDotNet&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.navarradotnet.com/post/navarradotnet-en-el-7bdev_camp7d.aspx"&gt;http://www.navarradotnet.com/post/navarradotnet-en-el-7bdev_camp7d.aspx&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Y la información sobre el próximo evento&amp;nbsp;el &lt;strong&gt;University Tour&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="FONT-SIZE:10pt;FONT-FAMILY:&amp;#39;Verdana&amp;#39;,&amp;#39;sans-serif&amp;#39;;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;mso-bidi-font-family:&amp;#39;Times New Roman&amp;#39;;mso-ansi-language:ES;mso-fareast-language:ES;mso-bidi-language:AR-SA;"&gt;&lt;a href="http://www.navarradotnet.com/post/el-University-Tour-viene-a-la-UPNA.aspx"&gt;&lt;font color="#0000ff"&gt;http://www.navarradotnet.com/post/el-University-Tour-viene-a-la-UPNA.aspx&lt;/font&gt;&lt;/a&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="FONT-SIZE:10pt;FONT-FAMILY:&amp;#39;Verdana&amp;#39;,&amp;#39;sans-serif&amp;#39;;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;mso-bidi-font-family:&amp;#39;Times New Roman&amp;#39;;mso-ansi-language:ES;mso-fareast-language:ES;mso-bidi-language:AR-SA;"&gt;(Para los que no lo sepan, en la &lt;strong&gt;Upna&lt;/strong&gt; se esta organizando un &lt;strong&gt;DotNetClub&lt;/strong&gt;)&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="FONT-SIZE:10pt;FONT-FAMILY:&amp;#39;Verdana&amp;#39;,&amp;#39;sans-serif&amp;#39;;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;mso-bidi-font-family:&amp;#39;Times New Roman&amp;#39;;mso-ansi-language:ES;mso-fareast-language:ES;mso-bidi-language:AR-SA;"&gt;&lt;a href="http://www.navarradotnet.com/post/se-esta-cociendo-un-DotNetClub-en-la-UPNA!!.aspx"&gt;http://www.navarradotnet.com/post/se-esta-cociendo-un-DotNetClub-en-la-UPNA!!.aspx&lt;/a&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="FONT-SIZE:10pt;FONT-FAMILY:&amp;#39;Verdana&amp;#39;,&amp;#39;sans-serif&amp;#39;;mso-fareast-font-family:&amp;#39;Times New Roman&amp;#39;;mso-bidi-font-family:&amp;#39;Times New Roman&amp;#39;;mso-ansi-language:ES;mso-fareast-language:ES;mso-bidi-language:AR-SA;"&gt;&lt;br style="mso-special-character:line-break;" /&gt;&lt;/span&gt;y como no,&amp;nbsp;siempre vuelve a casa por navidad ...&amp;nbsp;(como el &lt;strong&gt;turron&lt;/strong&gt;)&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.navarradotnet.com/post/Chema-Alonso-en-CuatroVientos-Una-sesion-dirigida-a-estudiantes.aspx"&gt;http://www.navarradotnet.com/post/Chema-Alonso-en-CuatroVientos-Una-sesion-dirigida-a-estudiantes.aspx&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Toda la información sobre el paso del &lt;strong&gt;Guille por Pamplona&lt;/strong&gt; (Gracias Guille)&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.navarradotnet.com/post/gracias-Guille.aspx"&gt;http://www.navarradotnet.com/post/gracias-Guille.aspx&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;img width="0" height="0" src="http://www.ideseg.com/cptrk.ashx?id=e4586f81-5a30-4609-9874-afdce42727f1" alt="" /&gt;&lt;img src="http://andorradotnet.com/aggbug.aspx?PostID=385" width="1" height="1"&gt;</description><category domain="http://andorradotnet.com/blogs/csegura/archive/tags/NavarraDotNet/default.aspx">NavarraDotNet</category></item><item><title>EL GIRAO DEL GUILL-E EN PAMPLONA </title><link>http://andorradotnet.com/blogs/csegura/archive/2008/10/05/el-girao-del-guill-e-en-pamplona.aspx</link><pubDate>Sun, 05 Oct 2008 15:56:37 GMT</pubDate><guid isPermaLink="false">b0fcac78-2c75-4423-8c0a-4c16f1829272:353</guid><dc:creator>csegura</dc:creator><slash:comments>0</slash:comments><description>&lt;p&gt;El Community 
Tour 2008 del Guill-e consiste en que,&amp;nbsp;después de varios meses de un arduo 
trabajo de coordinación,&amp;nbsp;nos hemos organizado&amp;nbsp;muchos grupos de usuario (los de
&lt;a target="_blank" href="http://www.malagadnug.org/"&gt;Málaga&lt;/a&gt;,
&lt;a target="_blank" href="http://www.madriddotnet.com/"&gt;Madrid&lt;/a&gt;,
&lt;a target="_blank" href="http://www.valenciadev.net/"&gt;Valencia&lt;/a&gt;,
&lt;a target="_blank" href="http://lonetcamp.com/"&gt;Reus&lt;/a&gt;,
&lt;a target="_blank" href="http://www.bcndev.net/"&gt;Barcelona&lt;/a&gt;,
&lt;a target="_blank" href="http://www.catdotnet.org/"&gt;Igualada&lt;/a&gt;,
&lt;a target="_blank" href="http://www.spainnet.org/"&gt;Vic&lt;/a&gt;,
&lt;a target="_blank" href="http://andorradotnet.com/"&gt;Andorra&lt;/a&gt;,
&lt;a target="_blank" href="http://www.navarradotnet.com/"&gt;Pamplona&lt;/a&gt;,
&lt;a target="_blank" href="http://www.gusenet.com/"&gt;Murcia&lt;/a&gt;,
&lt;a target="_blank" href="http://clmnet.es/"&gt;Albacete&lt;/a&gt;,
&lt;a target="_blank" href="http://www.onobanet.com/"&gt;Huelva&lt;/a&gt;,
&lt;a target="_blank" href="http://www.artalde.net/"&gt;Bilbao&lt;/a&gt;,
&lt;a target="_blank" href="http://ug.culminis.com/sites/NUGG/"&gt;La Coruña&lt;/a&gt;,
&lt;a target="_blank" href="http://www.baleareson.net/"&gt;Mallorca&lt;/a&gt;,&amp;nbsp;&lt;a href="http://www.nuberos.net/"&gt;Cantabria&lt;/a&gt;,&amp;nbsp;&lt;a target="_blank" href="http://www.mobilenug.com/"&gt;Valladolid&amp;nbsp;&lt;/a&gt;y 
también &lt;a target="_blank" href="http://www.secondnug.com/"&gt;SecondNug&lt;/a&gt;)&amp;nbsp;y 
hemos quedado con el amigo Guillermo Son&amp;nbsp;para que haga una&amp;nbsp;pequeña ;)&amp;nbsp;gira&amp;nbsp;y 
venga a hacernos una visita a todos, a enseñarnos las cosas nuevas que ha 
aprendido del lenguaje ese en el que no se pierde el tiempo poniendo puntos y 
comas (expresión suya).&amp;nbsp;&lt;br /&gt;
&amp;nbsp;&lt;br /&gt;
Guille nos ha contando que está intentando echar un cable a un chaval que está 
en una situación muy apurada y hemos decidido ayudarle también así que la gira 
es solidaria con
&lt;a target="_blank" href="http://www.elguille.info/solidario/ayudaJuanma/Default.aspx"&gt;
Juanma&lt;/a&gt;. Para animar a la colaboración se sortearán durante la gira un montón 
de regalos:&lt;/p&gt;&lt;p&gt;&lt;br /&gt;
1&amp;nbsp;Visual Studio 2008 Profesional &lt;br /&gt;
2&amp;nbsp;suscripciones
&lt;a target="_blank" href="http://msdn.microsoft.com/en-us/subscriptions/aa718657.aspx"&gt;
MSDN Premium con Visual Studio Team System 2008 Team Suite&lt;/a&gt; (valorada cada 
una en más de 5.000 Euros).&lt;br /&gt;
10 Packs de Productividad que incluye Resharper y dotTrace&lt;br /&gt;
16 libros de Novedades de Visual Basic 9.0 (uno para cada evento)&lt;br /&gt;
16 libros de Novedades de C# 3.0 (uno para cada evento)&lt;br /&gt;
65 Suscripciones a la revista dotNetManía (48 de 3 meses y 16 de un año)&lt;br /&gt;
&amp;nbsp;&lt;br /&gt;
En Pamplona, además&amp;nbsp;tenemos la suerte de volver a contar con David Salgado, que 
hará de telonero de lujo y nos hablará de opciones para del desarrollo de un 
sitio web .NET.&lt;br /&gt;
&amp;nbsp;&lt;br /&gt;
Os esperamos el día 15 de octubre de 16:30 a 21:00 en el salón de actos de los 
Centros de Excelencia Software, polígono industrial Elorz-Mocholí en Noain.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;
&amp;nbsp;&lt;img border="0" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;La agenda:&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;
&lt;b&gt;16:30-17:00&lt;/b&gt;:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Bienvenida y registro. Reunión del grupo de usuarios 
NavarraDotNet. Orden del día: nuestros saraos &lt;/p&gt;
&lt;p&gt;&lt;b&gt;17:00-18:30&lt;/b&gt;:&amp;nbsp;&amp;nbsp;&amp;nbsp; 
Opciones para el desarrollo de un sitio web .NET, David Salgado &lt;/p&gt;
&lt;p&gt;Con la llegada del SP1 de .net 
3.5, se abre el abanico de opciones a valorar a la hora de desarrollar un sitio 
web. Hasta ahora contábamos con &lt;a target="_blank" href="http://asp.net/"&gt;
ASP.NET&lt;/a&gt; y algunas pinceladas de &lt;a target="_blank" href="http://asp.net/"&gt;
ASP.NET&lt;/a&gt; AJAX. A dia de hoy contamos además con una nueva versión de Visual 
Studio, &lt;a target="_blank" href="http://asp.net/"&gt;ASP.NET&lt;/a&gt; MVC,
&lt;a target="_blank" href="http://asp.net/"&gt;ASP.NET&lt;/a&gt; Dynamic Data,
&lt;a target="_blank" href="http://asp.net/"&gt;ASP.NET&lt;/a&gt; Dynamic Services, un 
soporte mejorado de &lt;a target="_blank" href="http://asp.net/"&gt;ASP.NET&lt;/a&gt; AJAX e 
Internet Explorer 8 como navegador. Descúbrelos, resuelve tus dudas y decide qué 
es lo más adecuado para tus desarrollos. &lt;/p&gt;
&lt;p&gt;&lt;b&gt;18:30- 19:00&lt;/b&gt;:&amp;nbsp;&amp;nbsp;Merienda 
patrocinada por el CES &lt;/p&gt;
&lt;p&gt;&lt;b&gt;19:00 -21:00&lt;/b&gt;:&amp;nbsp; El Guille con 
la comunidad, Guillermo Som &lt;/p&gt;
&lt;p&gt;
Novedades y ejemplos prácticos de Visual Basic 9,&amp;nbsp; ejemplos prácticos de 
uso de LINQ. Aprovecha la primera visita que hace elGuille a 
Pamplona:&amp;nbsp;¡pregúntale al Guille! &lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;br /&gt;
Como siempre, la entrada es gratuita previo registro en: &lt;/p&gt;
&lt;p&gt;
&lt;a target="_blank" href="http://msevents.microsoft.com/CUI/EventDetail.aspx?EventID=1032389675&amp;amp;Culture=es-ES"&gt;
Inscripción a través de Microsoft&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;
&lt;a target="_blank" href="http://www.cein.es/web/es/inscripciones/index.php?id=8248&amp;amp;tipo=Jornada&amp;amp;titulo=Guille+Community+Tour+2008&amp;amp;fechas=15+de+octubre&amp;amp;actos=0"&gt;
Inscripción a través de CEIN&lt;/a&gt;&lt;/p&gt;
&lt;br /&gt;
Y tenéis más información y el fantástico cartel que ha hecho nuestro
&lt;a target="_blank" href="http://www.navarradotnet.com/post/CartelTeclearNoEsSustituto20080210.aspx"&gt;
Sergio Jimenez&lt;/a&gt; en
&lt;a target="_blank" href="http://www.navarradotnet.com/post/el-Guille-en-Pamplona%21%21%21.aspx"&gt;
http://www.navarradotnet.com/post/el-Guille-en-Pamplona!!!.aspx&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;(by: Elena)&lt;br /&gt;


&lt;img width="0" height="0" src="http://www.ideseg.com/cptrk.ashx?id=499c76e0-0e9f-4f57-8074-96d2ed1c9d1b" alt="" /&gt;&lt;img src="http://andorradotnet.com/aggbug.aspx?PostID=353" width="1" height="1"&gt;</description><category domain="http://andorradotnet.com/blogs/csegura/archive/tags/NavarraDotNet/default.aspx">NavarraDotNet</category></item><item><title>Programando a cuatro manos: Unit Test para SharePoint</title><link>http://andorradotnet.com/blogs/csegura/archive/2008/09/21/programando-a-cuatro-manos-unit-test-para-sharepoint.aspx</link><pubDate>Mon, 22 Sep 2008 02:36:02 GMT</pubDate><guid isPermaLink="false">b0fcac78-2c75-4423-8c0a-4c16f1829272:325</guid><dc:creator>csegura</dc:creator><slash:comments>0</slash:comments><description>Aquí continúa el drama de Unit Test para SharePoint. Esta vez hemos reunido esfuerzos entre nosotros, Carlos Segura (http://www.ideseg.com ) y Gustavo Velez (http://www.gavd.net ), para intentar sacar algo en claro. Programadores del mundo de SharePoint, uníos! ...&lt;br /&gt;&lt;br /&gt;Unit Test, SharePoint y que es lo importante:&lt;br /&gt;&lt;br /&gt;Testeo Unitario es una técnica de programación que permite asegurar que lo que se ha programado hoy cumple las condiciones exigidas, y que las seguirá cumpliendo en el futuro, cuando se hagan modificaciones en el código fuente. Existe numerosa información al respecto, tanto en libros de texto como en internet, así que no repetiremos las bases de la técnica; en resumen, es deseable que se &lt;br /&gt;cumplan algunas condiciones:&lt;br /&gt;&lt;br /&gt;- El código de Pruebas Unitarias debe ser independiente de cualquier FrameWork que se esté utilizando para garantizar que no hay dependencias, es decir, circunstancias que no se puedan repetir en el futuro. En nuestro caso, no se desea tener que utilizar una instancia de SharePoint para ejecutar el testeo, pues es prácticamente imposible crear dentro de algunos meses/años un sistema de SharePoint que sea exactamente igual al utilizado originalmente&lt;br /&gt;&lt;br /&gt;- El código de Pruebas debe ser fácil y rápido de escribir. El (valioso) tiempo de programación se debe utilizar para programar la funcionalidad, no para programar el sistema de pruebas&lt;br /&gt;&lt;br /&gt;- El código de prueba tiene que ser igual para todos los desarrolladores en el equipo de desarrollo. Esto tiene que ver con el primer punto: si no existen dependencias (configuraciones, por ejemplo) con el FrameWork utilizado, no hay riesgos de que dos desarrolladores obtengan diferentes resultados. O que el sistema de compilación automática produzca resultados impredecibles (Night Build, Continuous Build, Regretion e Integration Test)&lt;br /&gt;&lt;br /&gt;Unit Test es comúnmente utilizado en desarrollo de software, y existen varias herramientas que lo facilitan. Visual Studio (versión profesional y superior) provee todas las herramientas necesarias para generar Unit Test con un clic; si no se dispone de una de estas versiones de Visual Studio, existen herramientas gratuitas que pueden hacer el mismo trabajo (NUnit, http://www.nunit.org/, xUnit, http://www.codeplex.com/xunit y TestDriven, http://www.testdriven.net/ por ejemplo).&lt;br /&gt;&lt;br /&gt;Cuando se desean hacer Pruebas Unitarias para SharePoint es necesario utilizar técnicas suplementarias que permitan crear “imágenes fantasmas” de sus clases. Esto se puede conseguir de diferentes formas, por medio de Mocking o Stubbing, por ejemplo &lt;br /&gt;&lt;br /&gt;•&amp;nbsp; &lt;a href="http://geeks.ms/blogs/gvelez/archive/2007/08/04/mocks-mocking-mockers-y-sharepoint.aspx"&gt;http://geeks.ms/blogs/gvelez/archive/2007/08/04/mocks-mocking-mockers-y-sharepoint.aspx&lt;/a&gt;&lt;br /&gt;•&amp;nbsp; &lt;a href="http://geeks.ms/blogs/gvelez/archive/2007/08/12/stubs-stubbing-stubbers-y-sharepoint.aspx"&gt;http://geeks.ms/blogs/gvelez/archive/2007/08/12/stubs-stubbing-stubbers-y-sharepoint.aspx&lt;/a&gt;&lt;br /&gt;•&amp;nbsp; &lt;a href="http://www.ideseg.com/SharePointPruebasUnitarias1.aspx"&gt;http://www.ideseg.com/SharePointPruebasUnitarias1.aspx&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Otras técnicas, como la utilización de Plantillas o Copias de Seguridad son utilizables, pero no cumplen las condiciones ideales indicadas al principio.&lt;br /&gt;&lt;br /&gt;Mocking es una técnica que permite crear objetos “falsos” de un determinado FrameWork, y luego “convencer” al código a probar que tiene que usar los objetos falsos, y no los que obtendrán del FrameWork en su trabajo real. Esta técnica permite cumplir todas las condiciones indicadas. Desafortunadamente, por la forma de programación de SharePoint no es posible usar Mockers tradicionales. &lt;br /&gt;&lt;br /&gt;La nueva versión de &lt;a href="http://www.typemock.com"&gt;TypeMock &lt;/a&gt;(versión 5.0, http://www.typemock.com ) permite crear objetos mock que funcionan bajo estas condiciones, haciéndolo ideal para crear Unit Test para SharePoint. Desafortunadamente, &lt;a href="http://www.typemock.com"&gt;TypeMock &lt;/a&gt;es una herramienta comercial, pero se puede bajar del sitio indicado una versión de prueba completamente funcional por 30 días.&lt;br /&gt;&lt;br /&gt;Otra de las motivaciones para usar TypeMock, es que el equipo de SharePoint Guidance está usando TypeMock en sus ejemplos; el porqué es simple, a pesar de que existen otras alternativas en el mercado, y algunas de uso libre, ninguna de ellas es capaz de mockear clases selladas o clases que no tienen un constructor público. La API de SharePoint cuenta con innumerables clases y una gran parte de ellas están selladas y carecen de constructores públicos por lo que TypeMock es la única alternativa por el momento.&lt;br /&gt;&lt;br /&gt;Mockeando a SharePoint&lt;br /&gt;&lt;br /&gt;1 - El caso más sencillo: mockear a SPSIte y SPWeb. El método a probar tiene la siguiente forma:&lt;br /&gt;&lt;br /&gt;
&lt;pre class="csharpcode"&gt;       &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; TestMock_01()
       {
            String strReturn = String.Empty;

            &lt;span class="kwrd"&gt;try&lt;/span&gt;
            {
                &lt;span class="kwrd"&gt;using&lt;/span&gt;(SPSite mySite = &lt;span class="kwrd"&gt;new&lt;/span&gt; SPSite(&lt;span class="str"&gt;&amp;quot;http://MiServidor&amp;quot;&lt;/span&gt;))
                {
                    &lt;span class="kwrd"&gt;using&lt;/span&gt;(SPWeb myWeb = mySite.OpenWeb())
                    {
                        strReturn = myWeb.MasterUrl;
                    }
                }
            }
            &lt;span class="kwrd"&gt;catch&lt;/span&gt; (System.Exception ex)
            {
                strReturn = ex.ToString();
            }

            &lt;span class="kwrd"&gt;return&lt;/span&gt; strReturn;
        }&lt;/pre&gt;
Y el método de Pruebas Unitarias con TypeMock seria:&lt;br /&gt;
&lt;pre class="csharpcode"&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; TestMethod1()
        {
            &lt;span class="kwrd"&gt;using&lt;/span&gt; (RecordExpectations recorder = RecorderManager.StartRecording())
            {
                SPSite mySiteMocked = &lt;span class="kwrd"&gt;new&lt;/span&gt; SPSite(&lt;span class="str"&gt;&amp;quot;&amp;quot;&lt;/span&gt;);
                SPWeb myWebMocked = RecorderManager.CreateMockedObject&amp;lt;SPWeb&amp;gt;();
                recorder.ExpectAndReturn(mySiteMocked.OpenWeb(), myWebMocked);
                recorder.ExpectAndReturn(myWebMocked.MasterUrl, &lt;span class="str"&gt;&amp;quot;abcd.master&amp;quot;&lt;/span&gt;).RepeatAlways();
            }

            &lt;span class="kwrd"&gt;string&lt;/span&gt; expected = &lt;span class="str"&gt;&amp;quot;abcd.master&amp;quot;&lt;/span&gt;;
            &lt;span class="kwrd"&gt;string&lt;/span&gt; actual;
            actual = Program.TestMock_01();
            Assert.AreEqual(expected, actual);
        }&lt;/pre&gt;

&lt;br /&gt;Bajo el estamento “using” se crean objetos SPSite y SPWeb “falsos”. Todos los objetos creados bajo el “recorder” serán después utilizados como objetos de trabajo en la función a testear, en lugar de los objetos “reales” obtenidos del FrameWork de SharePoint. Esto permite garantizar que en el ejemplo, no importa qué tipo de configuración tenga la instalación actual de SharePoint, siempre se le va a “hacer creer” al método a testear que la página maestra del Web se llama “abcd.master”.&lt;br /&gt;&lt;br /&gt;Luego de crear los objetos mockeados, se inician las variables a esperar (expected), se ejecuta el método a probar y el resultado se compara con lo esperado.&lt;br /&gt;&lt;br /&gt;2 - Yendo algo más lejos: mockeando colecciones. Cuando se desea utilizar la misma sintaxis para crear objetos mockeados de colecciones se encuentran diferentes dificultades.&amp;nbsp; En las colecciones de SharePoint se ha mantenido el diseño existente en versiones anteriores por lo que funcionan como lo hacían en Net 1.1: una clase que implementa IEnumerable&amp;nbsp; y una clase anidada que implementa IEnumerator; para poder recorrer colecciones de objetos mockeados se debe reproducir este comportamiento y lo que a priori puede parecer fácil en realidad no lo es…&lt;br /&gt;&lt;br /&gt;En primer lugar se debe mantener una colección de objetos paralela a través del cual podamos devolver un enumerador; se puede ver un ejemplo de esta técnica en (&lt;a href="http://dotnetforum.dk/blogs/mac/archive/2007/12/21/first-steps-with-typemock-and-the-sharepoint-api.aspx"&gt;http://dotnetforum.dk/blogs/mac/archive/2007/12/21/first-steps-with-typemock-and-the-sharepoint-api.aspx&lt;/a&gt;), lo cual nos obliga en cierta manera a crear métodos para reproducir las colecciones de objetos de SharePoint. &lt;br /&gt;&lt;br /&gt;En parte motivados por esto y por la necesidad de poder realizar los tests de la manera más sencilla posible hemos creado un conjunto de clases envoltorio que nos permitirán extender los objetos a mockear de SharePoint de una manera más elegante.&lt;br /&gt;&lt;br /&gt;Por ejemplo, para el siguiente método a probar, en el que se necesita recorrer la colección de Listas en el Web de más alto nivel:&lt;br /&gt;
&lt;div class="csharpcode"&gt;
&lt;pre class="alt"&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; TestMock_02()&lt;/pre&gt;
&lt;pre&gt;        {&lt;/pre&gt;
&lt;pre class="alt"&gt;            &lt;span class="kwrd"&gt;string&lt;/span&gt; strReturn = String.Empty;&lt;/pre&gt;
&lt;pre&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre class="alt"&gt;            &lt;span class="kwrd"&gt;try&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;            {&lt;/pre&gt;
&lt;pre class="alt"&gt;                &lt;span class="kwrd"&gt;using&lt;/span&gt; (SPSite mySite = &lt;span class="kwrd"&gt;new&lt;/span&gt; SPSite(&lt;span class="str"&gt;&amp;quot;http://MiServidor&amp;quot;&lt;/span&gt;))&lt;/pre&gt;
&lt;pre&gt;                {&lt;/pre&gt;
&lt;pre class="alt"&gt;                    &lt;span class="kwrd"&gt;using&lt;/span&gt; (SPWeb myWeb = mySite.OpenWeb())&lt;/pre&gt;
&lt;pre&gt;                    {&lt;/pre&gt;
&lt;pre class="alt"&gt;                        &lt;span class="kwrd"&gt;int&lt;/span&gt; intTeller = 0;&lt;/pre&gt;
&lt;pre&gt;                        &lt;span class="kwrd"&gt;foreach&lt;/span&gt; (SPList oneList &lt;span class="kwrd"&gt;in&lt;/span&gt; myWeb.Lists)&lt;/pre&gt;
&lt;pre class="alt"&gt;                        {&lt;/pre&gt;
&lt;pre&gt;                            Debug.WriteLine(oneList.Title);&lt;/pre&gt;
&lt;pre class="alt"&gt;                            intTeller++;&lt;/pre&gt;
&lt;pre&gt;                        }&lt;/pre&gt;
&lt;pre class="alt"&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre&gt;                        strReturn = intTeller.ToString();&lt;/pre&gt;
&lt;pre class="alt"&gt;                    }&lt;/pre&gt;
&lt;pre&gt;                }&lt;/pre&gt;
&lt;pre class="alt"&gt;            }&lt;/pre&gt;
&lt;pre&gt;            &lt;span class="kwrd"&gt;catch&lt;/span&gt; (Exception ex)&lt;/pre&gt;
&lt;pre class="alt"&gt;            {&lt;/pre&gt;
&lt;pre&gt;                strReturn = ex.ToString();&lt;/pre&gt;
&lt;pre class="alt"&gt;            }&lt;/pre&gt;
&lt;pre&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre class="alt"&gt;            &lt;span class="kwrd"&gt;return&lt;/span&gt; strReturn;&lt;/pre&gt;
&lt;pre&gt;        }&lt;/pre&gt;
&lt;/div&gt;
&lt;br /&gt;Se puede utilizar un método de prueba con la siguiente sintaxis:&lt;br /&gt;

&lt;div class="csharpcode"&gt;
&lt;pre class="alt"&gt;        [TestMethod]&lt;/pre&gt;
&lt;pre&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; TestMethod2()&lt;/pre&gt;
&lt;pre class="alt"&gt;        {&lt;/pre&gt;
&lt;pre&gt;            MockSPSite mockSite = &lt;span class="kwrd"&gt;new&lt;/span&gt; MockSPSite(&lt;span class="str"&gt;&amp;quot;TestSite&amp;quot;&lt;/span&gt;);          &lt;span class="rem"&gt;// 1&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;            MockSPWeb mockWeb = &lt;span class="kwrd"&gt;new&lt;/span&gt; MockSPWeb(&lt;span class="str"&gt;&amp;quot;TestWeb&amp;quot;&lt;/span&gt;);  &lt;span class="rem"&gt;// 2&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre class="alt"&gt;            MockSPList mockList0 = &lt;span class="kwrd"&gt;new&lt;/span&gt; MockSPList(&lt;span class="str"&gt;&amp;quot;MyList0&amp;quot;&lt;/span&gt;);         &lt;span class="rem"&gt;// 3&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;            MockSPList mockList1 = &lt;span class="kwrd"&gt;new&lt;/span&gt; MockSPList(&lt;span class="str"&gt;&amp;quot;MyList1&amp;quot;&lt;/span&gt;);      &lt;/pre&gt;
&lt;pre class="alt"&gt;            MockSPList mockList2 = &lt;span class="kwrd"&gt;new&lt;/span&gt; MockSPList(&lt;span class="str"&gt;&amp;quot;MyList2&amp;quot;&lt;/span&gt;);&lt;/pre&gt;
&lt;pre&gt;            mockWeb.Lists = &lt;span class="kwrd"&gt;new&lt;/span&gt; MockSPListCollection(&lt;span class="kwrd"&gt;new&lt;/span&gt;[]             &lt;span class="rem"&gt;// 4&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;               {&lt;/pre&gt;
&lt;pre&gt;                   mockList0,&lt;/pre&gt;
&lt;pre class="alt"&gt;                   mockList1,&lt;/pre&gt;
&lt;pre&gt;                   mockList2&lt;/pre&gt;
&lt;pre class="alt"&gt;               });&lt;/pre&gt;
&lt;pre&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre class="alt"&gt;            mockSite.ExpectGetAlways(&lt;span class="str"&gt;&amp;quot;RootWeb&amp;quot;&lt;/span&gt;, mockWeb.GetInstance());  &lt;span class="rem"&gt;//5&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre class="alt"&gt;            SPWeb WebMocked = mockWeb.GetInstance();    &lt;span class="rem"&gt;// 6&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre class="alt"&gt;            &lt;span class="kwrd"&gt;using&lt;/span&gt; (RecordExpectations recorder = RecorderManager.StartRecording())    &lt;span class="rem"&gt;// 7&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;            {&lt;/pre&gt;
&lt;pre class="alt"&gt;                SPSite SiteMocked = &lt;span class="kwrd"&gt;new&lt;/span&gt; SPSite(&lt;span class="str"&gt;&amp;quot;&amp;quot;&lt;/span&gt;);    &lt;span class="rem"&gt;// 8&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;                recorder.ExpectAndReturn(SiteMocked.OpenWeb(), WebMocked);    &lt;span class="rem"&gt;// 9&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;            }&lt;/pre&gt;
&lt;pre&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre class="alt"&gt;            &lt;span class="kwrd"&gt;string&lt;/span&gt; expected = &lt;span class="str"&gt;&amp;quot;3&amp;quot;&lt;/span&gt;;    &lt;span class="rem"&gt;// 10&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;            &lt;span class="kwrd"&gt;string&lt;/span&gt; actual;&lt;/pre&gt;
&lt;pre class="alt"&gt;            actual = Program.TestMock_02();&lt;/pre&gt;
&lt;pre&gt;            Assert.AreEqual(expected, actual);&lt;/pre&gt;
&lt;pre class="alt"&gt;        }&lt;/pre&gt;
&lt;/div&gt;

&lt;br /&gt;Aquí se pueden distinguir tres zonas con código:&lt;br /&gt;&lt;br /&gt;-&amp;nbsp;&amp;nbsp; &amp;nbsp;En la primera parte, líneas 1 a 7 se crean todos los objetos “falsos” necesarios. Líneas 1 y 2 crean objetos del tipo SPSite y SPWeb. Las líneas bajo el numero 3 crean tres Listas mockeadas y en la línea 4 se agregan las Listas a la Colección de Listas del objeto SPWeb mockeado. En la línea 5 se agrega a su vez el objeto SPWeb como la Web de nivel superior del objeto SPSite mockeado y finalmente, en la línea 6 se crea un objeto del tipo SPWeb nuevo basado en el objeto SPWeb mockeado. Esto es necesario para el código en la segunda zona, que no permite utilizar objetos mockeados directamente&lt;br /&gt;&lt;br /&gt;-&amp;nbsp;&amp;nbsp; &amp;nbsp;En la segunda zona, líneas 7 a 9, se crean los objetos que se le van a entregar a la clase a testear por medio de un “recorder” de TypeMock. En la línea 8 se crea un objeto SPSite que va a substituir el SPSite en la clase a testear, y en la línea 9 se le asigna el valor del objeto SPWeb mockeado&amp;nbsp; con las Listas creadas en la primera parte.&lt;br /&gt;&lt;br /&gt;-&amp;nbsp;&amp;nbsp; &amp;nbsp;La tercera zona, desde la línea 10, incluyen el código para los valores esperados y los valores que regresan del método a testear y los comparan en la aserción.&lt;br /&gt;La primera parte del código utiliza las clases envoltorio comentadas anteriormente (MockSPSite, MockSPWeb, etc). Estas clases tienen la forma:&lt;br /&gt;&lt;br /&gt;

&lt;div class="csharpcode"&gt;
&lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;namespace&lt;/span&gt; SPTypeMock.Core&lt;/pre&gt;
&lt;pre&gt;{&lt;/pre&gt;
&lt;pre class="alt"&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; MockSPSite : MockSP&amp;lt;SPSite&amp;gt;&lt;/pre&gt;
&lt;pre&gt;    {&lt;/pre&gt;
&lt;pre class="alt"&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; MockSPSite(&lt;span class="kwrd"&gt;string&lt;/span&gt; url) : &lt;span class="kwrd"&gt;base&lt;/span&gt;(&lt;span class="kwrd"&gt;true&lt;/span&gt;)&lt;/pre&gt;
&lt;pre&gt;        {&lt;/pre&gt;
&lt;pre class="alt"&gt;            &lt;span class="kwrd"&gt;if&lt;/span&gt; (&lt;span class="kwrd"&gt;string&lt;/span&gt;.IsNullOrEmpty(url))&lt;/pre&gt;
&lt;pre&gt;            {&lt;/pre&gt;
&lt;pre class="alt"&gt;                &lt;span class="kwrd"&gt;throw&lt;/span&gt; &lt;span class="kwrd"&gt;new&lt;/span&gt; ArgumentNullException(&lt;span class="str"&gt;&amp;quot;url&amp;quot;&lt;/span&gt;);&lt;/pre&gt;
&lt;pre&gt;            }&lt;/pre&gt;
&lt;pre class="alt"&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre&gt;            Mock.ExpectGetAlways(&lt;span class="str"&gt;&amp;quot;Url&amp;quot;&lt;/span&gt;, url);&lt;/pre&gt;
&lt;pre class="alt"&gt;        }&lt;/pre&gt;
&lt;pre&gt;    }&lt;/pre&gt;
&lt;pre class="alt"&gt;}&lt;/pre&gt;
&lt;/div&gt;


&lt;br /&gt;&lt;br /&gt;Estas clases sirven para simplificar la creación de los objetos mockeados, y no son más que herencias de tipos definidos (SPSite en este caso), con algunos constructores específicos y métodos para conectar sus colecciones de objetos. Las clases de envoltura permiten reutilizar el código una y otra vez, sin que la escritura de las pruebas signifique el tener que escribir mas código que el código a testear (una de las condiciones señaladas al principio).&lt;br /&gt;&lt;br /&gt;Todas estas clases se encuentran en la biblioteca &lt;b&gt;SPTypeMock &lt;/b&gt;que podéis encontrar en &lt;b&gt;&lt;a href="http://www.codeplex.com/SPTypeMock"&gt;CodePlex&lt;/a&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;SPTypeMock &lt;/b&gt;usa dos clases, la primera es &lt;font color="#000080"&gt;MockSP&amp;lt;T&amp;gt;&lt;/font&gt; que es una clase abstracta desde la cual mockearemos los objetos de SharePoint, la única peculiaridad de esta clase está en el constructor, que&amp;nbsp; tiene un parámetro bolean, que se encarga de añadir la propiedad ID de la clase; las clases de SharePoint tienen un ID, en la mayoría de ellas&amp;nbsp; es un Guid, pero en otras como SPListItem es un int.&lt;br /&gt;&lt;br /&gt;La propiedad Mock de esta clase nos da acceso al objeto mock que se encuentra en el interior, debemos usar esta propiedad para establecer las expectativas.&lt;br /&gt;&lt;br /&gt;El método GetInstance, se encarga de devolvernos una instancia real del objeto mockeado. &lt;br /&gt;&lt;br /&gt;La segunda clase es &lt;font color="#000080"&gt;MockSPCollection&amp;lt;TCollection,TItem&amp;gt;&lt;/font&gt; que es otra clase abstracta desde la cual heredaremos las colecciones de SharePoint. MockSPCollection, hereda a&amp;nbsp; su vez de List&amp;lt;TItem&amp;gt; de modo que así conseguimos tener la colección paralela necesaria para trabajar con las colecciones de SharePoint.&lt;br /&gt;&lt;br /&gt;Disponemos de dos constructores uno que se encargará de crear colecciones vacías y otro al que podemos pasarle una lista de elementos que formarán parte de la colección. Al obtener una instancia de la colección por medio de GetInstance(), establecemos que la interfaz IEnumerable será obtenida de la lista; también aquí nos encargamos de mockear el index por defecto que será a través de un int.&lt;br /&gt;&lt;br /&gt;Si las colecciones que deseamos usar tienen otros índices como SPListCollection, que tiene un índice por título de la lista y otro por Guid, podemos sobrescribir el método CustomIndex en las clases heredadas implementando dicha funcionalidad.&lt;br /&gt;&lt;br /&gt;No todo es perfecto...&lt;br /&gt;&lt;br /&gt;No todo ha sido solucionado, algunos problemas quedan aún por resolver:&lt;br /&gt;&lt;br /&gt;-&amp;nbsp;&amp;nbsp; &amp;nbsp;La instalación de TypeMock no permite seleccionar un directorio de instalación, lo que limita la utilización de programas de compilación automático, como Cruise Control por ejemplo&lt;br /&gt;&lt;br /&gt;-&amp;nbsp;&amp;nbsp; &amp;nbsp;Los objetos mockeados creados en las dos primeras zonas de la clase de prueba son creados en un Thread diferente al utilizado por SharePoint al crear los objetos en el método a testear. Esto tiene como consecuencia que si se desea destruir los objetos al final del método a probar (por medio de un “using” para el SPSite y/o el SPWeb, o por medio de un “Dispose()” al final del método), SharePoint producirá un error en sus logs indicando “ERROR: request not found in the TrackedRequests. We might be creating and closing webs on different threads” &lt;br /&gt;&lt;br /&gt;-&amp;nbsp;&amp;nbsp; &amp;nbsp;Es necesario crear aun muchas más clases de envoltorio&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;/p&gt;&lt;img width="0" height="0" src="http://www.ideseg.com/cptrk.ashx?id=9eeff04d-3486-4b25-ba85-e613192eb371" alt="" /&gt;&lt;img src="http://andorradotnet.com/aggbug.aspx?PostID=325" width="1" height="1"&gt;</description><category domain="http://andorradotnet.com/blogs/csegura/archive/tags/SharePoint/default.aspx">SharePoint</category></item><item><title>Triste perdida para la comunidad de SharePoint</title><link>http://andorradotnet.com/blogs/csegura/archive/2008/09/05/triste-perdida-para-la-comunidad-de-sharepoint.aspx</link><pubDate>Fri, 05 Sep 2008 16:29:29 GMT</pubDate><guid isPermaLink="false">b0fcac78-2c75-4423-8c0a-4c16f1829272:314</guid><dc:creator>csegura</dc:creator><slash:comments>0</slash:comments><description>
 
  Normal
  0
  
  
  21
  
  
  false
  false
  false
  
  ES
  X-NONE
  X-NONE
  
   
   
   
   
   
   
   
   
   
   
   
  
  MicrosoftInternetExplorer4
  
   
   
   
   
   
   
   
   
   
   
   
  

 
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
 




 /* Style Definitions */
 table.MsoNormalTable
	{mso-style-name:&amp;quot;Tabla normal&amp;quot;;
	mso-tstyle-rowband-size:0;
	mso-tstyle-colband-size:0;
	mso-style-noshow:yes;
	mso-style-priority:99;
	mso-style-qformat:yes;
	mso-style-parent:&amp;quot;&amp;quot;;
	mso-padding-alt:0cm 5.4pt 0cm 5.4pt;
	mso-para-margin-top:0cm;
	mso-para-margin-right:0cm;
	mso-para-margin-bottom:10.0pt;
	mso-para-margin-left:0cm;
	line-height:115%;
	mso-pagination:widow-orphan;
	font-size:11.0pt;
	font-family:&amp;quot;Calibri&amp;quot;,&amp;quot;sans-serif&amp;quot;;
	mso-ascii-font-family:Calibri;
	mso-ascii-theme-font:minor-latin;
	mso-fareast-font-family:&amp;quot;Times New Roman&amp;quot;;
	mso-fareast-theme-font:minor-fareast;
	mso-hansi-font-family:Calibri;
	mso-hansi-theme-font:minor-latin;}



&lt;p class="MsoNormal"&gt;&lt;span&gt;El pasado día 3, &lt;a href="http://www.u2u.info/Blogs/Patrick"&gt;&lt;b&gt;&lt;i&gt;Patrick
Tisseghem&lt;/i&gt;&lt;/b&gt;&lt;/a&gt; co-fundador de&lt;a href="http://www.u2u.be/"&gt; U2U&lt;/a&gt;, murió de una afección cardiaca. Desde aquí
quiero enviar un cariñoso y fuerte abrazo a su familia y a la gente U2U. &lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal"&gt;&lt;span&gt;Patrick ha sido una
inspiración para muchos de nosotros y toda la comunidad de SharePoint, lamentamos
esta gran pérdida. &lt;/span&gt;&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;&lt;img width="0" height="0" src="http://www.ideseg.com/cptrk.ashx?id=c69c3be3-6a56-462e-88ac-000eab40201e" alt="" /&gt;&lt;img src="http://andorradotnet.com/aggbug.aspx?PostID=314" width="1" height="1"&gt;</description><category domain="http://andorradotnet.com/blogs/csegura/archive/tags/SharePoint/default.aspx">SharePoint</category></item><item><title>Beginners Guide to TD WebPart Development</title><link>http://andorradotnet.com/blogs/csegura/archive/2008/08/28/beginners-guide-to-td-webpart-development.aspx</link><pubDate>Fri, 29 Aug 2008 00:12:20 GMT</pubDate><guid isPermaLink="false">b0fcac78-2c75-4423-8c0a-4c16f1829272:301</guid><dc:creator>csegura</dc:creator><slash:comments>0</slash:comments><description>Hace algún tiempo hable de las pruebas unitarias para desarrolladores de SharePoint (y seguiremos hablando de ello)&lt;br /&gt;&lt;a href="http://www.ideseg.com/SharePointPruebasUnitarias1.aspx"&gt;&lt;br /&gt;SharePoint - Pruebas Unitarias (1)&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.ideseg.com/SharePointPruebasUnitarias2.aspx"&gt;SharePoint - Pruebas Unitarias (2)&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.ideseg.com/SharePointPruebasUnitarias3.aspx"&gt;SharePoint - Pruebas Unitarias (3)&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Andrew Woodward, acaba de publicar un MUY interesante documento “Beginners Guide to Test Driven Web Part Development”, que os recomiendo. Se puede descargar desde su &lt;b&gt;&lt;a href="http://www.21apps.com/agile/beginners-guide-to-test-driven-web-part-development/attachment/unit-testing-sharepoint-solutions-the-basics/"&gt;blog&lt;/a&gt;&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;/p&gt;&lt;img width="0" height="0" src="http://www.ideseg.com/cptrk.ashx?id=0c3d1deb-c468-4a5f-9e92-4b3db1a942f5" alt="" /&gt;&lt;img src="http://andorradotnet.com/aggbug.aspx?PostID=301" width="1" height="1"&gt;</description><category domain="http://andorradotnet.com/blogs/csegura/archive/tags/SharePoint/default.aspx">SharePoint</category></item><item><title>Tres libritos que se pueden descargar gratis sobre MOS</title><link>http://andorradotnet.com/blogs/csegura/archive/2008/08/25/tres-libritos-que-se-pueden-descargar-gratis-sobre-mos.aspx</link><pubDate>Tue, 26 Aug 2008 03:39:49 GMT</pubDate><guid isPermaLink="false">b0fcac78-2c75-4423-8c0a-4c16f1829272:291</guid><dc:creator>csegura</dc:creator><slash:comments>0</slash:comments><description>&lt;br /&gt;La buena noticia, son gratix la mala puede que hayaís leído parte o todo en, &lt;a id="ctl00_rs1_mainContentContainer_ctl01" href="http://go.microsoft.com/fwlink/?LinkId=84739"&gt;Office SharePoint Server 
technical library&lt;/a&gt;, a mi me gusta más el papel ....&lt;br /&gt;&lt;br /&gt;Guía de configuración de MOSS para la gestión de contenidos empresariales y gestión de registros.&lt;ul&gt;&lt;li&gt;&lt;a id="ctl00_rs1_mainContentContainer_ctl02" href="http://go.microsoft.com/fwlink/?LinkId=92720"&gt;Records Management Guide for 
Microsoft Office SharePoint Server 2007&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;Planificación de la estructura de sitios web y entorno de publicación (interesante la parte de creación automática de de sitios web y aprobación para la publicación, ya sabeís que mi fuerte no es el CMS pero se me han ocurrido unas cositas interesantes)&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a id="ctl00_rs1_mainContentContainer_ctl02" href="http://go.microsoft.com/fwlink/?LinkId=92330"&gt;Microsoft Office SharePoint 
Server Web Publishing and Planning Guide&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;Diseño y contruccion de sitios con MOSS&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a id="ctl00_rs1_mainContentContainer_ctl02" href="http://go.microsoft.com/fwlink/?LinkId=110087"&gt;Design and build sites for 
Office SharePoint Server 2007&lt;/a&gt; &lt;/li&gt;&lt;/ul&gt; Saludetes ... &lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;/p&gt;&lt;img width="0" height="0" src="http://www.ideseg.com/cptrk.ashx?id=af41fedb-0d5e-463e-acfd-a0f47a5df00b" alt="" /&gt;&lt;img src="http://andorradotnet.com/aggbug.aspx?PostID=291" width="1" height="1"&gt;</description><category domain="http://andorradotnet.com/blogs/csegura/archive/tags/SharePoint/default.aspx">SharePoint</category></item><item><title>Tres libritos que se pueden descargar gratis sobre MOSS</title><link>http://andorradotnet.com/blogs/csegura/archive/2008/08/25/tres-libritos-que-se-pueden-descargar-gratis-sobre-moss.aspx</link><pubDate>Tue, 26 Aug 2008 03:39:49 GMT</pubDate><guid isPermaLink="false">b0fcac78-2c75-4423-8c0a-4c16f1829272:292</guid><dc:creator>csegura</dc:creator><slash:comments>0</slash:comments><description>&lt;br /&gt;La buena noticia, son gratix la mala puede que hayaís leído parte o todo en, &lt;a id="ctl00_rs1_mainContentContainer_ctl01" href="http://go.microsoft.com/fwlink/?LinkId=84739"&gt;Office SharePoint Server 
technical library&lt;/a&gt;, a mi me gusta más el papel ....&lt;br /&gt;&lt;br /&gt;Guía de configuración de MOSS para la gestión de contenidos empresariales y gestión de registros.&lt;ul&gt;&lt;li&gt;&lt;a id="ctl00_rs1_mainContentContainer_ctl02" href="http://go.microsoft.com/fwlink/?LinkId=92720"&gt;Records Management Guide for 
Microsoft Office SharePoint Server 2007&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;Planificación de la estructura de sitios web y entorno de publicación (interesante la parte de creación automática de de sitios web y aprobación para la publicación, ya sabeís que mi fuerte no es el CMS pero se me han ocurrido unas cositas interesantes)&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a id="ctl00_rs1_mainContentContainer_ctl02" href="http://go.microsoft.com/fwlink/?LinkId=92330"&gt;Microsoft Office SharePoint 
Server Web Publishing and Planning Guide&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;Diseño y contruccion de sitios con MOSS&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a id="ctl00_rs1_mainContentContainer_ctl02" href="http://go.microsoft.com/fwlink/?LinkId=110087"&gt;Design and build sites for 
Office SharePoint Server 2007&lt;/a&gt; &lt;/li&gt;&lt;/ul&gt; Saludetes ... &lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;/p&gt;&lt;img width="0" height="0" src="http://www.ideseg.com/cptrk.ashx?id=af41fedb-0d5e-463e-acfd-a0f47a5df00b" alt="" /&gt;&lt;img src="http://andorradotnet.com/aggbug.aspx?PostID=292" width="1" height="1"&gt;</description><category domain="http://andorradotnet.com/blogs/csegura/archive/tags/SharePoint/default.aspx">SharePoint</category></item><item><title>Online YACAMLQT, the SQL to CAML converter</title><link>http://andorradotnet.com/blogs/csegura/archive/2008/06/27/online-yacamlqt-the-sql-to-caml-converter.aspx</link><pubDate>Fri, 27 Jun 2008 22:53:53 GMT</pubDate><guid isPermaLink="false">b0fcac78-2c75-4423-8c0a-4c16f1829272:250</guid><dc:creator>csegura</dc:creator><slash:comments>0</slash:comments><description>&lt;p&gt;Thanks to the guys from &lt;strong&gt;SPSProfessional&lt;/strong&gt;, my small toy &lt;a href="http://www.ideseg.com/SharePointYetAnotherCAMLQueryTool2.aspx"&gt;YACAMLQT&lt;/a&gt;, is&amp;nbsp;ONLINE you can play with this in &lt;a href="http://www.spsprofessional.com/sqlcaml.aspx"&gt;www.spsprofessional.com/sqlcaml.aspx&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Enjoy...&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;img width="0" height="0" src="http://www.ideseg.com/cptrk.ashx?id=5f752cff-ed5c-4535-b722-e376deff1f40" alt="" /&gt;&lt;img src="http://andorradotnet.com/aggbug.aspx?PostID=250" width="1" height="1"&gt;</description><category domain="http://andorradotnet.com/blogs/csegura/archive/tags/SharePoint/default.aspx">SharePoint</category></item><item><title>NavarraDotNet - Sql Server 2005 Integration Services</title><link>http://andorradotnet.com/blogs/csegura/archive/2008/05/29/navarradotnet-sql-server-2005-integration-services.aspx</link><pubDate>Thu, 29 May 2008 14:32:48 GMT</pubDate><guid isPermaLink="false">b0fcac78-2c75-4423-8c0a-4c16f1829272:211</guid><dc:creator>csegura</dc:creator><slash:comments>0</slash:comments><description>&lt;p class="ecececmsonormal" style="MARGIN:auto 0cm;"&gt;&lt;span style="FONT-SIZE:10pt;FONT-FAMILY:Verdana;"&gt;Evento:&amp;nbsp; “&lt;strong&gt;Sql Server 2005&amp;nbsp;Integration Services&lt;/strong&gt;&amp;quot;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;Día:&amp;nbsp;30 de mayo 2008, hora: 18:30-20:30&lt;/span&gt; &lt;br /&gt;&lt;span style="FONT-SIZE:10pt;FONT-FAMILY:Verdana;"&gt;Lugar: Sistema Formacion. Plaza Pintor Paret, 1. 31008 Pamplona&lt;/span&gt; &lt;br /&gt;&lt;span style="FONT-SIZE:10pt;FONT-FAMILY:Verdana;"&gt;Colaboran: Sistema Formación, Masbytes,&amp;nbsp;navarraDotNet, MSDN &lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; &lt;/p&gt;
&lt;p class="ecececmsonormal" style="MARGIN:auto 0cm;"&gt;&lt;span style="FONT-SIZE:10pt;FONT-FAMILY:Verdana;"&gt;Ponente: &lt;strong&gt;Patxi Esteban&lt;/strong&gt;. Biko2, navarraDotNet&lt;/span&gt; &lt;/p&gt;
&lt;p class="ecececmsonormal" style="MARGIN:auto 0cm;"&gt;&lt;span style="FONT-SIZE:10pt;FONT-FAMILY:Verdana;"&gt;Agenda:&lt;/span&gt; &lt;/p&gt;
&lt;p class="ecececmsonormal" style="MARGIN:auto 0cm;"&gt;&lt;span style="FONT-SIZE:10pt;FONT-FAMILY:Verdana;"&gt;18:30 - 19:00: Reunión de navarraDotNet. Orden del día: nuestros saraos&lt;/span&gt; &lt;br /&gt;&lt;span style="FONT-SIZE:10pt;FONT-FAMILY:Verdana;"&gt;19:00 - 20:30:&amp;nbsp; Sql Server 2005&amp;nbsp;Integration Services. Patxi Esteban.&lt;/span&gt; &lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN:0cm 0cm 0pt;"&gt;&lt;span style="FONT-SIZE:10pt;FONT-FAMILY:Verdana;"&gt;Integración de datos de alto rendimiento con los paquetes ETL(extracción, transformación y carga), mucho más que una versión 2 de los DTS(Servicios de transformación de datos).&lt;/span&gt; &lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN:0cm 0cm 0pt;"&gt; &lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN:0cm 0cm 0pt;"&gt;&lt;span style="FONT-SIZE:10pt;FONT-FAMILY:Verdana;"&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN:0cm 0cm 0pt;"&gt;&lt;strong&gt;&lt;span style="FONT-SIZE:10pt;FONT-FAMILY:Verdana;"&gt;Entrada libre previo registro en:&lt;/span&gt; &lt;/strong&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN:0cm 0cm 0pt;"&gt; &lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN:0cm 0cm 0pt;"&gt;&lt;span style="FONT-SIZE:10pt;FONT-FAMILY:Verdana;"&gt;&lt;span class="EC_eslabelnormal"&gt;&lt;a href="http://msevents.microsoft.com/CUI/EventDetail.aspx?EventID=1032376400&amp;amp;Culture=es-ES" target="_blank"&gt;&lt;span style="COLOR:#17365d;"&gt;&lt;font face="Calibri"&gt;http://msevents.microsoft.com/CUI/EventDetail.aspx?EventID=1032376400&amp;amp;Culture=es-ES&lt;/font&gt;&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&amp;nbsp; &lt;/p&gt;&lt;img width="0" height="0" src="http://www.ideseg.com/cptrk.ashx?id=d985f5b4-e76a-4046-96ca-ea7e557c2053" alt="" /&gt;&lt;img src="http://andorradotnet.com/aggbug.aspx?PostID=211" width="1" height="1"&gt;</description><category domain="http://andorradotnet.com/blogs/csegura/archive/tags/NavarraDotNet/default.aspx">NavarraDotNet</category></item><item><title>Edit your SQL Server DataBase from INSIDE SharePoint</title><link>http://andorradotnet.com/blogs/csegura/archive/2008/05/10/edit-your-sql-server-database-from-inside-sharepoint.aspx</link><pubDate>Sun, 11 May 2008 01:20:00 GMT</pubDate><guid isPermaLink="false">b0fcac78-2c75-4423-8c0a-4c16f1829272:195</guid><dc:creator>csegura</dc:creator><slash:comments>0</slash:comments><description>&lt;p&gt;&lt;strong&gt;WOW&lt;/strong&gt;. In only 4 minutes, connecting two webparts. You can download a public beta from &lt;a href="http://www.spsprofessional.com"&gt;www.spsprofessional.com&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.ideseg.com/SPS/ActionDataBaseDemo.htm"&gt;View Full Screen&lt;/a&gt;&lt;/p&gt;
&lt;div id="media"&gt;

                                                                                
                                
                
            &lt;/div&gt;&lt;img width="0" height="0" src="http://www.ideseg.com/cptrk.ashx?id=3b5ff483-3932-419c-ae42-7a3332b40ca4" alt="" /&gt;&lt;img src="http://andorradotnet.com/aggbug.aspx?PostID=195" width="1" height="1"&gt;</description><category domain="http://andorradotnet.com/blogs/csegura/archive/tags/SharePoint/default.aspx">SharePoint</category></item><item><title>The return of the RollUP </title><link>http://andorradotnet.com/blogs/csegura/archive/2008/05/05/the-return-of-the-rollup.aspx</link><pubDate>Mon, 05 May 2008 21:56:24 GMT</pubDate><guid isPermaLink="false">b0fcac78-2c75-4423-8c0a-4c16f1829272:188</guid><dc:creator>csegura</dc:creator><slash:comments>0</slash:comments><description>&lt;p&gt;It returns, the best&amp;nbsp;Roll Up of contents for Share Point, of the hand of &lt;strong&gt;&lt;a href="http://www.spsprofessional.com"&gt;SPSProfessional&lt;/a&gt;&lt;/strong&gt;. Sure it sounds you a lot.&lt;/p&gt;
&lt;p&gt;&lt;img src="http://www.ideseg.com/content/binary/SPSRollUp_Images7.gif" border="0" alt="" /&gt;&lt;br /&gt;And besides now it does pretty graphics. &lt;/p&gt;
&lt;p&gt;&lt;img src="http://www.ideseg.com/content/binary/SPSRollUpChart_Video.gif" border="0" alt="" /&gt;&lt;br /&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;More information in &lt;a href="http://www.spsprofessional.com"&gt;www.spsprofessional.com&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;img width="0" height="0" src="http://www.ideseg.com/cptrk.ashx?id=6a1b2bdc-055a-4b60-ba4f-78355b362c92" alt="" /&gt;&lt;img src="http://andorradotnet.com/aggbug.aspx?PostID=188" width="1" height="1"&gt;</description><category domain="http://andorradotnet.com/blogs/csegura/archive/tags/SharePoint/default.aspx">SharePoint</category></item></channel></rss>