<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:blogChannel="http://backend.userland.com/blogChannelModule" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:pingback="http://madskills.com/public/xml/rss/module/pingback/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0">
  <id>http://www.cprieto.com/</id>
  <title>IDisposable Thoughts</title>
  <updated>2009-09-29T19:34:09+00:00</updated>
  <link href="http://www.cprieto.com/" />
  
  <subtitle>Honey, where is my coding t-shirt?</subtitle>
  <author>
    <name>My name</name>
  </author>
  <generator uri="http://dotnetblogengine.net/" version="1.0.0.0">BlogEngine.Net Syndication Generator</generator>
  <blogChannel:blogRoll>http://www.cprieto.com/opml.axd</blogChannel:blogRoll>
  <blogChannel:blink>http://www.dotnetblogengine.net/syndication.axd</blogChannel:blink>
  <dc:creator>My name</dc:creator>
  <dc:description>Honey, where is my coding t-shirt?</dc:description>
  <dc:language>en-US</dc:language>
  <dc:title>IDisposable Thoughts</dc:title>
  <geo:lat>0.000000</geo:lat>
  <geo:long>0.000000</geo:long>
  <link rel="self" href="http://feeds.feedburner.com/IdisposableThoughts" type="application/atom+xml" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com" /><entry>
    <id>http://www.cprieto.com/post/2009/09/28/The-complex-way-is-not-really-the-right-way.aspx</id>
    <title>The complex way is not really the right way…</title>
    <updated>2009-09-29T01:12:00+00:00</updated>
    <link rel="self" href="http://www.cprieto.com/post.aspx?id=ba44aa17-24eb-4f14-a3a8-ebbed1ae9242" />
    <link href="http://feedproxy.google.com/~r/IdisposableThoughts/~3/SqOJm72g-Jc/The-complex-way-is-not-really-the-right-way.aspx" />
    <author>
      <name>cristian</name>
    </author>
    <summary type="html">&lt;p&gt;Today I was visiting a client, and I just stop and watch something that really caught my attention:&lt;/p&gt;  &lt;pre class="brush: csharp;"&gt;// Ugly code is over
foreach (item in myList) {
    if (item.Length &amp;gt; 0) {
        SaveItem(item);
    }
}
// more ugly code...&lt;/pre&gt;

&lt;p&gt;Well, the code was really different (an uglier one) but you got the idea…. What I suggested to my client was a more concise solutio, create an extension method:&lt;/p&gt;

&lt;pre class="brush: csharp;"&gt;public static class IEnumerableExt {
    public static IEnumerable&amp;lt;T&amp;gt; ForEach(this IEnumerable&amp;lt;T&amp;gt; items, Action&amp;lt;T&amp;gt; action) {
        foreach(var item in items) {
            action(e);
        }
    }
}&lt;/pre&gt;

&lt;p&gt;The second part is the easy one…&lt;/p&gt;

&lt;pre class="brush: csharp;"&gt;myList
    .Where((item) =&amp;gt; item.Length &amp;gt; 0)
    .ForEach((item) =&amp;gt; SaveItem(Item));&lt;/pre&gt;

&lt;p&gt;I don’t know you, but this way looks a lot clearer to me…&lt;/p&gt;

&lt;p&gt;Lessson learned: If your code looks complex, please, take a time and look how to make it more clearer.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/IdisposableThoughts/~4/SqOJm72g-Jc" height="1" width="1"/&gt;</summary>
    <published>2009-09-29T01:12:00+00:00</published>
    <link rel="related" href="http://www.cprieto.com/post/2009/09/28/The-complex-way-is-not-really-the-right-way.aspx#comment" />
    <category term=".Net" />
    <dc:publisher>cristian</dc:publisher>
    <pingback:server>http://www.cprieto.com/pingback.axd</pingback:server>
    <pingback:target>http://www.cprieto.com/post.aspx?id=ba44aa17-24eb-4f14-a3a8-ebbed1ae9242</pingback:target>
    <slash:comments>0</slash:comments>
    <trackback:ping>http://www.cprieto.com/trackback.axd?id=ba44aa17-24eb-4f14-a3a8-ebbed1ae9242</trackback:ping>
    <wfw:comment>http://www.cprieto.com/post/2009/09/28/The-complex-way-is-not-really-the-right-way.aspx#comment</wfw:comment>
    <wfw:commentRss>http://www.cprieto.com/syndication.axd?post=ba44aa17-24eb-4f14-a3a8-ebbed1ae9242</wfw:commentRss>
  <feedburner:origLink>http://www.cprieto.com/post/2009/09/28/The-complex-way-is-not-really-the-right-way.aspx</feedburner:origLink></entry>
  <entry>
    <id>http://www.cprieto.com/post/2009/09/21/Sharepoint-Development-is-GDD.aspx</id>
    <title>Sharepoint Development = GDD</title>
    <updated>2009-09-21T22:15:00+00:00</updated>
    <link rel="self" href="http://www.cprieto.com/post.aspx?id=0a7b496f-0f52-4f6c-a587-f77275867668" />
    <link href="http://feedproxy.google.com/~r/IdisposableThoughts/~3/zMlV7bbjK5o/Sharepoint-Development-is-GDD.aspx" />
    <author>
      <name>cristian</name>
    </author>
    <summary type="html">&lt;p&gt;Yep, in the last few weeks I’ve committed to develop a few Sharepoint + Infopath based workflows for a client, I’ve been developed sharepoint solutions before, and everytime I touch sharepoint solution code I arrive to the same conclusion:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;Sharepoint development is the best example of &lt;em&gt;GDD&lt;/em&gt; (&lt;strong&gt;Guess Driven Development)&lt;/strong&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;I mean, I know there are just a few ways to do TDD in Sharepoint (using Typemock), but right now develop and test complex sharepoint solutions consist in a few steps:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Think what you need to do&lt;/li&gt;    &lt;li&gt;Guess how to do it&lt;/li&gt;    &lt;li&gt;Guess what would happen in sharepoint when the solution is deployed&lt;/li&gt;    &lt;li&gt;Build your WSP&lt;/li&gt;    &lt;li&gt;Deploy your WSP&lt;/li&gt;    &lt;li&gt;Run it&lt;/li&gt;    &lt;li&gt;Guess what that “cryptic” &lt;a href="http://twitpic.com/imcsp"&gt;error message&lt;/a&gt; means…&lt;/li&gt;    &lt;li&gt;Guess your solution to that error&lt;/li&gt;    &lt;li&gt;Repeat until your error message disappears or another one appears.&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;I think there must be a better way to do it…&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/IdisposableThoughts/~4/zMlV7bbjK5o" height="1" width="1"/&gt;</summary>
    <published>2009-09-21T22:15:00+00:00</published>
    <link rel="related" href="http://www.cprieto.com/post/2009/09/21/Sharepoint-Development-is-GDD.aspx#comment" />
    <category term="ASP.NET" />
    <dc:publisher>cristian</dc:publisher>
    <pingback:server>http://www.cprieto.com/pingback.axd</pingback:server>
    <pingback:target>http://www.cprieto.com/post.aspx?id=0a7b496f-0f52-4f6c-a587-f77275867668</pingback:target>
    <slash:comments>0</slash:comments>
    <trackback:ping>http://www.cprieto.com/trackback.axd?id=0a7b496f-0f52-4f6c-a587-f77275867668</trackback:ping>
    <wfw:comment>http://www.cprieto.com/post/2009/09/21/Sharepoint-Development-is-GDD.aspx#comment</wfw:comment>
    <wfw:commentRss>http://www.cprieto.com/syndication.axd?post=0a7b496f-0f52-4f6c-a587-f77275867668</wfw:commentRss>
  <feedburner:origLink>http://www.cprieto.com/post/2009/09/21/Sharepoint-Development-is-GDD.aspx</feedburner:origLink></entry>
  <entry>
    <id>http://www.cprieto.com/post/2009/09/18/my-blog-was-offline-again.aspx</id>
    <title>My blog was offline… again…</title>
    <updated>2009-09-19T04:37:00+00:00</updated>
    <link rel="self" href="http://www.cprieto.com/post.aspx?id=509b9ed5-fdaf-4929-8258-07760264207f" />
    <link href="http://feedproxy.google.com/~r/IdisposableThoughts/~3/NWmj0AlkRY8/my-blog-was-offline-again.aspx" />
    <author>
      <name>cristian</name>
    </author>
    <summary type="html">Well, after a short amount of time my blog was offline, and, of course, my blog data was lost… yep, another “home run” from my ex-hosting provider. Now, I changed from provider and restored ‘at hand’ a few of my post (which was stored on my live writer local recently posted files). I hope this will happen never again...
