<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet href="/stylesheets/rss.css" type="text/css"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/">
  <channel>
    <title>Jaros&#322;aw Zabie&#322;&#322;o - BLOG: Shoulda - pozbycie si&#281; magii RSpec'a</title>
    <link>http://blog.zabiello.com/articles/2007/10/28/shoulda-rspec</link>
    <language>en-us</language>
    <ttl>40</ttl>
    <description>moje notatki, linki, komentarze</description>
    <item>
      <title>Shoulda - pozbycie si&#281; magii RSpec'a</title>
      <description>&lt;p&gt;Od jakiego&#347; czasu w kr&#281;gach Ruby on Rails mo&#380;na zauwa&#380;y&#263; przesuni&#281;cie paradygmatu w zakresie metodologii testowania kodu. Popularyzowane podej&#347;cie &lt;a href="http://en.wikipedia.org/wiki/Test-driven_development"&gt;&lt;span class="caps"&gt;TDD&lt;/span&gt;&lt;/a&gt; (Test Driven Development) zostaje wypierane przez &lt;a href="http://en.wikipedia.org/wiki/Behavior_driven_development"&gt;&lt;span class="caps"&gt;BDD&lt;/span&gt;&lt;/a&gt; (Behaviour Driven Development). Jedn&#261; z bardziej promowanych bibliotek jest RSpec. Mimo &#380;e kusi sk&#322;adni&#261; przypominaj&#261;c&#261; naturalny j&#281;zyk angielski, pr&#243;ba wykorzystania &lt;a href="http://rspec.rubyforge.org/"&gt;RSPec&lt;/a&gt; w rzeczywistym projekcie szybko mo&#380;e sta&#263; si&#281; co najmniej k&#322;opotliwe.&lt;/p&gt;


	&lt;p&gt;RSpec aby wygl&#261;da&#322; tak &#322;adnie jak wygl&#261;da, wykorzystuje dynamik&#281; i specyficzne w&#322;a&#347;ciwo&#347;ci Rubiego. Ruby pozwala opuszcza&#263; nawiasy w metodach, niezauwa&#380;enie otwiera&#263; i modyfikowa&#263; klasy swoich bibliotek (w tym wbudowanych i standardowych) oraz og&#243;lnie dosy&#263; dobrze nadaje si&#281; do tworzenia nowych j&#281;zyk&#243;w do specyficznych zada&#324; (&lt;a href="http://en.wikipedia.org/wiki/Domain-specific_programming_language"&gt;&lt;span class="caps"&gt;DSL&lt;/span&gt;&lt;/a&gt;, Domain Specific Language). Innymi s&#322;owy, cen&#261; za korzystanie ze sk&#322;adni RSpec jest konieczno&#347;&#263; opanowania tego nowego j&#281;zyka. I tu zaczynaj&#261; si&#281; schody&amp;#8230;&lt;/p&gt;


	&lt;p&gt;Dokumentacja do RSpec jest najdelikatniej m&#243;wi&#261;c, niekompletna. Przyk&#322;ad&#243;w u&#380;ycia RSpec trzeba szuka&#263; po ca&#322;ym internecie. Dokumentacja wygenerowana z kodu &#378;r&#243;d&#322;owego &lt;span class="caps"&gt;API&lt;/span&gt; do RSpec jest r&#243;wnie&#380; s&#322;abej jako&#347;ci. Brakuje przyk&#322;ad&#243;w, brakuje nawet wzmianki co do niekt&#243;rych metod, jakie s&#261; u&#380;ywane. Np. we&#378;my taki prosty przyk&#322;ad:&lt;/p&gt;


