<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	xmlns:georss="http://www.georss.org/georss" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>!FrAgile Thinking &#187; TDD</title>
	<atom:link href="http://blog.jendrusz.pl/tag/tdd/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.jendrusz.pl</link>
	<description>Software Development, Agile, Microsoft .NET, Muzyka</description>
	<lastBuildDate>Thu, 23 Jul 2009 13:11:23 +0000</lastBuildDate>
	<language>pl</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.com/</generator>
<cloud domain='blog.jendrusz.pl' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://www.gravatar.com/blavatar/8887127bb14be5b999f37b1921b33c0a?s=96&#038;d=http://s2.wp.com/i/buttonw-com.png</url>
		<title>!FrAgile Thinking &#187; TDD</title>
		<link>http://blog.jendrusz.pl</link>
	</image>
	<atom:link rel="search" type="application/opensearchdescription+xml" href="http://blog.jendrusz.pl/osd.xml" title="!FrAgile Thinking" />
	<atom:link rel='hub' href='http://blog.jendrusz.pl/?pushpress=hub'/>
		<item>
		<title>Prezentacja &#8211; &#8222;Test Driven Development &#8211;  Dlaczego warto?&#8221; @ wroc.net</title>
		<link>http://blog.jendrusz.pl/2009/03/25/prezentacja-test-driven-development-dlaczego-warto-wrocnet/</link>
		<comments>http://blog.jendrusz.pl/2009/03/25/prezentacja-test-driven-development-dlaczego-warto-wrocnet/#comments</comments>
		<pubDate>Wed, 25 Mar 2009 21:28:38 +0000</pubDate>
		<dc:creator>jenrom</dc:creator>
				<category><![CDATA[Programowanie]]></category>
		<category><![CDATA[Prezentacja]]></category>
		<category><![CDATA[TDD]]></category>
		<category><![CDATA[Wroc.NET]]></category>

		<guid isPermaLink="false">http://blog.jendrusz.pl/?p=283</guid>
		<description><![CDATA[Czwartek 02 kwietnia 2009 o godz 19:00 będę miał przyjemność wygłosić prezentację na temat Test Driven Development w ramach spotkania wrocławskiej grupy .Net. Prezentacja ta będzie poświęcona przede wszystkim wprowadzeniu do metodyki Test Driven Development, koncentrując się na jej zaletach i wskazówkach potrzebnych do rozpoczęcia z nią przygody. Poza częścią teoretyczną zostanie również przedstawiony sposób [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.jendrusz.pl&blog=5537249&post=283&subd=jendrusz&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<p><div id="attachment_284" class="wp-caption alignright" style="width: 210px"><img src="http://jendrusz.files.wordpress.com/2009/03/red_green_refactor.png?w=200&#038;h=122" alt="źródło: http://blog.briandicroce.com/wp-content/uploads/2008/03/image50.png" title="red_green_refactor" width="200" height="122" class="size-medium wp-image-284" /><p class="wp-caption-text">źródło: http://blog.briandicroce.com/wp-content/uploads/2008/03/image50.png</p></div><strong>
<p>Czwartek 02 kwietnia 2009 o godz 19:00 </strong>będę miał przyjemność wygłosić prezentację na temat Test Driven Development w ramach spotkania wrocławskiej grupy .Net.</p>
<p>
Prezentacja ta będzie poświęcona przede wszystkim wprowadzeniu do metodyki Test Driven Development, koncentrując się na jej zaletach i wskazówkach potrzebnych do rozpoczęcia z nią przygody. Poza częścią teoretyczną zostanie również przedstawiony sposób implementacji przykładowej aplikacji przy zastosowaniu Test Driven Development.
</p>
<p>Rejestracja na to spotkanie odbywa się poprzez serwis <a href="http://www.goldenline.pl/spotkanie/xviii-spotkanie-wroclawskiej-grupy-nethttp://www.goldenline.pl/spotkanie/xviii-spotkanie-wroclawskiej-grupy-net"><strong>Goldenline</strong></a>. </p>
<p>Dodatkowy informacje można znaleźć na stronie <a href="http://wrocnet.org/"><strong>wrocławskiej grupy .Net</strong></a>.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/jendrusz.wordpress.com/283/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/jendrusz.wordpress.com/283/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/jendrusz.wordpress.com/283/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/jendrusz.wordpress.com/283/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/jendrusz.wordpress.com/283/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/jendrusz.wordpress.com/283/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/jendrusz.wordpress.com/283/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/jendrusz.wordpress.com/283/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/jendrusz.wordpress.com/283/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/jendrusz.wordpress.com/283/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.jendrusz.pl&blog=5537249&post=283&subd=jendrusz&ref=&feed=1" />]]></content:encoded>
			<wfw:commentRss>http://blog.jendrusz.pl/2009/03/25/prezentacja-test-driven-development-dlaczego-warto-wrocnet/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/8bcd127033469a9da5c4d426782db6cd?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">jenrom</media:title>
		</media:content>

		<media:content url="http://jendrusz.files.wordpress.com/2009/03/red_green_refactor.png?w=200" medium="image">
			<media:title type="html">red_green_refactor</media:title>
		</media:content>
	</item>
		<item>
		<title>Testowanie konfiguracji routingu w ASP.NET MVC</title>
		<link>http://blog.jendrusz.pl/2009/02/20/testowanie-konfiguracji-routingu-w-aspnet-mvc/</link>
		<comments>http://blog.jendrusz.pl/2009/02/20/testowanie-konfiguracji-routingu-w-aspnet-mvc/#comments</comments>
		<pubDate>Fri, 20 Feb 2009 08:16:42 +0000</pubDate>
		<dc:creator>jenrom</dc:creator>
				<category><![CDATA[Programowanie]]></category>
		<category><![CDATA[ASP.NET MVC]]></category>
		<category><![CDATA[TDD]]></category>

		<guid isPermaLink="false">http://jendrusz.wordpress.com/?p=223</guid>
		<description><![CDATA[Jedną z największych zalet architektury ASP.NET MVC jest prostota pisania testów jednostkowych, co umożliwia łatwą pracę tym wszystkim, którzy stosują TDD. Zdarzają się jednak przypadki, w których wymagana jest od programisty znajomość „zakamarków” frameworka w celu napisania, wydawałoby się prostego, testu. Jednym z takich przypadków jest testowanie routingu zapytań do odpowiedniej akcji kontrolera. Głównym problemem [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.jendrusz.pl&blog=5537249&post=223&subd=jendrusz&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<p>Jedną z największych zalet architektury ASP.NET MVC jest prostota pisania testów jednostkowych, co umożliwia łatwą pracę tym wszystkim, którzy stosują TDD.  Zdarzają się jednak przypadki, w których wymagana jest od programisty znajomość „zakamarków” frameworka w celu napisania, wydawałoby się prostego, testu. Jednym z takich przypadków jest testowanie <a href="http://msdn.microsoft.com/en-us/library/system.web.routing.aspx">routingu</a> zapytań do odpowiedniej akcji kontrolera.</p>
<p>Głównym problemem jest sprzężenie komponentów routingu z klasą HttpContext. Klasa <a href="http://msdn.microsoft.com/en-us/library/system.web.httpcontext.aspx">HttpContext</a> moim zdaniem jest zmorą w przypadku wszystkich testów jednostkowych funkcjonalności wykorzystujących klasy z przestrzeni <a href="http://msdn.microsoft.com/en-us/library/system.web.aspx">System.Web</a>. W przeszłości, pisząc aplikacje oparte o ASP.NET Web Forms zmuszony byłem do tworzenia klasy adoptującej HttpContext, którą w prosty sposób potrafiłem zastąpić na potrzeby testów obiektami <a href="http://xunitpatterns.com/Test%20Double.html">Test Double</a>. W ASP.NET MVC problem ten został wyeliminowany poprzez wprowadzenie klasy <a href="http://msdn.microsoft.com/en-us/library/system.web.httpcontextbase.aspx">HttpContextBase</a>. Mimo to nadal pozostaje problem z tym, że klasa ta posiada zbyt wiele metod i właściwości zwracających często nam potrzebne obiekty. Najczęściej chodzi tutaj o obiekty klas HttpResponse i HttpRequest. Klasy te, podobnie jak klasa HttpContext, posiadają swoje odpowiedniki pozwalające na łatwiejsze testowanie &#8211; <a href="http://msdn.microsoft.com/en-us/library/system.web.httpresponsebase.aspx">HttpResponseBase </a>i <a href="http://msdn.microsoft.com/en-us/library/system.web.httprequestbase.aspx">HttpRequestBase</a>.</p>
<p>To wszystko prowadzi do tego, że testowanie routingu w ASP.NET MVC wymaga z naszej strony dużego nakładu pracy by przygotować odpowiednio obiekty potrzebne do wykonania się testu. Na dodatek to nie koniec problemów. Wykorzystując routing w ASP.NET MVC, jako programiści nie jesteśmy zmuszeni do pisania skomplikowanej logiki, gdyż jedyne co musimy zrobić, to dodać jedną linię kodu domyślnie w klasie Application (global.asax) i już nasze zapytanie HTTP zostanie  przekierowane do odpowiedniej akcji. W testach już tak łatwo nie jest, dlatego, że nie jesteśmy w stanie w prosty sposób sprawdzić, która z metod, będąca naszą akcją, zostanie wywołana. Aby dojść do sposobu pozwalającego na sprawdzenie wyniku, wymagane od nas jest zapoznanie się z operacjami wchodzącymi w skład routingu zapytania, które zostały przeze mnie opisane w jednym z poprzednich <a href="http://blog.jendrusz.pl/2009/01/16/pierwsze-spojrzenie-na-aspnet-mvc-od-wnetrza/">postów</a>, oraz z paroma innymi klasami takimi jak ControllerActionInvoker czy MvcHandler.</p>
<p>W efekcie końcowym stworzymy test podobny do tego jak ten, poniżej, który weryfikują poprawność domyślnej konfigurację routingu.</p>
<pre>
//routes.MapRoute("Default",  "{controller}/{action}/{id}", new { controller = "Home", action = "Index", id = "" }

[Test]
public void should_route_to_the_home_page()
{
var httpContext = MockRepository.GenerateStub();
var httpRequest = MockRepository.GenerateStub();
httpContext.Stub(x =&gt; x.Request).Return(httpRequest);
string testedRequestUrl = "~/Home";
httpRequest.Stub(x =&gt; x.AppRelativeCurrentExecutionFilePath).Return(testedRequestUrl);
var routeData = RouteTable.Routes.GetRouteData(httpContext);
var controllerName = routeData.GetRequiredString("controller");
var actionName = routeData.GetRequiredString("action");
Assert.IsTrue(string.Equals(controllerName, "Home",StringComparison.OrdinalIgnoreCase));
Assert.IsTrue(string.Equals(actionName, "Index", StringComparison.OrdinalIgnoreCase));
}
</pre>
<p>W sumie okazuje się, że test nie jest znów tak trudny jak to się zapowiadało, ale… Zawsze musi być jakieś, ale:). Powyższy test może stwarzać problemy w trakcie refaktoryzacji. Kryteria powyższego testu polegają na porównywaniu ciągu znaków określających nazwę akcji (metody) i nazwę klasy kontrolera, który posiada daną akcję. Problem leży w tym, że ciągi te nie zostaną automatycznie zastąpione przez narzędzia refaktoryzujące takie jak naprzykład Resharper w przypadku zmiany nazwy akcji lub kontrolera.</p>
<p>Istnieje jednak alternatywa i jest ona dostępna w ramach projektu <a href="http://www.codeplex.com/MVCContrib">MVC Contrib</a>. Biblioteka MvcContrib.TestHelper wchodząca w skład tego projektu posiada klasę <a href="http://code.google.com/p/mvccontrib/source/browse/trunk/src/MvcContrib.TestHelper/MvcContrib.TestHelper/RouteTestingExtensions.cs?spec=svn769&amp;r=769">RouteTestingExtensions</a> z metodami rozszerzającymi pozwalającymi w bardzo prosty sposób dokonać odrobinę magii opartej o lambda expressions, co w efekcie pozwoli nam pisać testy takie jak ten poniższy.</p>
<pre>
[Test]
public void should_route_to_the_home_page()
{
"~/home".Route().ShouldMapTo(h =&gt; h.Index());
}
</pre>
<p>Jak widać test ten jest banalnie prosty i nie wymaga z naszej strony prawie że żadnego nakładu pracy, a co najważniejsze każdy jest w stanie rozpocząć przygodę z testowaniem przez siebie zdefiniowanych route.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/jendrusz.wordpress.com/223/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/jendrusz.wordpress.com/223/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/jendrusz.wordpress.com/223/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/jendrusz.wordpress.com/223/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/jendrusz.wordpress.com/223/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/jendrusz.wordpress.com/223/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/jendrusz.wordpress.com/223/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/jendrusz.wordpress.com/223/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/jendrusz.wordpress.com/223/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/jendrusz.wordpress.com/223/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.jendrusz.pl&blog=5537249&post=223&subd=jendrusz&ref=&feed=1" />]]></content:encoded>
			<wfw:commentRss>http://blog.jendrusz.pl/2009/02/20/testowanie-konfiguracji-routingu-w-aspnet-mvc/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/8bcd127033469a9da5c4d426782db6cd?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">jenrom</media:title>
		</media:content>
	</item>
	</channel>
</rss>