&lt;img src="http://feeds.feedburner.com/~r/IdisposableThoughts/~4/NWmj0AlkRY8" height="1" width="1"/&gt;</summary>
    <published>2009-09-19T04:37:00+00:00</published>
    <link rel="related" href="http://www.cprieto.com/post/2009/09/18/my-blog-was-offline-again.aspx#comment" />
    <category term="General" />
    <dc:publisher>cristian</dc:publisher>
    <pingback:server>http://www.cprieto.com/pingback.axd</pingback:server>
    <pingback:target>http://www.cprieto.com/post.aspx?id=509b9ed5-fdaf-4929-8258-07760264207f</pingback:target>
    <slash:comments>0</slash:comments>
    <trackback:ping>http://www.cprieto.com/trackback.axd?id=509b9ed5-fdaf-4929-8258-07760264207f</trackback:ping>
    <wfw:comment>http://www.cprieto.com/post/2009/09/18/my-blog-was-offline-again.aspx#comment</wfw:comment>
    <wfw:commentRss>http://www.cprieto.com/syndication.axd?post=509b9ed5-fdaf-4929-8258-07760264207f</wfw:commentRss>
  <feedburner:origLink>http://www.cprieto.com/post/2009/09/18/my-blog-was-offline-again.aspx</feedburner:origLink></entry>
  <entry>
    <id>http://www.cprieto.com/post/2009/09/10/XUnitNET-Extensions-TheoryAttribute-y-DataAttribute.aspx</id>
    <title>XUnit.NET Extensions, TheoryAttribute y DataAttribute</title>
    <updated>2009-09-11T03:48:00+00:00</updated>
    <link rel="self" href="http://www.cprieto.com/post.aspx?id=855fc3ca-c2d1-46fc-a937-0f6399e3df30" />
    <link href="http://feedproxy.google.com/~r/IdisposableThoughts/~3/33yrXmf5e6A/XUnitNET-Extensions-TheoryAttribute-y-DataAttribute.aspx" />
    <author>
      <name>cristian</name>
    </author>
    <summary type="html">&lt;p&gt;Es bastante com&amp;uacute;n toparnos con casos en los que debemos asegurarnos que el mismo test se cumpla para varias condiciones. Imag&amp;iacute;nense el desarrollo de una calculadora o mucho mejor, el de alguna pieza de l&amp;oacute;gica de negocio dependiente de data. En vez de escribir ciclos dentro de nuestro test o peor a&amp;uacute;n, escribir varios test para el caso, en XUnit.NET tenemos el apoyo de las &amp;ldquo;Theory&amp;rdquo; que son test que estan fuertemente ligados a los datos.&lt;/p&gt;
&lt;p&gt;Los datos son pasados como par&amp;aacute;metros del test y el origen de los datos depende de nuestro proveedor de datos seleccionado. En XUnit.NET Extensions tenemos de &amp;ldquo;cajita&amp;rdquo; varios proveedores de datos que podemos usar:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;InlineDataAttribute&lt;/strong&gt;, los datos se presentan en l&amp;iacute;nea en cada atributo &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ClassDataAttribute&lt;/strong&gt;, los datos son proporcionados por una clase que implementa IEnumerable&amp;lt;T&amp;gt; &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;PropertyDataAttribute&lt;/strong&gt;, los datos son entregados por la propiedad de una clase que retorna IEnumerable&amp;lt;T&amp;gt; &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;SqlServerDataAttribute&lt;/strong&gt;, los datos vienen de una consulta de una base de datos de SQL Server &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;OleDbDataAttribute&lt;/strong&gt;, los datos tienen como origen una consulta de un proveedor OleDb &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ExcelDataAttribute&lt;/strong&gt;, los datos tienen como origen una hoja de c&amp;aacute;lculo de Excel. &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;El uso de Theory y DataAttribute proporciona una agilidad incre&amp;iacute;ble al probar ciertas condiciones que antes requeririan mucha m&amp;aacute;s pericia. Depende de nosotros sacarle provecho :)&lt;/p&gt;
&lt;pre class="brush: csharp;"&gt;[Theory]
[InlineData(1, 2, 3)]
[InlineData(4, 5, 9)]
public void It_can_use_correctly_the_data_attribute(int a, int b, int result)
{
    Assert.Equal(result, (a + b));
}