&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&gt;&lt;span class="ident"&gt;response&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;should&lt;/span&gt; &lt;span class="ident"&gt;have_text&lt;/span&gt;&lt;span class="punct"&gt;(/&lt;/span&gt;&lt;span class="regex"&gt;My String&lt;/span&gt;&lt;span class="punct"&gt;/)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

	&lt;p&gt;Pr&#243;ba znalezienia czego&#347; sensownego na stronie z &lt;a href="http://rspec.rubyforge.org/rdoc/index.html"&gt;&lt;span class="caps"&gt;API&lt;/span&gt; RSpec&amp;#8217;a&lt;/a&gt; jest beznadziejna. Nie ma nic napisane o metodzie &amp;#8220;response&amp;#8221;, nie ma nic o metodzie &amp;#8220;have_text&amp;#8221; ani w og&#243;le o tym, co mo&#380;na przekaza&#263; do metody should(). Po prostu pojawia si&#281; co&#347; niczym kr&#243;lik z kapelusza magika. I tak jest z wieloma elementami sk&#322;adni RSpec&amp;#8217;a. S&#261; jakie&#347; pojedy&#324;cze elementy, ale nie wiadomo kt&#243;re, i jak je &#322;&#261;czy&#263; ze sob&#261;. &lt;strong&gt;Je&#347;li Ruby ma zbytnie sk&#322;onno&#347;ci do &amp;#8220;magii&amp;#8221;, to RSpec magia do kwadratu.&lt;/strong&gt; Co&#347; si&#281; pojawia i znika nie wiadomo sk&#261;d, ani dlaczego. To jest po prostu chore. Po wielu dniach takiej walki z RSpec doszed&#322;em do wniosku, &#380;e to droga donik&#261;d. Tylko, &#380;e z drugiej strony, cofni&#281;cie si&#281; z &lt;span class="caps"&gt;BDD&lt;/span&gt; do &lt;span class="caps"&gt;TDD&lt;/span&gt; te&#380; nie brzmi atrakcyjnie.&lt;/p&gt;


	&lt;p&gt;Czy jest zatem jakie&#347; wyj&#347;cie po&#347;rednie? Tzn. rozwi&#261;zanie kt&#243;re nie rezygnuj&#261;c z elegancji &lt;span class="caps"&gt;BDD&lt;/span&gt; by&#322;oby oparty na znanych, dobrze opisanych metodach, bez &#380;adnej kolejnej, magicznej sk&#322;adni? Wydaje si&#281;, &#380;e powy&#380;sze za&#322;o&#380;enia spe&#322;nia projekt  &lt;a href="http://thoughtbot.com/projects/shoulda"&gt;Shoulda&lt;/a&gt;. M&#243;j pierwsze wra&#380;enia z kontaktu z t&#261; bibliotek&#261;, jak na razie, s&#261; dosy&#263; dobre. Shoulda wprowadza du&#380;o mniej nowej sk&#322;adni ni&#380; RSpec. Wi&#281;kszo&#347;&#263; test&#243;w wykorzystuje stare, sprawdzone &amp;#8220;asserty&amp;#8221;. I o to chodzi. Nowa metodologia i znana, sprawdzona biblioteka standardowa Rubiego Test::Unit.&lt;/p&gt;


&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&gt;&lt;span class="keyword"&gt;class &lt;/span&gt;&lt;span class="class"&gt;UserTest&lt;/span&gt; &lt;span class="punct"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="constant"&gt;Test&lt;/span&gt;&lt;span class="punct"&gt;::&lt;/span&gt;&lt;span class="constant"&gt;Unit&lt;/span&gt; 
  &lt;span class="ident"&gt;context&lt;/span&gt; &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;A User instance&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;&lt;/span&gt; &lt;span class="keyword"&gt;do&lt;/span&gt;
    &lt;span class="ident"&gt;setup&lt;/span&gt; &lt;span class="keyword"&gt;do&lt;/span&gt;
      &lt;span class="attribute"&gt;@user&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="constant"&gt;User&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;find&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="symbol"&gt;:first&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;
    &lt;span class="keyword"&gt;end&lt;/span&gt;

    &lt;span class="ident"&gt;should&lt;/span&gt; &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;return its full name&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;&lt;/span&gt; 
      &lt;span class="ident"&gt;assert_equal&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;John Doe&lt;/span&gt;&lt;span class="punct"&gt;',&lt;/span&gt; &lt;span class="attribute"&gt;@user&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;full_name&lt;/span&gt;
    &lt;span class="keyword"&gt;end&lt;/span&gt;

    &lt;span class="ident"&gt;context&lt;/span&gt; &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;with a profile&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;&lt;/span&gt; &lt;span class="keyword"&gt;do&lt;/span&gt;
      &lt;span class="ident"&gt;setup&lt;/span&gt; &lt;span class="keyword"&gt;do&lt;/span&gt;
        &lt;span class="attribute"&gt;@user&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;profile&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="constant"&gt;Profile&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;find&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="symbol"&gt;:first&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;
      &lt;span class="keyword"&gt;end&lt;/span&gt;

      &lt;span class="ident"&gt;should&lt;/span&gt; &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;return true when sent #has_profile?&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;&lt;/span&gt; 
        &lt;span class="ident"&gt;assert&lt;/span&gt; &lt;span class="attribute"&gt;@user&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;has_profile?&lt;/span&gt;
      &lt;span class="keyword"&gt;end&lt;/span&gt;
    &lt;span class="keyword"&gt;end&lt;/span&gt;
  &lt;span class="keyword"&gt;end&lt;/span&gt;
