<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://geeks.ms/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/" xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd"><channel><title>El Bruno : HowTo, Code Sample, Visual Studio</title><link>http://geeks.ms/blogs/elbruno/archive/tags/HowTo/Code+Sample/Visual+Studio/default.aspx</link><description>Etiquetas: HowTo, Code Sample, Visual Studio</description><dc:language>en</dc:language><generator>CommunityServer 2008.5 SP1 (Build: 31106.3070)</generator><item><title>[VS2010] Ejecutando pruebas unitarias en un proyecto del tipo “AddIn” (the dirty way, la solución está en un buen diseño)</title><link>http://geeks.ms/blogs/elbruno/archive/2011/01/04/vs2010-ejecutando-pruebas-unitarias-en-un-proyecto-del-tipo-addin-the-dirty-way-la-soluci-243-n-est-225-en-un-buen-dise-241-o.aspx</link><pubDate>Tue, 04 Jan 2011 22:03:03 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:186760</guid><dc:creator>El Bruno</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/elbruno/rsscomments.aspx?PostID=186760</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/elbruno/commentapi.aspx?PostID=186760</wfw:comment><comments>http://geeks.ms/blogs/elbruno/archive/2011/01/04/vs2010-ejecutando-pruebas-unitarias-en-un-proyecto-del-tipo-addin-the-dirty-way-la-soluci-243-n-est-225-en-un-buen-dise-241-o.aspx#comments</comments><description>&lt;div class="wlWriterHeaderFooter" style="float:none;margin:0px;padding:4px 0px 4px 0px;"&gt;&lt;iframe src="http://www.facebook.com/widgets/like.php?href=http://geeks.ms/blogs/elbruno/archive/2011/01/04/vs2010-ejecutando-pruebas-unitarias-en-un-proyecto-del-tipo-addin-the-dirty-way-la-soluci-243-n-est-225-en-un-buen-dise-241-o.aspx" scrolling="no" frameborder="0" style="border:none;width:450px;height:80px;"&gt;&lt;/iframe&gt;&lt;/div&gt;&lt;p&gt;&lt;a href="http://www.flickr.com/photos/27253355@N07/4454466743/"&gt;&lt;img title="image47dd1de4" border="0" alt="image47dd1de4" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/elbruno/image47dd1de4_5F00_5D24718D.png" width="606" height="167" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Buenas,&lt;/p&gt;    &lt;p&gt;hace bastante tiempo comenté &lt;a href="http://geeks.ms/blogs/elbruno/archive/2009/07/05/tfs2008-configurando-tfsbuild-para-ejecutar-pruebas-unitarias-que-utilicen-microsoft-outlook-juanlu-me-debes-una.aspx" target="_blank"&gt;&lt;strike&gt;un truco&lt;/strike&gt; la configuración necesaria para poder utilizar TFSBuild para ejecutar pruebas unitarias en proyectos del tipo AddIn de Outlook&lt;/a&gt;. Hoy, 2 años después mi recomendación sigue siendo la misma:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;strong&gt;&lt;em&gt;No incluyas lógica compleja en tu proyecto de AddIn. Separa la misma en proyectos separados y cada uno con su set de pruebas … etc. Vamos que sigue siendo &lt;a href="http://en.wikipedia.org/wiki/Solid_%28object-oriented_design%29" target="_blank"&gt;SOLID&lt;/a&gt; al 100%.&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Ahora bien, si por algún motivo extraño de la vida, te encuentras en un escenario donde las clases con la “lógica compleja” deben estar dentro del proyecto del AddIn y la prueba unitaria de las mismas es un tanto compleja (&lt;em&gt;por ejemplo para AddIns de Office 2003 con Visual Studio 2008&lt;/em&gt;), pues existe un truco que no recomiendo, pero que cumple su objetivo.&lt;/p&gt;  &lt;p&gt;Lo mejor es mostrarlo con un proyecto de ejemplo, como en la siguiente imagen donde podemos ver un proyecto de AddIn para Outlook con una clase llamada [&lt;strong&gt;&lt;em&gt;GuidValidator&lt;/em&gt;&lt;/strong&gt;] que obviamente nos permite validar un Guid.&lt;/p&gt;  &lt;p&gt;&lt;em&gt;&lt;strong&gt;Nota:&lt;/strong&gt; pa los criticones, si no les gustan los nombres de las clases, pues … a leer otra cosa !!!&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/elbruno/image_5F00_6EFAFA55.png"&gt;&lt;img style="background-image:none;border-bottom:0px;border-left:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;border-top:0px;border-right:0px;padding-top:0px;" title="image" border="0" alt="image" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/elbruno/image_5F00_thumb_5F00_50BD16D4.png" width="300" height="223" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;El código para validar el guid tampoco es que sea muy complicado:&lt;/p&gt;  &lt;div id="codeSnippetWrapper"&gt;   &lt;div style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;" id="codeSnippet"&gt;     &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum1"&gt;   1:&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;using&lt;/span&gt; System.Text.RegularExpressions;&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum2"&gt;   2:&lt;/span&gt;&amp;#160; &lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum3"&gt;   3:&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;namespace&lt;/span&gt; OutlookAddIn1&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum4"&gt;   4:&lt;/span&gt; {&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum5"&gt;   5:&lt;/span&gt;     &lt;span style="color:#0000ff;"&gt;class&lt;/span&gt; GuidValidator&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum6"&gt;   6:&lt;/span&gt;     {&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum7"&gt;   7:&lt;/span&gt;         &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;static&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;bool&lt;/span&gt; Validate(&lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; textToValidate)&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum8"&gt;   8:&lt;/span&gt;         {&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum9"&gt;   9:&lt;/span&gt;             var isGuid = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; Regex(&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum10"&gt;  10:&lt;/span&gt;               &lt;span style="color:#006080;"&gt;@&amp;quot;^(\{){0,1}[0-9a-fA-F]{8}\-[0-9a-fA-F]{4}\-[0-9a-fA-F]{4}\-[0-9a-fA-F]{4}\-[0-9a-fA-F]{12}(\}){0,1}$&amp;quot;&lt;/span&gt;, &lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum11"&gt;  11:&lt;/span&gt;               RegexOptions.Compiled);&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum12"&gt;  12:&lt;/span&gt;             &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; isGuid.IsMatch(textToValidate);&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum13"&gt;  13:&lt;/span&gt;         }&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum14"&gt;  14:&lt;/span&gt;     }&lt;/pre&gt;


    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;" id="lnum15"&gt;  15:&lt;/span&gt; }&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;Pero claro, probar unitariamente algo tan simple como una expresión regular utilizando todo el contexto de un AddIn de Outlook, es muy pesado. La solución nos la pueden dar los siguientes pasos.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;1. Agregar un nuevo proyecto del tipo ClassLibrary a la solución. En mi caso lo llamaré [&lt;strong&gt;&lt;em&gt;AddInToTest&lt;/em&gt;&lt;/strong&gt;]&lt;/p&gt;

  &lt;p&gt;2. Eliminar la clase que viene por defecto en el proyecto.&lt;/p&gt;

  &lt;p&gt;3. En las propiedades del proyecto cambiar el namespace por defecto del proyecto ClassLibrary para que coincida con el namespace por defecto del proyecto del AddIn&lt;/p&gt;

  &lt;p&gt;4. Agregar como link la clase [&lt;strong&gt;&lt;em&gt;GuidValidator&lt;/em&gt;&lt;/strong&gt;] ubicada en el proyecto del AddIn&lt;/p&gt;

  &lt;p&gt;5. Agregar los tests unitarios de la clase [&lt;strong&gt;&lt;em&gt;GuidValidator&lt;/em&gt;&lt;/strong&gt;] en un proyecto de test separado&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;La estructura de la solución queda similar a la siguiente. &lt;/p&gt;

&lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/elbruno/image_5F00_0ED63186.png"&gt;&lt;img style="background-image:none;border-bottom:0px;border-left:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;border-top:0px;border-right:0px;padding-top:0px;" title="image" border="0" alt="image" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/elbruno/image_5F00_thumb_5F00_0123757E.png" width="312" height="447" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;En la misma es posible ver que si bien la clase [&lt;strong&gt;&lt;em&gt;GuidValidator&lt;/em&gt;&lt;/strong&gt;] pertenece al proyecto [&lt;strong&gt;&lt;em&gt;OutlookAddIn1&lt;/em&gt;&lt;/strong&gt;], la misma se utiliza como archivo externo en el proyecto [&lt;strong&gt;&lt;em&gt;AddInToTest&lt;/em&gt;&lt;/strong&gt;] y se implementan las pruebas en el proyecto de test [&lt;strong&gt;&lt;em&gt;AddIn.Tests&lt;/em&gt;&lt;/strong&gt;].&lt;/p&gt;

&lt;p&gt;El truco es bastante simple, poco elegante, pero funciona. Si quieres descargar el código de ejemplo para darle un vistazo lo puedes hacer desde aquí &lt;/p&gt;

&lt;p&gt;&lt;a title="http://cid-bef06dffdb192125.office.live.com/self.aspx/Code%20Samples/2011%2001%2004%20Hack%20to%20unit%20testing%20Outlook%20AddIns.zip" href="http://cid-bef06dffdb192125.office.live.com/self.aspx/Code%20Samples/2011%2001%2004%20Hack%20to%20unit%20testing%20Outlook%20AddIns.zip"&gt;http://cid-bef06dffdb192125.office.live.com/self.aspx/Code%20Samples/2011%2001%2004%20Hack%20to%20unit%20testing%20Outlook%20AddIns.zip&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;







&lt;p&gt;Saludos @ Home&lt;/p&gt;

&lt;p&gt;El Bruno&lt;/p&gt;

&lt;p&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="El Bruno on facebook" border="0" src="http://img243.imageshack.us/img243/9364/facebook24x24.jpg" alt="" /&gt;&amp;#160; &lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="El Bruno o facebook" border="0" src="http://img37.imageshack.us/img37/5712/twiiter24x24.jpg" alt="" /&gt;&amp;#160;&lt;a href="http://es.linkedin.com/in/elbruno"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="El Bruno in LinkedIn" border="0" src="http://img59.imageshack.us/img59/3462/linkedin24x24.jpg" alt="" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=186760" width="1" height="1"&gt;</description><category domain="http://geeks.ms/blogs/elbruno/archive/tags/Visual+Studio/default.aspx">Visual Studio</category><category domain="http://geeks.ms/blogs/elbruno/archive/tags/Visual+Studio+2010/default.aspx">Visual Studio 2010</category><category domain="http://geeks.ms/blogs/elbruno/archive/tags/HowTo/default.aspx">HowTo</category><category domain="http://geeks.ms/blogs/elbruno/archive/tags/Code+Sample/default.aspx">Code Sample</category><category domain="http://geeks.ms/blogs/elbruno/archive/tags/UnitTests/default.aspx">UnitTests</category></item></channel></rss>