[Theory, ExcelData("myTestData.xls", "SELECT a, b, result FROM Data")]
public void It_can_use_correctly_the_data_from_an_excel_file(int a, int b, int result)
{
    Assert.Equal(result, (a + b));
}&lt;/pre&gt;
&lt;p&gt;Bien, hasta aqu&amp;iacute; llegamos con las Extensiones de XUnit.NET, la pr&amp;oacute;xima entrega veremos como extender a nuestro antojo XUnit.NET ;)&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/IdisposableThoughts/~4/33yrXmf5e6A" height="1" width="1"/&gt;</summary>
    <published>2009-09-11T03:48:00+00:00</published>
    <link rel="related" href="http://www.cprieto.com/post/2009/09/10/XUnitNET-Extensions-TheoryAttribute-y-DataAttribute.aspx#comment" />
    <category term=".Net" />
    <category term="Testing" />
    <dc:publisher>cristian</dc:publisher>
    <pingback:server>http://www.cprieto.com/pingback.axd</pingback:server>
    <pingback:target>http://www.cprieto.com/post.aspx?id=855fc3ca-c2d1-46fc-a937-0f6399e3df30</pingback:target>
    <slash:comments>0</slash:comments>
    <trackback:ping>http://www.cprieto.com/trackback.axd?id=855fc3ca-c2d1-46fc-a937-0f6399e3df30</trackback:ping>
    <wfw:comment>http://www.cprieto.com/post/2009/09/10/XUnitNET-Extensions-TheoryAttribute-y-DataAttribute.aspx#comment</wfw:comment>
    <wfw:commentRss>http://www.cprieto.com/syndication.axd?post=855fc3ca-c2d1-46fc-a937-0f6399e3df30</wfw:commentRss>
  <feedburner:origLink>http://www.cprieto.com/post/2009/09/10/XUnitNET-Extensions-TheoryAttribute-y-DataAttribute.aspx</feedburner:origLink></entry>
  <entry>
    <id>http://www.cprieto.com/post/2009/09/09/XUnitNET-Extensions-Trace-y-AutoRollback.aspx</id>
    <title>XUnit.NET Extensions, Trace y AutoRollback</title>
    <updated>2009-09-10T02:51:00+00:00</updated>
    <link rel="self" href="http://www.cprieto.com/post.aspx?id=af5a55e4-abc2-4a51-bb4d-3182a1d1b4d0" />
    <link href="http://feedproxy.google.com/~r/IdisposableThoughts/~3/i635V-_6dig/XUnitNET-Extensions-Trace-y-AutoRollback.aspx" />
    <author>
      <name>cristian</name>
    </author>
    <summary type="html">&lt;p&gt;A veces es necesario (por alguna razón extraña), mostrar el inicio y el fin de un test en la consola, con el tiempo de inicio y tiempo de fin (imaginémonos un test de performance sencillo); para esos menesteres tenemos a nuestro amigo TraceAttribute, que no hace más que enviar a la salida Trace el inicio y el fin del test, un atributo sencillo de entender.&lt;/p&gt;  &lt;pre class="brush: csharp;"&gt;[Fact, Trace]
public void Must_sent_to_trace_console_start_and_end_time_of_test()
{
    Assert.True(true);
}&lt;/pre&gt;

&lt;h3&gt;AutoRollbackAttribute&lt;/h3&gt;

&lt;p&gt;Comunmente cuando trabajamos con bases de datos, es bastante común el toparnos con transacciones, o mejor aún, toparnos con código que para simplificarnos las cosas debería correr dentro de una transacción. Por ejemplo, un test contra la base de datos que haga ciertos inserts, pero al final del test no nos importa el resultado y simplemente descartamos la transacción, por lo tanto nada fue insertado o modificado en la base de datos. Para esas tareas tenemos al atributo AutoRollbackAttribute, que simplemente al inicio del test crea una transacción y al final del test descarta la transacción. Es dificil probar código transaccional, pero con la “descripción” de que realiza el test, simplemente podemos ver si hay o no una transacción creada.&lt;/p&gt;

&lt;pre class="brush: csharp;"&gt;// NOTE: It Requires referece to System.Transactions
[Fact]
public void When_no_autorollback_is_present_there_is_no_transaction()
{
    Assert.Null(Transaction.Current);
}

[Fact, AutoRollback]
public void When_autorollback_is_present_there_is_a_transaction()
{
    Assert.NotNull(Transaction.Current);
}&lt;/pre&gt;&lt;img src="http://feeds.feedburner.com/~r/IdisposableThoughts/~4/i635V-_6dig" height="1" width="1"/&gt;</summary>
    <published>2009-09-10T02:51:00+00:00</published>
    <link rel="related" href="http://www.cprieto.com/post/2009/09/09/XUnitNET-Extensions-Trace-y-AutoRollback.aspx#comment" />
    <category term="Testing" />
    <category term=".Net" />
    <dc:publisher>cristian</dc:publisher>
    <pingback:server>http://www.cprieto.com/pingback.axd</pingback:server>
    <pingback:target>http://www.cprieto.com/post.aspx?id=af5a55e4-abc2-4a51-bb4d-3182a1d1b4d0</pingback:target>
    <slash:comments>0</slash:comments>
    <trackback:ping>http://www.cprieto.com/trackback.axd?id=af5a55e4-abc2-4a51-bb4d-3182a1d1b4d0</trackback:ping>
    <wfw:comment>http://www.cprieto.com/post/2009/09/09/XUnitNET-Extensions-Trace-y-AutoRollback.aspx#comment</wfw:comment>
    <wfw:commentRss>http://www.cprieto.com/syndication.axd?post=af5a55e4-abc2-4a51-bb4d-3182a1d1b4d0</wfw:commentRss>
  <feedburner:origLink>http://www.cprieto.com/post/2009/09/09/XUnitNET-Extensions-Trace-y-AutoRollback.aspx</feedburner:origLink></entry>
  <entry>
    <id>http://www.cprieto.com/post/2009/09/08/XUnitNET-Extensios-FreezeClock.aspx</id>
    <title>XUnit.NET Extensios, FreezeClock</title>
    <updated>2009-09-09T03:59:00+00:00</updated>
    <link rel="self" href="http://www.cprieto.com/post.aspx?id=c2ce98cc-cb17-460d-a6f6-495f9033a4fb" />
    <link href="http://feedproxy.google.com/~r/IdisposableThoughts/~3/oiTWzpxfKpo/XUnitNET-Extensios-FreezeClock.aspx" />
    <author>
      <name>cristian</name>
    </author>
    <summary type="html">&lt;p&gt;FreezeClock es uno de esos atributos maravillosos de XUnit.NET, nos permite “congelar” el reloj (tal como lo dice su nombre) en un tiempo dado y de esa manera comprobar que operaciones que dependen de tiempo se lleven acabo exitosamente. En versiones anteriores a la 1.5 FreezeClock cambiaba el tiempo mostrado por DateTime.Now, pero esto causaba problemas con ciertas implementaciones, así que en XUnit.NET 1.5 se debe utilizar la clase Clock y su propiedad Now (Clock.Now) en vez de DateTime.Now para efectos de las pruebas, de igual manera podríamos ver a Clock.Now como un clon de DateTime.Now en todos sus sentidos.&lt;/p&gt;  &lt;pre class="brush: csharp;"&gt;[Fact]