&lt;span class="keyword"&gt;end&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

	&lt;p&gt;Jeszcze jedna uwaga odno&#347;nie implementacji &lt;span class="caps"&gt;BDD&lt;/span&gt; w innych j&#281;zykach. Troch&#281; mia&#322;em problem&#243;w ze znalezieniem biblioteki do Pythona. &lt;a href="http://pycheesecake.org/wiki/PythonTestingToolsTaxonomy"&gt;Znaleziona obszerna lista bibliotek&lt;/a&gt; do Pythona nie ma kategorii &lt;span class="caps"&gt;BDD&lt;/span&gt;. Wygl&#261;da na to, &#380;e &lt;span class="caps"&gt;BDD&lt;/span&gt; i w og&#243;le kwesti&#261; testowania bardziej przejmuj&#261; si&#281; u&#380;ytkownicy Rubiego. Ale na szcz&#281;&#347;cie na stronie na stronie &lt;a href="http://behaviour-driven.org/Implementations"&gt;http://behaviour-driven.org/Implementations&lt;/a&gt; zamieszczono informacje kt&#243;rych mi brakowa&#322;o. Jeden z link&#243;w prowadzi do &lt;a href="http://darcs.idyll.org/~t/projects/pinocchio/doc/"&gt;Pinocchio&lt;/a&gt;, kt&#243;ry jest  rozszerzeniem bibliotek &lt;a href="http://code.google.com/p/python-nose/"&gt;Nose&lt;/a&gt; u&#380;ywanej m.in. przez framework &lt;a href="http://pylonshq.com"&gt;Pylons&lt;/a&gt;. Co ciekawe, jest te&#380; nawet &lt;a href="http://jania.pe.kr/aw/moin.cgi/JSSpec"&gt;JSSpec&lt;/a&gt;, biblioteka &lt;span class="caps"&gt;BDD&lt;/span&gt; dla j&#281;zyka Javascript.&lt;/p&gt;


	&lt;p&gt;Zobacz te&#380;:&lt;/p&gt;


	&lt;p&gt;&lt;strong&gt;Beyond Test Driven Development: Behaviour Driven Development&lt;/strong&gt;&lt;/p&gt;


	&lt;blockquote&gt;
		&lt;p&gt;Wyk&#322;adowc&#261; jest Dave Astels, wsp&#243;&#322;autor ksi&#261;&#380;ki &lt;a href="http://www.amazon.com/Practical-Guide-eXtreme-Programming/dp/0130674826"&gt;A Practical Guide to eXtreme Programming&lt;/a&gt; (Google TechTalks)&lt;/p&gt;
	&lt;/blockquote&gt;