public void It_should_fail_because_clock_are_not_frozen()
{
    var clock1 = Clock.Now;
    Thread.Sleep(1000);
    var clock2 = Clock.Now;
    Assert.NotEqual(clock1, clock2);
}

[Fact, FreezeClock]
public void It_should_pass_because_clock_are_frozen()
{
    var clock1 = Clock.Now;
    Thread.Sleep(1000);
    var clock2 = Clock.Now;
    Assert.Equal(clock1, clock2);
}

[Fact]
public void Clock_time_must_be_lesser_than_a_second_different_from_now()
{
    var now = DateTime.Now;
    var clock = Clock.Now;
    Assert.True((clock - now).Milliseconds &amp;lt; 1000);
}&lt;/pre&gt;&lt;img src="http://feeds.feedburner.com/~r/IdisposableThoughts/~4/oiTWzpxfKpo" height="1" width="1"/&gt;</summary>
    <published>2009-09-09T03:59:00+00:00</published>
    <link rel="related" href="http://www.cprieto.com/post/2009/09/08/XUnitNET-Extensios-FreezeClock.aspx#comment" />
    <category term=".Net" />
    <category term="Testing" />
    <dc:publisher>cristian</dc:publisher>
    <pingback:server>http://www.cprieto.com/pingback.axd</pingback:server>
    <pingback:target>http://www.cprieto.com/post.aspx?id=c2ce98cc-cb17-460d-a6f6-495f9033a4fb</pingback:target>
    <slash:comments>0</slash:comments>
    <trackback:ping>http://www.cprieto.com/trackback.axd?id=c2ce98cc-cb17-460d-a6f6-495f9033a4fb</trackback:ping>
    <wfw:comment>http://www.cprieto.com/post/2009/09/08/XUnitNET-Extensios-FreezeClock.aspx#comment</wfw:comment>
    <wfw:commentRss>http://www.cprieto.com/syndication.axd?post=c2ce98cc-cb17-460d-a6f6-495f9033a4fb</wfw:commentRss>
  <feedburner:origLink>http://www.cprieto.com/post/2009/09/08/XUnitNET-Extensios-FreezeClock.aspx</feedburner:origLink></entry>
  <entry>
    <id>http://www.cprieto.com/post/2009/09/07/XUnitNET-Extensions-AssumeIdentity.aspx</id>
    <title>XUnit.NET Extensions, AssumeIdentity</title>
    <updated>2009-09-08T04:01:00+00:00</updated>
    <link rel="self" href="http://www.cprieto.com/post.aspx?id=78ef859c-6762-44ec-bd01-b23525284d22" />
    <link href="http://feedproxy.google.com/~r/IdisposableThoughts/~3/ZhHuedrw8Qs/XUnitNET-Extensions-AssumeIdentity.aspx" />
    <author>
      <name>cristian</name>
    </author>
    <summary type="html">&lt;p&gt;Una de las excelentes características y habilidades de XUnit.NET es su capacidad de ser extendido en muchas formas. Como parte del “paquete” de XUnit.NET, se incluye una librería adicional con atributos extras para cambiar en cierta manera el comportamiento de un test mientras realizamos las pruebas. A esta librería se le llama XUnit.NET Extensions y viene incluída con el download de XUnit.NET. Veremos algunos de los atributos extras incluídos con XUnit.NET Extensions.&lt;/p&gt;  &lt;p&gt;El primero en ver será AssumeIdentity, este atributo permite cambiar el Principal de la actual Thread de ejecución y agregarle el rol indicado por el atributo. Por defecto la thread de ejecución del test corre bajo el principal con la identity de “xunit”.&lt;/p&gt;  &lt;pre class="brush: csharp;"&gt;[Fact]
public void It_should_fail_because_user_has_no_role()
{
    Assert.False(Thread.CurrentPrincipal.IsInRole(&amp;quot;fake_role&amp;quot;));
}

[Fact]
[AssumeIdentity(&amp;quot;fake_role&amp;quot;)]
public void It_should_pass_because_user_is_in_role()
{
    Assert.True(Thread.CurrentPrincipal.IsInRole(&amp;quot;fake_role&amp;quot;));
}&lt;/pre&gt;

&lt;p&gt;Voilà! Luego converaremos de los otros atributos disponibles en este namespace.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/IdisposableThoughts/~4/ZhHuedrw8Qs" height="1" width="1"/&gt;</summary>
    <published>2009-09-08T04:01:00+00:00</published>
    <link rel="related" href="http://www.cprieto.com/post/2009/09/07/XUnitNET-Extensions-AssumeIdentity.aspx#comment" />
    <category term=".Net" />
    <category term="Testing" />
    <dc:publisher>cristian</dc:publisher>
    <pingback:server>http://www.cprieto.com/pingback.axd</pingback:server>
    <pingback:target>http://www.cprieto.com/post.aspx?id=78ef859c-6762-44ec-bd01-b23525284d22</pingback:target>
    <slash:comments>0</slash:comments>
    <trackback:ping>http://www.cprieto.com/trackback.axd?id=78ef859c-6762-44ec-bd01-b23525284d22</trackback:ping>
    <wfw:comment>http://www.cprieto.com/post/2009/09/07/XUnitNET-Extensions-AssumeIdentity.aspx#comment</wfw:comment>
    <wfw:commentRss>http://www.cprieto.com/syndication.axd?post=78ef859c-6762-44ec-bd01-b23525284d22</wfw:commentRss>
  <feedburner:origLink>http://www.cprieto.com/post/2009/09/07/XUnitNET-Extensions-AssumeIdentity.aspx</feedburner:origLink></entry>
  <entry>
    <id>http://www.cprieto.com/post/2009/08/27/XUnitNET-y-las-Colecciones.aspx</id>
    <title>XUnit.NET y las Colecciones</title>
    <updated>2009-08-28T04:03:00+00:00</updated>
    <link rel="self" href="http://www.cprieto.com/post.aspx?id=d943ce04-f08f-4626-ba54-4824442e9757" />
    <link href="http://feedproxy.google.com/~r/IdisposableThoughts/~3/sj4_11tZSCc/XUnitNET-y-las-Colecciones.aspx" />
    <author>
      <name>cristian</name>
    </author>
    <summary type="html">&lt;p&gt;Continuando con mi corta serie acerca de XUnit, algo que es sumamente útil en las pruebas es verificar si un item se encuentra o no en una colección. En XUnit.Net esto es sumamente fácil, simplemente usamos los métodos Contains y DoesNotContains los cuales también funcionan con strings.&lt;/p&gt;  &lt;pre class="brush: csharp;"&gt;private readonly int[] numbers = {1, 2, 3, 4, 5, 6};

[Fact]
public void It_must_return_true_if_number_is_in_collection()
{
    Assert.Contains(1, numbers);
}

[Fact]
public void It_must_return_true_if_number_is_not_in_collection()
{
    Assert.DoesNotContain(7, numbers);
}

[Fact]
public void It_must_return_true_if_string_contains_substring()
{
    Assert.Contains(&amp;quot;hola&amp;quot;, &amp;quot;hola mundo&amp;quot;);
}

[Fact]
public void It_must_return_true_if_string_does_not_contains_substring()
{
    Assert.DoesNotContain(&amp;quot;adios&amp;quot;, &amp;quot;hola mundo&amp;quot;);
}&lt;/pre&gt;

&lt;p&gt;De igual manera tenemos métodos para verificar si una colección se encuentra vacía o no, obviamente nuestros métodos en cuestion seran Empty y NotEmpty (estos no funcionan con strings).&lt;/p&gt;

&lt;pre class="brush: csharp;"&gt;private int[] numbers = { 1, 2, 3, 4, 5, 6 };

[Fact]
public void It_must_return_true_if_collection_is_not_empty()
{
    Assert.NotEmpty(numbers);
}

[Fact]
public void It_must_return_true_if_collection_is_empty()
{
    int[] empty = {};
    Assert.Empty(empty);
}&lt;/pre&gt;&lt;img src="http://feeds.feedburner.com/~r/IdisposableThoughts/~4/sj4_11tZSCc" height="1" width="1"/&gt;</summary>
    <published>2009-08-28T04:03:00+00:00</published>
    <link rel="related" href="http://www.cprieto.com/post/2009/08/27/XUnitNET-y-las-Colecciones.aspx#comment" />
    <category term="Testing" />
    <category term=".Net" />
    <dc:publisher>cristian</dc:publisher>
    <pingback:server>http://www.cprieto.com/pingback.axd</pingback:server>
    <pingback:target>http://www.cprieto.com/post.aspx?id=d943ce04-f08f-4626-ba54-4824442e9757</pingback:target>
    <slash:comments>0</slash:comments>
    <trackback:ping>http://www.cprieto.com/trackback.axd?id=d943ce04-f08f-4626-ba54-4824442e9757</trackback:ping>
    <wfw:comment>http://www.cprieto.com/post/2009/08/27/XUnitNET-y-las-Colecciones.aspx#comment</wfw:comment>
    <wfw:commentRss>http://www.cprieto.com/syndication.axd?post=d943ce04-f08f-4626-ba54-4824442e9757</wfw:commentRss>
  <feedburner:origLink>http://www.cprieto.com/post/2009/08/27/XUnitNET-y-las-Colecciones.aspx</feedburner:origLink></entry>
  <entry>
    <id>http://www.cprieto.com/post/2009/08/25/Creando-instancias-a-partir-del-nombre-y-assembly-de-la-clase.aspx</id>
    <title>Creando instancias a partir del nombre y assembly de la clase</title>
    <updated>2009-08-26T03:15:00+00:00</updated>
    <link rel="self" href="http://www.cprieto.com/post.aspx?id=47e01d98-9f89-415b-9a46-73234f59d572" />
    <link href="http://feedproxy.google.com/~r/IdisposableThoughts/~3/Iu8GlcniGxc/Creando-instancias-a-partir-del-nombre-y-assembly-de-la-clase.aspx" />
    <author>
      <name>cristian</name>
    </author>
    <summary type="html">&lt;p&gt;Entre las cosas interesantes que muchos hacemos a diario (o bueno, configuramos a diario) y que muy pocas veces nos preguntamos ¿cómo lo hicieron? esta el uso de handlers o providers en la .Net Framework. Por ejemplo, muchas veces vemos algo como:&lt;/p&gt;  &lt;pre class="brush: xml;"&gt;&amp;lt;viewStatePersisters default=&amp;quot;cachePersister&amp;quot;&amp;gt;
    &amp;lt;persisters&amp;gt;
        &amp;lt;add name=&amp;quot;pagePersister&amp;quot; type=&amp;quot;Rioshu.Web.ViewStateHandlers.TinyPagePersister, Rioshu.Web.ViewStateHandlers&amp;quot; /&amp;gt;
        &amp;lt;add name=&amp;quot;cachePersister&amp;quot; type=&amp;quot;Rioshu.Web.ViewStateHandlers.WebCachePersister, Rioshu.Web.ViewStateHandlers&amp;quot; /&amp;gt;
    &amp;lt;/persisters&amp;gt;
&amp;lt;/viewStatePersisters&amp;gt;&lt;/pre&gt;

&lt;p&gt;Y asumimos correctamente que la framework tomará esa información e instanciará el manejador o clase correspondiente que hemos indicado por su Full Qualified Name. ¿Cómo hace la framework para cargar el tipo correcto en el assembly correcto y luego instanciarlo?. La respuesta es simple, una mezcla de propiedades del tipo del objeto y a un amigo llamado “Activator”.&lt;/p&gt;

&lt;p&gt;Cuando me refiero al “tipo del objeto” no me refiero a si es Integer, String u Object. En la .Net Framework existe un “objeto especial” cuya responsabilidad es brindar información acerca del “tipo”, este objeto es System.Type, bien, Type tiene un método especial llamado GetType, al cual podemos pasarle el Full Qualified Name de la clase y el .Net Assembly and Type Loader intentará cargarlo.&lt;/p&gt;