&lt;object width="425" height="355"&gt;&lt;param name="movie" value="http://www.youtube.com/v/oOFfHzrIDPk&amp;#38;rel=1"&gt;&lt;/param&gt;&lt;param name="wmode" value="transparent"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/oOFfHzrIDPk&amp;#38;rel=1" type="application/x-shockwave-flash" wmode="transparent" width="425" height="355"&gt;&lt;/embed&gt;&lt;/object&gt;

	&lt;ul&gt;
	&lt;li&gt;&lt;a href="http://thoughtbot.com/projects/shoulda"&gt;Shoulda&lt;/a&gt; &amp;#8211; strona g&#322;&#243;wna&lt;/li&gt;
		&lt;li&gt;&lt;a href="http://chneukirchen.org/blog/archive/2007/01/announcing-test-spec-0-3-a-bdd-interface-for-test-unit.html"&gt;Test/Spec&lt;/a&gt; &amp;#8211; podobny pomys&#322; co Shoulda &amp;#8211; &lt;span class="caps"&gt;BDD&lt;/span&gt; oparte a Unit::Test.&lt;/li&gt;
		&lt;li&gt;&lt;a href="http://behaviour-driven.org/"&gt;Behavour Driven Development&lt;/a&gt; &amp;#8211; strona g&#322;&#243;wna &lt;span class="caps"&gt;BDD&lt;/span&gt;&lt;/li&gt;
		&lt;li&gt;&lt;a href="http://behaviour-driven.org/Implementations"&gt;Behaviour Driven Development &amp;#8211; implementations&lt;/a&gt; &amp;#8211; implementacje &lt;span class="caps"&gt;BDD&lt;/span&gt; dla: Boo, C#, .NET, Delphi, Javy, Javascript, Ruby i &lt;strong&gt;Pythona&lt;/strong&gt;.&lt;/li&gt;
		&lt;li&gt;&lt;a href="http://www.stifflog.com/pl/index.php/2006/11/27/behaviour-driven-development/"&gt;Wprowadzenie do RSpec &amp;#8211; &lt;span class="caps"&gt;BDD&lt;/span&gt;&lt;/a&gt; &amp;#8211; polskie wprowadzenie do RSpec i &lt;span class="caps"&gt;BDD&lt;/span&gt;&lt;/li&gt;
	&lt;/ul&gt;</description>
      <pubDate>Sun, 28 Oct 2007 18:45:00 +0100</pubDate>
      <guid isPermaLink="false">urn:uuid:eb7df053-32bf-4755-95ba-e9543b215f6d</guid>
      <author>Jaros&#322;aw Zabie&#322;&#322;o</author>
      <link>http://blog.zabiello.com/articles/2007/10/28/shoulda-rspec</link>
      <category>bdd</category>
      <category>tdd</category>
      <category>rspec</category>
      <category>rails</category>
      <category>metodologia</category>
      <category>pinnocchio</category>
      <category>ruby</category>
      <category>python</category>
      <category>pylons</category>
    </item>
    <item>
      <title>"Shoulda - pozbycie si&#281; magii RSpec'a" by szeryf</title>
      <description>&lt;p&gt;Limak: mo&#380;e metoda powinna by&#263; metod&#261; klasy? (def self.method&amp;#8230;)&lt;/p&gt;</description>
      <pubDate>Mon, 12 Nov 2007 20:14:04 +0100</pubDate>
      <guid isPermaLink="false">urn:uuid:f94925da-f608-479a-862c-aac8007cccfa</guid>
      <link>http://blog.zabiello.com/articles/2007/10/28/shoulda-rspec#comment-1224</link>
    </item>
    <item>
      <title>"Shoulda - pozbycie si&#281; magii RSpec'a" by Radarek</title>
      <description>&lt;p&gt;Wr&#243;ci&#322;em jeszcze do tego tematu, bo zag&#322;&#281;biam si&#281; troch&#281; w bdd i rspec (a jednak:)).&lt;/p&gt;


	&lt;p&gt;Ten przyk&#322;ad jednak ma b&#322;&#261;d, tak jak zwr&#243;ci&#322; uwag&#281; maniel. Brakuje &amp;#8220;do&amp;#8221; w:&lt;/p&gt;


	&lt;p&gt;should &amp;#8220;return true when sent #has_profile?&amp;#8221; 
 assert @user.has_profile?