&lt;pre class="brush: csharp;"&gt;public class TypeLoaderFacts
{
    private const string ExternalTypeName = &amp;quot;ExternalLibrary.ExternalServiceImplementation, ExternalLibrary&amp;quot;;
    
    [Fact]
    public void It_can_load_a_type_by_his_fqn()
    {
        var type = Type.GetType(ExternalTypeName);
        Assert.Equal(typeof(ExternalServiceImplementation), type);
    }
}&lt;/pre&gt;

&lt;p&gt;Bien, con cargar el tipo no hacemos mucho, es hora de inicializarlo.&lt;/p&gt;

&lt;pre class="brush: csharp;"&gt;public class TypeLoaderFacts
{
    private const string ExternalTypeName = &amp;quot;ExternalLibrary.ExternalServiceImplementation, ExternalLibrary&amp;quot;;

    private Type ExternalType;
    
    public TypeLoaderFacts()
    {
        ExternalType = Type.GetType(ExternalTypeName);
    }

    [Fact]
    public void It_can_load_a_type_by_his_fqn()
    {
        Assert.Equal(typeof(ExternalServiceImplementation), ExternalType);
    }

    [Fact]
    public void It_can_ctor_a_type()
    {
        var instance = Activator.CreateInstance(ExternalType);
        Assert.NotNull(instance);
    }
}&lt;/pre&gt;

&lt;p&gt;Pero como ustedes siguen también buenas prácticas, recordaran que es buena idea programar en base a interface y no a una clase concreta, así que podemos preguntarle al tipo si implementa la clase (algo que vamos a hacer usando un pequeño método de extensión).&lt;/p&gt;

&lt;pre class="brush: csharp;"&gt;public class TypeLoaderFacts
{
    private const string ExternalTypeName = &amp;quot;ExternalLibrary.ExternalServiceImplementation, ExternalLibrary&amp;quot;;

    private Type ExternalType;
    
    public TypeLoaderFacts()
    {
        ExternalType = Type.GetType(ExternalTypeName);
    }

    [Fact]
    public void It_can_load_a_type_by_his_fqn()
    {
        Assert.Equal(typeof(ExternalServiceImplementation), ExternalType);
    }

    [Fact]
    public void It_can_ctor_a_type()
    {
        var instance = Activator.CreateInstance(ExternalType);
        Assert.NotNull(instance);
    }

    [Fact]
    public void It_implements_our_interface()
    {
        Assert.True(ExternalType.IsImplementationOf&amp;lt;IExternalService&amp;gt;());
    }
}&lt;/pre&gt;

&lt;p&gt;Bien, les queda de tarea el averiguar como crear el extension method en cuestion :)&lt;/p&gt;

&lt;p&gt;Como ven es sumamente fácil llegar a implementar dynamic loaders en base a un archivo de configuración de esta manera (‘ala’ web.config de asp.net o NHibernate).&lt;/p&gt;

&lt;p&gt;Como siempre cualquier comentario estamos a un mensaje de distancia!&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/IdisposableThoughts/~4/Iu8GlcniGxc" height="1" width="1"/&gt;</summary>
    <published>2009-08-26T03:15:00+00:00</published>
    <link rel="related" href="http://www.cprieto.com/post/2009/08/25/Creando-instancias-a-partir-del-nombre-y-assembly-de-la-clase.aspx#comment" />
    <category term=".Net" />
    <category term="ASP.NET" />
    <dc:publisher>cristian</dc:publisher>
    <pingback:server>http://www.cprieto.com/pingback.axd</pingback:server>
    <pingback:target>http://www.cprieto.com/post.aspx?id=47e01d98-9f89-415b-9a46-73234f59d572</pingback:target>
    <slash:comments>0</slash:comments>
    <trackback:ping>http://www.cprieto.com/trackback.axd?id=47e01d98-9f89-415b-9a46-73234f59d572</trackback:ping>
    <wfw:comment>http://www.cprieto.com/post/2009/08/25/Creando-instancias-a-partir-del-nombre-y-assembly-de-la-clase.aspx#comment</wfw:comment>
    <wfw:commentRss>http://www.cprieto.com/syndication.axd?post=47e01d98-9f89-415b-9a46-73234f59d572</wfw:commentRss>
  <feedburner:origLink>http://www.cprieto.com/post/2009/08/25/Creando-instancias-a-partir-del-nombre-y-assembly-de-la-clase.aspx</feedburner:origLink></entry>
  <entry>
    <id>http://www.cprieto.com/post/2009/08/23/XUnitNET-y-las-Excepciones.aspx</id>
    <title>XUnit.NET y las Excepciones</title>
    <updated>2009-08-24T04:09:00+00:00</updated>
    <link rel="self" href="http://www.cprieto.com/post.aspx?id=9dd62de9-cd1e-490d-8386-898b0e5da9dd" />
    <link href="http://feedproxy.google.com/~r/IdisposableThoughts/~3/1Q7h0-oZH2w/XUnitNET-y-las-Excepciones.aspx" />
    <author>
      <name>cristian</name>
    </author>
    <summary type="html">&lt;p&gt;El día de ayer publiqué mi &lt;a href="http://www.cprieto.com/post/2009/08/21/XUnitNET-para-simples-mortales.aspx"&gt;primer post corto acerca de XUnit.Net&lt;/a&gt;, e inmediatamente después alguien me hizo una pregunta, la cuál parafraseando va algo así:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;“Puedo testear o ver el mensaje retornado por la excepción y así asegurarme que es una excepción específica”&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;No voy a discutir si esto esta bien o mal (en cuanto a la especificidad de la excepción), pero me parece interesante la pregunta. Como mencionamos ayer, podemos probar que una excepción es arrojada mediante el método “Throws” de la clase Assert:&lt;/p&gt;  &lt;pre class="brush: csharp;"&gt;public void ThrowOperation()
{
    throw new InvalidOperationException(&amp;quot;My message&amp;quot;);
}

[Fact]
public void TestAssertWithException()
{
    Assert.Throws&amp;lt;InvalidOperationException&amp;gt;(() =&amp;gt; ThrowOperation());
}&lt;/pre&gt;

&lt;p&gt;El detalle es que Assert.Throws no solamente se asegura que la excepción fue arrojada, sino que efectivamente retorna la excepción al sistema como un retorno más, de esta manera podemos hacer cosas como:&lt;/p&gt;

&lt;pre class="brush: csharp;"&gt;public void ThrowOperation()
{
    throw new InvalidOperationException(&amp;quot;My message&amp;quot;);
}

[Fact]
public void TestAssertWithMessage()
{
    var ex = Assert.Throws&amp;lt;InvalidOperationException&amp;gt;(() =&amp;gt; ThrowOperation());
    Assert.Equal(&amp;quot;My message&amp;quot;, ex.Message);
}&lt;/pre&gt;

&lt;p&gt;De esta manera no sólo podemos probar que la excepción es efectivamente arrojada, sino que también podemos probar sin ningún problema otros atributos de la excepción como tal. ¿Interesante verdad?&lt;/p&gt;

&lt;p&gt;Cómo siempre, cualquier pregunta o comentario somos oidos abiertos :)&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/IdisposableThoughts/~4/1Q7h0-oZH2w" height="1" width="1"/&gt;</summary>
    <published>2009-08-24T04:09:00+00:00</published>
    <link rel="related" href="http://www.cprieto.com/post/2009/08/23/XUnitNET-y-las-Excepciones.aspx#comment" />
    <category term=".Net" />
    <category term="Testing" />
    <dc:publisher>cristian</dc:publisher>
    <pingback:server>http://www.cprieto.com/pingback.axd</pingback:server>
    <pingback:target>http://www.cprieto.com/post.aspx?id=9dd62de9-cd1e-490d-8386-898b0e5da9dd</pingback:target>
    <slash:comments>0</slash:comments>
    <trackback:ping>http://www.cprieto.com/trackback.axd?id=9dd62de9-cd1e-490d-8386-898b0e5da9dd</trackback:ping>
    <wfw:comment>http://www.cprieto.com/post/2009/08/23/XUnitNET-y-las-Excepciones.aspx#comment</wfw:comment>
    <wfw:commentRss>http://www.cprieto.com/syndication.axd?post=9dd62de9-cd1e-490d-8386-898b0e5da9dd</wfw:commentRss>
  <feedburner:origLink>http://www.cprieto.com/post/2009/08/23/XUnitNET-y-las-Excepciones.aspx</feedburner:origLink></entry>
  <entry>
    <id>http://www.cprieto.com/post/2009/08/21/XUnitNET-para-simples-mortales.aspx</id>
    <title>XUnit.NET para simples mortales</title>
    <updated>2009-08-22T04:11:00+00:00</updated>
    <link rel="self" href="http://www.cprieto.com/post.aspx?id=8179e3b9-38c2-4035-b448-7f4d80331a9b" />
    <link href="http://feedproxy.google.com/~r/IdisposableThoughts/~3/WgYaHXD1nOo/XUnitNET-para-simples-mortales.aspx" />
    <author>
      <name>cristian</name>
    </author>
    <summary type="html">&lt;p&gt;Desde hace tiempo tengo ganas de escribir una serie de posts acerca de TDD y BDD, pero como siento que soy aún un minúsculo saltamontes en el gigantesco mundo de testing, decidí mejor comenzar por algo sumamente básico, qué tal si hablamos de &lt;a href="http://xunit.codeplex.com/"&gt;XUnit.Net&lt;/a&gt;?&lt;/p&gt;  &lt;p&gt;XUnit.Net es una testing framework creada por James Newkirk (ex-desarrolladore de NUnit) y Brad Wilson (ASP.NET developer en Microsoft) la cual agrega excelentes características a nuestra forma de realizar tests.&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Una sola instancia de test object por método del test &lt;/li&gt;    &lt;li&gt;No atributos de TearDown o SetUp, de tal manera que se usan los constructores de clase para inicializar el test y Dispose de IDisposable para finalizar el test &lt;/li&gt;    &lt;li&gt;Sin atributos de ExpectedException, en vez de eso las excepciones son tratadas como un verdadero assert de la forma Assert.Throws &lt;/li&gt;    &lt;li&gt;Uso extensivo de características de la Framework 2 en adelante (generics, delegados, expresiones lambda) &lt;/li&gt;    &lt;li&gt;Número pequeño de atributos &lt;/li&gt;    &lt;li&gt;Totalmente extensible (esta es la parte interesante) &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Un típico test en NUnit podría lucir algo así:&lt;/p&gt;  &lt;pre class="brush: csharp;"&gt;[TestFixture]
class TddSample
{
    private string text = string.Empty;
    private DisposableObject objectToDestroy;
    
    [SetUp]
    public void SetUp()
    {
        objectToDestroy = new ObjectToDestroy();
    }    

    [TearDown]
    public void TearDown()
    {
        objectToDestroy.Dispose();
    }

    [Test]
    public void It_must_be_initialized_with_a_simple_text_in_ctor()
    {
        Assert.IsNotNull(objectToDestroy);
    }

    [Test]
    public void It_should_add_two_numbers()
    {
        var result = 1 + 1;
        Assert.AreEqual(2, result);
    }
    
    [Test]
    [ExpectedException(typeof(DivideByZeroException))]
    public void It_throws_when_a_number_is_divided_by_zero()
    {
        int i = 0;
        int j = 1;
        var result = j / i;
    }

    [Test]
    [Ignore(&amp;quot;I want to break free!&amp;quot;)]
    public void It_must_skip_this_test()
    {
        Assert.True(false, &amp;quot;This test would fail&amp;quot;);
    }
}&lt;/pre&gt;

&lt;p&gt;Un equivalente en Xunit.Net podría verse así:&lt;/p&gt;

&lt;pre class="brush: csharp;"&gt;public class SimpleXunitTest : IDisposable
    {
        private readonly string text = string.Empty;
        private readonly DisposableObject objectToDispose;

        public SimpleXunitTest()
        {
            text = &amp;quot;hello world&amp;quot;;
            objectToDispose = new DisposableObject();
        }

        [Fact]
        public void It_must_be_initialized_with_a_simple_text_in_ctor()
        {
            Assert.False(string.IsNullOrEmpty(text));
        }

        [Fact]
        public void It_should_add_two_numbers()
        {
            int result = 1 + 1;
            Assert.Equal(2, result);
        }

        [Fact]
        public void It_throws_when_a_number_is_divided_by_zero()
        {
            int i = 0;
            int j = 1;
            Assert.Throws&amp;lt;DivideByZeroException&amp;gt;(() =&amp;gt; j/i);
        }

        [Fact(Skip = &amp;quot;I want to break free!&amp;quot;)]
        public void It_must_skip_this_test()
        {
            Assert.True(false, &amp;quot;This test would fail&amp;quot;);
        }

        public void Dispose()
        {
            objectToDispose.Dispose();
        }
    }&lt;/pre&gt;