end&lt;/p&gt;


	&lt;p&gt;Na stronie domoweh shoulda jest z &amp;#8216;do&amp;#8217;.&lt;/p&gt;</description>
      <pubDate>Fri, 09 Nov 2007 14:55:06 +0100</pubDate>
      <guid isPermaLink="false">urn:uuid:6bffb3ee-9492-427a-9d4e-df7b5507e045</guid>
      <link>http://blog.zabiello.com/articles/2007/10/28/shoulda-rspec#comment-1218</link>
    </item>
    <item>
      <title>"Shoulda - pozbycie si&#281; magii RSpec'a" by Limak</title>
      <description>&lt;p&gt;To ja mam pytanie &amp;#8211; czy kto&#347; wie jak w Shoulda wyrzuci&#263; powtarzaj&#261;c&#261; si&#281; w dw&#243;ch kontekstach funkcjonalno&#347;&#263; do metody &amp;#8211; bo narzeka, &#380;e zdefiniowanej metody nie widzi&amp;#8230;&lt;/p&gt;</description>
      <pubDate>Thu, 08 Nov 2007 14:40:14 +0100</pubDate>
      <guid isPermaLink="false">urn:uuid:ee4c3059-8c03-48a7-b75b-d5ad2e152d42</guid>
      <link>http://blog.zabiello.com/articles/2007/10/28/shoulda-rspec#comment-1208</link>
    </item>
    <item>
      <title>"Shoulda - pozbycie si&#281; magii RSpec'a" by Jaros&#322;aw Zabie&#322;&#322;o</title>
      <description>&lt;p&gt;maniel: Nie. Przyk&#322;ad jest skopiowany z screencasta &lt;a href="http://peepcode.com/products/rspec-controllers-and-tools" rel="nofollow"&gt;RSpec, part III&lt;/a&gt;&lt;/p&gt;


	&lt;p&gt;Kaminski Pawel: &#8220;Plain text stories&#8221; mo&#380;na r&#243;wnie dobrze wykona&#263; na bazie biblioteki Shoulda.&lt;/p&gt;</description>
      <pubDate>Wed, 31 Oct 2007 22:54:11 +0100</pubDate>
      <guid isPermaLink="false">urn:uuid:e7f136de-63a7-455b-83da-d84c344d875f</guid>
      <link>http://blog.zabiello.com/articles/2007/10/28/shoulda-rspec#comment-1156</link>
    </item>
    <item>
      <title>"Shoulda - pozbycie si&#281; magii RSpec'a" by maniel</title>
      <description>&lt;p&gt;hmm, czy sampel na stronie domowej projektu [ten kt&#243;ry skopiowa&#322;e&#347;] nie jest czasami wadliwy? chodzi mi o `should`, tam nie powinno by&#263; &amp;#8216;do&amp;#8217; po parametrze?:)&lt;/p&gt;</description>
      <pubDate>Tue, 30 Oct 2007 21:04:25 +0100</pubDate>
      <guid isPermaLink="false">urn:uuid:1bd45927-2adc-4d27-b931-dc75f0f29545</guid>
      <link>http://blog.zabiello.com/articles/2007/10/28/shoulda-rspec#comment-1149</link>
    </item>
    <item>
      <title>"Shoulda - pozbycie si&#281; magii RSpec'a" by Radarek</title>
      <description>&lt;p&gt;No w&#322;a&#347;nie mia&#322;em dok&#322;adnie takie same odczucia odno&#347;nie RSpec. Przegl&#261;da&#322;em kiedy&#347; jego dokumentacj&#281;, ale nijak to si&#281; mia&#322;o do tego co widzia&#322;em na blogach, tutorialach. Nie znalaz&#322;em nigdzie dok&#322;adnego opis jakie konstrukcje mo&#380;na stosowa&#263;. Raz jest smth.should be_xxx, raz smth.should.be.xxx. To co jest fajne to czytelno&#347;&#263;, bo niezale&#380;nie od tego czy to by&#322;a 1 czy 2 forma umiem to przeczyta&#263;. Ale przecie&#380; wcze&#347;niej to nale&#380;y napisa&#263;&amp;#8230;&lt;/p&gt;


	&lt;p&gt;Wydaje mi si&#281;, &#380;e warto jednak da&#263; mu szans&#281;, ale ograniczy&#263; si&#281; do kilku typowych konstrukcji.&lt;/p&gt;</description>
      <pubDate>Tue, 30 Oct 2007 15:04:29 +0100</pubDate>
      <guid isPermaLink="false">urn:uuid:10763092-42b9-402e-8edc-234cec472729</guid>
      <link>http://blog.zabiello.com/articles/2007/10/28/shoulda-rspec#comment-1148</link>
    </item>
    <item>
      <title>"Shoulda - pozbycie si&#281; magii RSpec'a" by Kaminski Pawel</title>
      <description>&lt;p&gt;A ja zdecydowanie pozostane przy Rspec, chociaz musze przyznac ze dokumentacja rzeczywiscie pozostawia wiele do zyczenia. Bardzo pomocna natomiast jest lista dyskusyjna rspeca gdzie wiekszosc pytan zostaje rozwiazanych poprzez samych tworcow min. D.Chelimsky czy A.Hellesoy. I  &amp;#8220;plain text stories&amp;#8221; wygladaja rzeczywiscie imponujaco!&lt;/p&gt;</description>
      <pubDate>Tue, 30 Oct 2007 12:15:18 +0100</pubDate>
      <guid isPermaLink="false">urn:uuid:a990bdbe-d9eb-4f6c-8aa5-7c16b98907e1</guid>
      <link>http://blog.zabiello.com/articles/2007/10/28/shoulda-rspec#comment-1146</link>
    </item>
    <item>
      <title>"Shoulda - pozbycie si&#281; magii RSpec'a" by szeryf</title>
      <description>&lt;p&gt;Moje odczucia do RSpeca ewoluowaly podobnie do twoich: na poczatku spodobala mi sie niby-naturalna skladnia i sposob organizacji testow. Potem entuzjazm troche przygasl, a gdy ostatnio mialem do czynienia z dosc sporym systemem, w ktorym zamiast test/unit uzywano RSpeca&amp;#8212;entuzjazm zamienil sie w niechec.&lt;/p&gt;


	&lt;p&gt;Teraz stosuje shoulda i jestem zadowolony. Najwieksza zaleta wydaje mi sie mozliwosc bezproblemowej integracji z tradycyjnym testami. Dzieki temu nie ma problemow, jezeli nie wszyscy programisci w projekcie lubia nowiniki :)&lt;/p&gt;


	&lt;p&gt;A co do podzialu TDD=test/unit, BDD=RSpec, to nie bylbym taki pewny. IMHO BDD mozna praktykowac rowniez przy uzyciu test/unit.&lt;/p&gt;</description>
      <pubDate>Mon, 29 Oct 2007 21:05:23 +0100</pubDate>
      <guid isPermaLink="false">urn:uuid:eb61cdac-6db3-466f-a732-8211754e3f4d</guid>
      <link>http://blog.zabiello.com/articles/2007/10/28/shoulda-rspec#comment-1142</link>
    </item>
    <item>
      <title>"Shoulda - pozbycie si&#281; magii RSpec'a" by Jaros&#322;aw Zabie&#322;&#322;o</title>
      <description>&lt;p&gt;Wygl&#261;da na to, &#380;e &lt;a href="http://chneukirchen.org/blog/archive/2007/01/announcing-test-spec-0-3-a-bdd-interface-for-test-unit.html" rel="nofollow"&gt;Spec/Test&lt;/a&gt; realizuje podobny pomys&#322; co &lt;a href="http://thoughtbot.com/projects/shoulda" rel="nofollow"&gt;Shoulda&lt;/a&gt;. W ka&#380;dym razie co by nie wybra&#263;, lepsze to ni&#380; magiczny RSpec.&lt;/p&gt;</description>
      <pubDate>Mon, 29 Oct 2007 17:49:15 +0100</pubDate>
      <guid isPermaLink="false">urn:uuid:bf4330e2-b319-4809-80e7-6b55f2045f4d</guid>
      <link>http://blog.zabiello.com/articles/2007/10/28/shoulda-rspec#comment-1138</link>
    </item>
    <item>
      <title>"Shoulda - pozbycie si&#281; magii RSpec'a" by ocher</title>
      <description>&lt;p&gt;Mnie sie bardziej podoba test/spec. Do poczytania tutaj: &lt;a href="http://errtheblog.com/post/4268" rel="nofollow"&gt;http://errtheblog.com/post/4268&lt;/a&gt;
Polecam.&lt;/p&gt;</description>
      <pubDate>Mon, 29 Oct 2007 16:31:38 +0100</pubDate>
      <guid isPermaLink="false">urn:uuid:38e8c7d2-26c0-4220-a4b9-7564fb4453dc</guid>
      <link>http://blog.zabiello.com/articles/2007/10/28/shoulda-rspec#comment-1135</link>
    </item>
  </channel>
</rss>