&lt;p&gt;En el sitio del proyecto de XUnit.Net en Codeplex podemos encontrar más equivalencias entre NUnit y XUnit.Net. Una de las verdaderas riquezas de XUnit.Net (a mi criterio muy personal) es la librería adjunta con extensiones conocida como xunit.extensions.dll que contiene atributos especiales que no forman parte a simple vista de la framework de testing, pero nos pueden ayudar mucho en nuestras fixtures, por ejemplo: FreezeClock, o las grandiosas [Theory] con soporte para data inline en nuestros tests ;)&lt;/p&gt;

&lt;pre class="brush: csharp;"&gt;    public class SimpleXunitTest
    {
        [Theory]
        [InlineData(1, 2, 3)]
        [InlineData(2, 2, 4)]
        [InlineData(4, 5, 9)]
        public void It_should_add_two_numbers_correctly(int a, int b, int c)
        {
            var result = a + b;
            Assert.Equal(c, result);
        }
    }&lt;/pre&gt;

&lt;p&gt;La documentación indica varias formas de incluir la data para las “teorías”, que van desde la inline más simple hasta usar una base de datos y un archivo de Excel.&lt;/p&gt;

&lt;p&gt;En cuanto a runners, XUnit soporta TeamCity, MSBuild, R# (mediante proyecto hermano XUnit.Contrib), TestDriven.Net y muchos otros.&lt;/p&gt;

&lt;p&gt;Espero mi pequeña intro acerca de XUnit.Net les anime a probarlo. Saludos!&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/IdisposableThoughts/~4/WgYaHXD1nOo" height="1" width="1"/&gt;</summary>
    <published>2009-08-22T04:11:00+00:00</published>
    <link rel="related" href="http://www.cprieto.com/post/2009/08/21/XUnitNET-para-simples-mortales.aspx#comment" />
    <category term="Testing" />
    <category term=".Net" />
    <dc:publisher>cristian</dc:publisher>
    <pingback:server>http://www.cprieto.com/pingback.axd</pingback:server>
    <pingback:target>http://www.cprieto.com/post.aspx?id=8179e3b9-38c2-4035-b448-7f4d80331a9b</pingback:target>
    <slash:comments>1</slash:comments>
    <trackback:ping>http://www.cprieto.com/trackback.axd?id=8179e3b9-38c2-4035-b448-7f4d80331a9b</trackback:ping>
    <wfw:comment>http://www.cprieto.com/post/2009/08/21/XUnitNET-para-simples-mortales.aspx#comment</wfw:comment>
    <wfw:commentRss>http://www.cprieto.com/syndication.axd?post=8179e3b9-38c2-4035-b448-7f4d80331a9b</wfw:commentRss>
  <feedburner:origLink>http://www.cprieto.com/post/2009/08/21/XUnitNET-para-simples-mortales.aspx</feedburner:origLink></entry>
  <entry>
    <id>http://www.cprieto.com/post/2009/07/03/MVP-Awarded.aspx</id>
    <title>MVP Awarded</title>
    <updated>2009-07-04T04:17:00+00:00</updated>
    <link rel="self" href="http://www.cprieto.com/post.aspx?id=6820fa4e-afe7-4c65-a745-d773ffc6b117" />
    <link href="http://feedproxy.google.com/~r/IdisposableThoughts/~3/EX3_Cqt6E8s/MVP-Awarded.aspx" />
    <author>
      <name>cristian</name>
    </author>
    <summary type="html">&lt;p&gt;No sé porqué no lo había posteado antes, pero el día 1 de Julio recibí el siguiente mail en mi inbox:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;em&gt;Estimado/a Cristian Prieto,        &lt;br /&gt;Enhorabuena. Nos complace presentarle el programa de nombramiento MVP de Microsoft® de 2009. Este nombramiento se concede a los líderes excepcionales de la comunidad técnica que comparten de forma activa su experiencia de alta calidad y de la vida real con otras personas. Le agradecemos especialmente la contribución que ha realizado en las comunidades técnicas en el área de ASP/ASP.NET a lo largo del pasado año.&lt;/em&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Claro, esa es la versión “genérica” de un mail diciéndote que este año has sido galardonado como MVP, así que todo indica que ahora soy MVP en ASP.NET. Gracias a cada uno de ustedes, los que día a día han tenido que &lt;em&gt;soportarme&lt;/em&gt; durante mis charlas, escuchar y aguantar mis quejas sobre que X ó Y no funciona como debería o sobre &lt;em&gt;cómo debería hacerse el procedimiento X&lt;/em&gt;. Ahora más que nunca me dieron unas ganas increíbles de cooperar con la comunidad, ahora más que nunca creo que debemos instar más a la gente a mejorar con cada día, ahora más que nunca me siento en deseos de transformar a &lt;em&gt;Morts &lt;/em&gt;en &lt;em&gt;Elvis&lt;/em&gt;.&lt;/p&gt;  &lt;p&gt;Gracias a todos, gracias amigos…&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/IdisposableThoughts/~4/EX3_Cqt6E8s" height="1" width="1"/&gt;</summary>
    <published>2009-07-04T04:17:00+00:00</published>
    <link rel="related" href="http://www.cprieto.com/post/2009/07/03/MVP-Awarded.aspx#comment" />
    <category term="General" />
    <dc:publisher>cristian</dc:publisher>
    <pingback:server>http://www.cprieto.com/pingback.axd</pingback:server>
    <pingback:target>http://www.cprieto.com/post.aspx?id=6820fa4e-afe7-4c65-a745-d773ffc6b117</pingback:target>
    <slash:comments>0</slash:comments>
    <trackback:ping>http://www.cprieto.com/trackback.axd?id=6820fa4e-afe7-4c65-a745-d773ffc6b117</trackback:ping>
    <wfw:comment>http://www.cprieto.com/post/2009/07/03/MVP-Awarded.aspx#comment</wfw:comment>
    <wfw:commentRss>http://www.cprieto.com/syndication.axd?post=6820fa4e-afe7-4c65-a745-d773ffc6b117</wfw:commentRss>
  <feedburner:origLink>http://www.cprieto.com/post/2009/07/03/MVP-Awarded.aspx</feedburner:origLink></entry>
</feed>
