<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/css" href="/stylesheets/rss.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>Object Mentor Blog: TDD in Clojure</title>
    <link>http://blog.objectmentor.com/articles/2010/06/03/tdd-in-clojure</link>
    <language>en-us</language>
    <ttl>40</ttl>
    <description></description>
    <item>
      <title>TDD in Clojure</title>
      <description>&lt;p&gt;OO is a tell-don&amp;#8217;t-ask paradigm.  Yes, I know people don&amp;#8217;t always use it that way, but one of Kay&amp;#8217;s original concepts was that objects were like cells in a living creature.  The cells in a living creature do not ask any questions.  They simply tell each other what to do.  Neurons are tellers, not askers.  Hormones are tellers not askers.  In biological systems, (and in Kay&amp;#8217;s original concept for OO) communication was half-duplex.&lt;/p&gt;


	&lt;p&gt;Clojure is a functional language.  Functional languages are ask-dont-tell.  Indeed, the whole notion of &amp;#8220;tell&amp;#8221; is to change the state of the system.  In a functional program there is no state to change.  So &amp;#8220;telling&amp;#8221; makes little sense.&lt;/p&gt;


	&lt;p&gt;When we use &lt;span class="caps"&gt;TDD&lt;/span&gt; to develop a tell-don&amp;#8217;t-ask system, we start at the high level and write tests using mocks to make sure we are issuing the correct &amp;#8220;tells&amp;#8221;.  We proceed from the top of the system to the bottom of the system.  The last tests we write are for the utilities at the very bottom.&lt;/p&gt;


	&lt;p&gt;In an ask-don&amp;#8217;t-tell system, data starts at the bottom and flows upwards.  The operation of each function depends on the data fed to it by the lower level functions.  There is no mocking framework.  So we write tests that start at the bottom, and we work our way up the the top.&lt;/p&gt;


	&lt;p&gt;Therein lies the rub.&lt;/p&gt;


	&lt;p&gt;In a tell-don&amp;#8217;t-ask system, the tells at the high level are relatively complex.  They branch out into lower subsystems getting simpler, but more numerous as they descend.  Testing these tells using mocks is not particularly difficult because we don&amp;#8217;t need to depend on the lower level functions being there.  The mocks make them irrelevant.&lt;/p&gt;


	&lt;p&gt;In an ask-don&amp;#8217;t-tell system the asks at the low level are simple, but as the data moves upwards it gets grouped and composed into lists, maps, sets, and other complex data structures.  At the top the data is in it&amp;#8217;s most complex form.  Writing tests against that complex data is difficult at best.  And there is currently no way to mock out the lower levels&lt;sup&gt;&lt;a href="#fn1"&gt;1&lt;/a&gt;&lt;/sup&gt; so all tests written at the high level depend on all the functions below.&lt;/p&gt;


	&lt;p&gt;The perception of writing tests from the bottom to the top can be horrific at first.  Consider, for example, the &lt;a href="http://github.com/unclebob/clojureOrbit"&gt;Orbit program&lt;/a&gt; I just wrote.  This program simulates N-body gravitation.  Imagine that I am writing tests at the top level.  I have three bodies at position Pa, Pb, and Pc.  They have masses Ma, Mb, and Mc.  They have velocity vectors of Va, Vb, Vc.  The test I want to write needs to make sure that new positions Pa&amp;#8217;, Pb&amp;#8217;, Pc&amp;#8217;, and new Velocity vectors Va&amp;#8217;, Vb&amp;#8217;, and Vc&amp;#8217; are computed correctly.  How do I do that?&lt;/p&gt;


Should I write a test that looks like this?
&lt;pre&gt;
test-update {
  Pa = (1,1)
  Ma = 2
  Va = (0,0)

  Pb = (1,2)
  Mb = 3
  Vb = (0,0)

  Pc = (4,5)
  Mc = 4
  Vc = (0,0)

  update-all

  Pa should == (1.096, 4.128)
  Va should == (0.096, 3.128)

  Pb should == (1.1571348402636772, 0.1571348402636774)
  Vb should == (0.15713484026367727, -1.8428651597363226)

  Pc should == (3.834148869802242, 4.818148869802242)
  Vc should == (-0.16585113019775796, -0.18185113019775795)
}
&lt;/pre&gt;
A test like this is awful.  It&amp;#8217;s loaded with magic numbers, and secret information.  It tells me nothing about &lt;em&gt;how&lt;/em&gt; the update-all function is working.  It only tells me that it generated certain numbers.  Are those numbers correct?  How would I know?

	&lt;p&gt;But wait!  I&amp;#8217;m working in a &lt;em&gt;functional language&lt;/em&gt;.  That means that every function I call with certain inputs will &lt;em&gt;always&lt;/em&gt; return the same value; no matter how many times I call it.  Functions don&amp;#8217;t change state!  And that means that I can write my tests quite differently.&lt;/p&gt;


	&lt;p&gt;How does update-all work?  Simple, given a list of objects it performs the following operations (written statefully):&lt;/p&gt;


&lt;pre&gt;
  update-all(objects) {
    for each object in objects {
      accumulate-forces(object, objects)
    }
    for each object in objects {
      accelerate(object)
      reposition(object)
    }
  }
&lt;/pre&gt; 

	&lt;p&gt;This is written in stateful form to make is easier for our non-functional friends to follow.  First we accumulate the force of gravity between all the objects.  This amounts to evaluating Newton&amp;#8217;s F=Gm1m1/r^2 formula for each pair of objects, and adding up the force vectors.&lt;/p&gt;


	&lt;p&gt;Then, for each object we accelerate that object by applying the force vector to it&amp;#8217;s mass, and adding the resultant delta-v vector to it&amp;#8217;s velocity vector.&lt;/p&gt;


	&lt;p&gt;Then, for each object we reposition that object by applying the velocity vector to it&amp;#8217;s current position.&lt;/p&gt;


	&lt;p&gt;Here&amp;#8217;s the clojure code for update-all&lt;/p&gt;


&lt;pre&gt;
(defn update-all [os]
  (reposition-all (accelerate-all (calculate-forces-on-all os))))
&lt;/pre&gt;

	&lt;p&gt;In this code you can clearly see the bottom-to-top flow of the application.  First we calculate forces, then we accelerate, and finally we reposition.&lt;/p&gt;


	&lt;p&gt;Now, what do these -all functions look like?  Here they are:&lt;/p&gt;


&lt;pre&gt;
(defn calculate-forces-on-all [os]
  (map #(accumulate-forces % os) os))

(defn accelerate-all [os]
  (map accelerate os))

(defn reposition-all [os]
  (map reposition os))
&lt;/pre&gt;

	&lt;p&gt;If you don&amp;#8217;t read clojure, don&amp;#8217;t worry.  the map function simply creates a new list from an old list by applying a function to each element of the old list.  So in the case of reposition-all it simply calls reposition on the list of objects (os) producing a new list of objects that have been repositioned.&lt;/p&gt;


	&lt;p&gt;From this we can determine that the function of update-all is to call the three functions (accumulate-forces, accelerate, and reposition) on each element of the input list, producing a new list.&lt;/p&gt;


	&lt;p&gt;Notice how similar that is to a statement we might make about a high level method in an OO program.  (It&amp;#8217;s got to call these three functions on each element of the list).  In an OO language we would mock out the three functions and just make sure they&amp;#8217;d been called for each element.  The calculations would be bypassed as irrelevant.&lt;/p&gt;


	&lt;p&gt;Oddly, we can make the same statement in clojure.  Here&amp;#8217;s the test for update-all&lt;/p&gt;


&lt;pre&gt;
(testing "update-all" 
  (let [
    o1 (make-object ...)
    o2 (make-object ...)
    o3 (make-object ...)
    os [o1 o2 o3]
    us (update-all os)
    ]
    (is (= (nth us 0) (reposition (accelerate (accumulate-forces os o1)
    (is (= (nth us 1) (reposition (accelerate (accumulate-forces os o2)
    (is (= (nth us 2) (reposition (accelerate (accumulate-forces os o3)
    )
  )
&lt;/pre&gt;  

	&lt;p&gt;If you don&amp;#8217;t read clojure don&amp;#8217;t worry.  All this is saying is that we test the update-all function by calling the appropriate functions for each input object, and then see if the elements in the output list match them.&lt;/p&gt;


	&lt;p&gt;In an OO program we&amp;#8217;d find this dangerous because of side-effects.  We couldn&amp;#8217;t be sure that the functions could safely be called without changing the state of some object in the system.  But in a functional language it doesn&amp;#8217;t matter how many times you call a function.  So long as you pass in the same data, you will get the same result.&lt;/p&gt;


	&lt;p&gt;So this test simply checks that the appropriate three functions are getting called on each element of the list.  This is exactly the same thing an OO programmer would do with a mock object!&lt;/p&gt;


	&lt;h3&gt;Is &lt;span class="caps"&gt;TDD&lt;/span&gt; necessary in Clojure?&lt;/h3&gt;


	&lt;p&gt;If you follow the code in the Orbit example, you&amp;#8217;ll note that I wrote tests for all the computations, but did not write tests for the Swing-Gui.  This is typical of the way that I work.  I try to test all business rules, but I &amp;#8220;fiddle&amp;#8221; with the &lt;span class="caps"&gt;GUI&lt;/span&gt; until I like it.&lt;/p&gt;


	&lt;p&gt;If you look carefully you&amp;#8217;ll find that amidst the &lt;span class="caps"&gt;GUI&lt;/span&gt; functions there are some &amp;#8220;presentation&amp;#8221; functions that &lt;em&gt;could&lt;/em&gt; have been tested, but that I neglected to write with &lt;span class="caps"&gt;TDD&lt;/span&gt;[2].  These functions were the worst to get working.  I continuously encountered NPEs and Illegal Cast exceptions while trying to get them to work.&lt;/p&gt;


	&lt;p&gt;My conclusion is that Clojure without &lt;span class="caps"&gt;TDD&lt;/span&gt; is just as much a nightmare as Java or Ruby without &lt;span class="caps"&gt;TDD&lt;/span&gt;.&lt;/p&gt;


	&lt;h3&gt;Summary&lt;/h3&gt;


	&lt;p&gt;In OO we tend to &lt;span class="caps"&gt;TDD&lt;/span&gt; our way from the top to the bottom by using Mocks.  In Clojure we tend to &lt;span class="caps"&gt;TDD&lt;/span&gt; our way from the bottom to the top.  In either case we can compose our tests in terms of the functions they should call on the lower level objects.  In the case of OO we use mocks to tell us if the functions have been called properly.  This protects us from side-effects and allows us to decouple our tests from the whole system.  In clojure we can rely on the fact that the language is functional, and that no matter how many times you call a function it will return the same value.&lt;/p&gt;


	&lt;p id="fn1"&gt;&lt;sup&gt;1&lt;/sup&gt; Brian Marick is working on something that looks a lot like a mocking framework for clojure.  If his ideas pan out, we may be able to &lt;span class="caps"&gt;TDD&lt;/span&gt; from the top to the bottom in Clojure.&lt;/p&gt;


	&lt;p id="fn2"&gt;&lt;sup&gt;2&lt;/sup&gt; This is an unconscious game we all play with ourselves.  When we have a segment of code that we consider to be immune to &lt;span class="caps"&gt;TDD&lt;/span&gt; (like &lt;span class="caps"&gt;GUI&lt;/span&gt;) then we unconsciously move lots of otherwise testable code into that segment.  Yes, I heard my green band complain every time I did it; but I ignored it because I was in the &lt;span class="caps"&gt;GUI&lt;/span&gt;.  Whoops.&lt;/p&gt;</description>
      <pubDate>Thu, 03 Jun 2010 12:33:00 -0500</pubDate>
      <guid isPermaLink="false">urn:uuid:496c0f47-16d5-480d-9530-125b7ee235d8</guid>
      <author>Uncle Bob</author>
      <link>http://blog.objectmentor.com/articles/2010/06/03/tdd-in-clojure</link>
      <category>Uncle Bob's Blatherings</category>
    </item>
    <item>
      <title>"TDD in Clojure" by UGG Bottes</title>
      <description>&lt;p&gt;Tout d&#8217;accord sur votre opinion. Et moi, aussi le fan de &lt;a href="http://www.uggbottessoldes.com" rel="nofollow"&gt;bottes uggs&lt;/a&gt;, surtout sur sa doublure en laine. La marque &lt;a href="http://www.uggbottessoldes.com" rel="nofollow"&gt;ugg bottes&lt;/a&gt;. venait de trouver sa signature. En ce moment, vous pouvez pr&#233;-commander les &lt;a href="http://www.uggbottessoldes.com" rel="nofollow"&gt;UGG Pas Cher&lt;/a&gt;!&lt;/p&gt;</description>
      <pubDate>Wed, 08 Sep 2010 02:14:12 -0500</pubDate>
      <guid isPermaLink="false">urn:uuid:411422d2-7d6a-4a91-99bd-6b917e178d0d</guid>
      <link>http://blog.objectmentor.com/articles/2010/06/03/tdd-in-clojure#comment-24779</link>
    </item>
    <item>
      <title>"TDD in Clojure" by coachoutlet</title>
      <description>Today, Coach has developed into a global brand, offers a variety of   decorative assembly line of men and women.Our &lt;a href="http://www.coachoutletnew.com" rel="nofollow"&gt;coach outlet&lt;/a&gt; include handbags, shoes, watches,   outdoor clothing, scarves, sunglasses, jewelry and perfume series &lt;a href="http://www.coachoutletnew.com" rel="nofollow"&gt;coach bags&lt;/a&gt;.Welcome to see &lt;a href="http://www.coachoutletnew.com/206-brooke-collection-html" rel="nofollow"&gt;coach brooke collection&lt;/a&gt; .
&lt;p&gt;&lt;a href="http://www.coachoutletnew.com" rel="nofollow"&gt;http://www.coachoutletnew.com&lt;/a&gt;&lt;/p&gt;</description>
      <pubDate>Tue, 07 Sep 2010 02:54:50 -0500</pubDate>
      <guid isPermaLink="false">urn:uuid:a145034e-8d36-4c28-be76-c074a2c763be</guid>
      <link>http://blog.objectmentor.com/articles/2010/06/03/tdd-in-clojure#comment-24562</link>
    </item>
    <item>
      <title>"TDD in Clojure" by supplynflshop</title>
      <description>&lt;p&gt;Originally, the word emblem meant &#8220;inlaid ornamental work,&#8221; that is &lt;a href="http://www.supplynflshop.com" rel="nofollow"&gt;Wholesale NFL Jerseys&lt;/a&gt;, a&lt;/p&gt;


	&lt;p&gt;symbol of something else &#8211; in this case, that of wealth, because of the time and skill required to do it . Badge probably became&lt;/p&gt;


	&lt;p&gt;synonymous with emblem in the 15th century &lt;a href="http://www.supplynflshop.com" rel="nofollow"&gt;Cheap NFL Jerseys&lt;/a&gt;. Decal, an abbreviated version of&lt;/p&gt;


	&lt;p&gt;&#8220;decalcomania,&#8221;a French word that came into use in the early 20th century referred to the English practice of &#8220;transfer printing&#8221;&lt;/p&gt;


	&lt;p&gt;invented in the 18th century. This process transferred the ink from a design or drawing to the glass or porcelain when it was fired in the&lt;/p&gt;


	&lt;p&gt;kiln &lt;a href="http://www.supplynflshop.com" rel="nofollow"&gt;NFL Jerseys&lt;/a&gt;.&lt;/p&gt;</description>
      <pubDate>Tue, 31 Aug 2010 22:05:18 -0500</pubDate>
      <guid isPermaLink="false">urn:uuid:41c08d79-f0e6-42e4-b8f1-fecb197e719d</guid>
      <link>http://blog.objectmentor.com/articles/2010/06/03/tdd-in-clojure#comment-23457</link>
    </item>
    <item>
      <title>"TDD in Clojure" by alice</title>
      <description>&lt;p&gt;Thanks for sharing the information.I have bookmarked your post and reply you soon with some new comments/information.
&lt;a href="http://surfaceid.com" rel="nofollow"&gt;http://surfaceid.com&lt;/a&gt;&lt;/p&gt;</description>
      <pubDate>Fri, 20 Aug 2010 04:34:04 -0500</pubDate>
      <guid isPermaLink="false">urn:uuid:a1cb3195-b883-43d4-b372-193426212d56</guid>
      <link>http://blog.objectmentor.com/articles/2010/06/03/tdd-in-clojure#comment-20810</link>
    </item>
    <item>
      <title>"TDD in Clojure" by discount tiffany earrings</title>
      <description>&lt;p&gt;This is really useful information. Will do it in the future. Yeah, the system is as corrupt as the politician&amp;#8230;lol :D&lt;/p&gt;


	&lt;p&gt;Cool, thanks for the information on this matter.&lt;/p&gt;</description>
      <pubDate>Thu, 19 Aug 2010 20:07:55 -0500</pubDate>
      <guid isPermaLink="false">urn:uuid:ba296571-dc17-4b60-9862-4c2ca772d941</guid>
      <link>http://blog.objectmentor.com/articles/2010/06/03/tdd-in-clojure#comment-20636</link>
    </item>
    <item>
      <title>"TDD in Clojure" by cosplay</title>
      <description>&lt;p&gt;I have joined many yahoo groups and i think there is lot of information available.&lt;/p&gt;</description>
      <pubDate>Tue, 10 Aug 2010 21:26:12 -0500</pubDate>
      <guid isPermaLink="false">urn:uuid:a8933f5f-a364-438b-b7b1-90d62c5643e3</guid>
      <link>http://blog.objectmentor.com/articles/2010/06/03/tdd-in-clojure#comment-19506</link>
    </item>
    <item>
      <title>"TDD in Clojure" by liveyou</title>
      <description>&lt;p&gt;Guide on how to &lt;a href="http://www.iphone4-converter.com/copy-dvd-to-ipad.htm" rel="nofollow"&gt;copy dvd to ipad&lt;/a&gt;, &lt;a href="http://www.iphone4-converter.com/how-can-i-copy-files-onto-an-ipad.htm" rel="nofollow"&gt;how can I copy files onto an ipad&lt;/a&gt;, &lt;a href="http://www.iphone4-converter.com/how-to-copy-a-dvd-movie-to-ipad.htm" rel="nofollow"&gt;how to copy a dvd movie to ipad&lt;/a&gt;, &lt;a href="http://www.iphone4-converter.com/how-to-copy-files-from-computer-to-ipad.htm" rel="nofollow"&gt;how to copy files from computer to ipad&lt;/a&gt;.&lt;/p&gt;</description>
      <pubDate>Wed, 04 Aug 2010 22:11:03 -0500</pubDate>
      <guid isPermaLink="false">urn:uuid:d7470db3-7dcf-4f00-b912-5d7a609f34d3</guid>
      <link>http://blog.objectmentor.com/articles/2010/06/03/tdd-in-clojure#comment-18642</link>
    </item>
    <item>
      <title>"TDD in Clojure" by lady dress</title>
      <description>&lt;p&gt;Wholesale clothing,fashion dress,lady dress,lady garment,lady fashion&lt;/p&gt;</description>
      <pubDate>Tue, 20 Jul 2010 03:27:19 -0500</pubDate>
      <guid isPermaLink="false">urn:uuid:eb5a17b8-48af-4230-8407-9cf192177ee8</guid>
      <link>http://blog.objectmentor.com/articles/2010/06/03/tdd-in-clojure#comment-16938</link>
    </item>
    <item>
      <title>"TDD in Clojure" by www.needjerseys.com</title>
      <description>&lt;p&gt;I have great interest in &lt;a href="http://www.needjerseys.com" rel="nofollow"&gt; Wholesale jerseys&lt;/a&gt; such as NBA jerseys, soccer jerseys and NFL jerseys.&lt;/p&gt;</description>
      <pubDate>Mon, 19 Jul 2010 22:46:33 -0500</pubDate>
      <guid isPermaLink="false">urn:uuid:2b924b7f-3298-4f92-b950-0fd04d89d158</guid>
      <link>http://blog.objectmentor.com/articles/2010/06/03/tdd-in-clojure#comment-16896</link>
    </item>
    <item>
      <title>"TDD in Clojure" by Chemise dress</title>
      <description>&lt;p&gt;In this summer, the romantic and small, is confronted dragon-boat festival holiday for a picnic superexcellent period. Romantic, melting snow spins &lt;a href="http://www.ququgofashion.com" rel="nofollow"&gt;dress &lt;/a&gt; is today season vogue girls wear build up the important sheet is tasted,&lt;/p&gt;</description>
      <pubDate>Tue, 13 Jul 2010 01:56:21 -0500</pubDate>
      <guid isPermaLink="false">urn:uuid:2f91a82b-0996-4239-a5cd-7255df503643</guid>
      <link>http://blog.objectmentor.com/articles/2010/06/03/tdd-in-clojure#comment-16066</link>
    </item>
    <item>
      <title>"TDD in Clojure" by Olivea Copper</title>
      <description>&lt;p&gt;A four year old little boy was at the doctor&amp;#8217;s office with his mother in the waiting room when he spotted a pregnant lady on the other side of the room. Having nothing better to do, he walks over to her and inquisitively asks &amp;#8220;Why is your stomach so big?&amp;#8221;&lt;/p&gt;</description>
      <pubDate>Thu, 08 Jul 2010 06:00:21 -0500</pubDate>
      <guid isPermaLink="false">urn:uuid:c73d1c24-2a0f-4d99-86e8-97241312cfde</guid>
      <link>http://blog.objectmentor.com/articles/2010/06/03/tdd-in-clojure#comment-15914</link>
    </item>
    <item>
      <title>"TDD in Clojure" by P90x</title>
      <description>&lt;p&gt;Hello,I love reading through your blog, I wanted to leave a little comment to support&lt;/p&gt;


	&lt;p&gt;you and wish you a good continuation. Wishing you the best of luck for all your&lt;/p&gt;


	&lt;p&gt;blogging efforts.&lt;/p&gt;</description>
      <pubDate>Thu, 08 Jul 2010 03:23:16 -0500</pubDate>
      <guid isPermaLink="false">urn:uuid:a07360af-f0d1-452c-8d98-7aff934574f0</guid>
      <link>http://blog.objectmentor.com/articles/2010/06/03/tdd-in-clojure#comment-15867</link>
    </item>
    <item>
      <title>"TDD in Clojure" by http://www.laviesolar.com</title>
      <description>&lt;p&gt;Hello and many greets from China ! 
Nice design.Looks so comfortable.
Many thanks for the wonderful site and the opportunity to say hello.&lt;/p&gt;</description>
      <pubDate>Tue, 06 Jul 2010 03:32:52 -0500</pubDate>
      <guid isPermaLink="false">urn:uuid:be3b09da-1cbe-46f5-89b0-83d46316463c</guid>
      <link>http://blog.objectmentor.com/articles/2010/06/03/tdd-in-clojure#comment-15422</link>
    </item>
    <item>
      <title>"TDD in Clojure" by http://www.laviesolar.com</title>
      <description>&lt;p&gt;his site is amazing. Very well developed with great information.
Thanks for a wonderful experience.&lt;/p&gt;</description>
      <pubDate>Tue, 06 Jul 2010 03:21:15 -0500</pubDate>
      <guid isPermaLink="false">urn:uuid:1eda8942-430d-4516-ae9a-fd1f3950a930</guid>
      <link>http://blog.objectmentor.com/articles/2010/06/03/tdd-in-clojure#comment-15407</link>
    </item>
    <item>
      <title>"TDD in Clojure" by Hot Wallpapers</title>
      <description>&lt;p&gt;Nice blog. Will bookmark for future updates.&lt;/p&gt;</description>
      <pubDate>Mon, 05 Jul 2010 01:18:47 -0500</pubDate>
      <guid isPermaLink="false">urn:uuid:3cc7b2a6-2511-4a41-8982-10d7c70aefde</guid>
      <link>http://blog.objectmentor.com/articles/2010/06/03/tdd-in-clojure#comment-15079</link>
    </item>
    <item>
      <title>"TDD in Clojure" by movies</title>
      <description>&lt;p&gt;Nice one. :)&lt;/p&gt;</description>
      <pubDate>Thu, 01 Jul 2010 13:03:06 -0500</pubDate>
      <guid isPermaLink="false">urn:uuid:7045a69a-dc73-4eae-bc20-2c626753f73b</guid>
      <link>http://blog.objectmentor.com/articles/2010/06/03/tdd-in-clojure#comment-14897</link>
    </item>
    <item>
      <title>"TDD in Clojure" by r9 irons</title>
      <description>&lt;p&gt;The noblest search is the search for excellence&lt;/p&gt;</description>
      <pubDate>Tue, 29 Jun 2010 04:11:49 -0500</pubDate>
      <guid isPermaLink="false">urn:uuid:39a70fcb-c1f2-440e-ad1f-d248eb451d1c</guid>
      <link>http://blog.objectmentor.com/articles/2010/06/03/tdd-in-clojure#comment-14631</link>
    </item>
    <item>
      <title>"TDD in Clojure" by r9 irons</title>
      <description>&lt;p&gt;The noblest search is the search for excellence&lt;/p&gt;</description>
      <pubDate>Tue, 29 Jun 2010 04:11:40 -0500</pubDate>
      <guid isPermaLink="false">urn:uuid:fc7a3447-4f3e-4ba0-ba1c-f8736ea7cb7b</guid>
      <link>http://blog.objectmentor.com/articles/2010/06/03/tdd-in-clojure#comment-14628</link>
    </item>
    <item>
      <title>"TDD in Clojure" by MBT Chapa</title>
      <description>&lt;p&gt;interesting i am definatley going to look further into this.&lt;/p&gt;</description>
      <pubDate>Tue, 29 Jun 2010 03:58:14 -0500</pubDate>
      <guid isPermaLink="false">urn:uuid:f1e4dc91-9a7b-4928-ba88-9eb76dec6dce</guid>
      <link>http://blog.objectmentor.com/articles/2010/06/03/tdd-in-clojure#comment-14574</link>
    </item>
    <item>
      <title>"TDD in Clojure" by MBT Chapa</title>
      <description>&lt;p&gt;interesting i am definatley going to look further into this.&lt;/p&gt;</description>
      <pubDate>Tue, 29 Jun 2010 03:57:55 -0500</pubDate>
      <guid isPermaLink="false">urn:uuid:cd99d488-e80d-48ae-8f23-74bdf0056352</guid>
      <link>http://blog.objectmentor.com/articles/2010/06/03/tdd-in-clojure#comment-14570</link>
    </item>
    <item>
      <title>"TDD in Clojure" by pump shoes</title>
      <description>&lt;p&gt;It seems that you have set many work in to your article and We require more of&lt;/p&gt;


	&lt;p&gt;those about the net presently. I truly got a drag out of one&amp;#8217;s article. We do not&lt;/p&gt;


	&lt;p&gt;actually possess a lot in order to communicate reacting, I just wished to comment&lt;/p&gt;


	&lt;p&gt;in order to respond incredible perform&lt;/p&gt;</description>
      <pubDate>Tue, 29 Jun 2010 03:54:59 -0500</pubDate>
      <guid isPermaLink="false">urn:uuid:8697c54f-4f2e-47ab-ae1c-145655263eeb</guid>
      <link>http://blog.objectmentor.com/articles/2010/06/03/tdd-in-clojure#comment-14565</link>
    </item>
    <item>
      <title>"TDD in Clojure" by pump shoes</title>
      <description>&lt;p&gt;It seems that you have set many work in to your article and We require more of&lt;/p&gt;


	&lt;p&gt;those about the net presently. I truly got a drag out of one&amp;#8217;s article. We do not&lt;/p&gt;


	&lt;p&gt;actually possess a lot in order to communicate reacting, I just wished to comment&lt;/p&gt;


	&lt;p&gt;in order to respond incredible perform&lt;/p&gt;</description>
      <pubDate>Tue, 29 Jun 2010 03:54:49 -0500</pubDate>
      <guid isPermaLink="false">urn:uuid:85cf861a-503a-429e-8f4e-b8cc235ffa12</guid>
      <link>http://blog.objectmentor.com/articles/2010/06/03/tdd-in-clojure#comment-14560</link>
    </item>
    <item>
      <title>"TDD in Clojure" by cell phone headset</title>
      <description>&lt;p&gt;Nice one. I have stumbled and twittered this for my friends. Hope others find it as interesting as I did.&lt;/p&gt;</description>
      <pubDate>Tue, 29 Jun 2010 03:34:12 -0500</pubDate>
      <guid isPermaLink="false">urn:uuid:03d0f81e-8060-4bbc-9851-22f459985bb8</guid>
      <link>http://blog.objectmentor.com/articles/2010/06/03/tdd-in-clojure#comment-14537</link>
    </item>
    <item>
      <title>"TDD in Clojure" by cell phone headset</title>
      <description>&lt;p&gt;Nice one. I have stumbled and twittered this for my friends. Hope others find it as interesting as I did.&lt;/p&gt;</description>
      <pubDate>Tue, 29 Jun 2010 03:33:46 -0500</pubDate>
      <guid isPermaLink="false">urn:uuid:e2a780a8-049a-4fb2-afa3-303f5b8ebd08</guid>
      <link>http://blog.objectmentor.com/articles/2010/06/03/tdd-in-clojure#comment-14532</link>
    </item>
    <item>
      <title>"TDD in Clojure" by p90x workout</title>
      <description>&lt;p&gt;&lt;a href="http://p90x-fitness1.com" rel="nofollow"&gt;&lt;strong&gt;P90X&lt;/strong&gt;&lt;/a&gt; is a working out system includs &lt;a href="http://p90x-fitness1.com" rel="nofollow"&gt;&lt;strong&gt;P90X workout&lt;/strong&gt;&lt;/a&gt; and &lt;a href="http://p90x-fitness1.com" rel="nofollow"&gt;&lt;strong&gt;Insanity DVD &lt;/strong&gt;&lt;/a&gt;which  belong to &lt;a href="http://www.p90x-fitness1.com/p90x-p-1.html" rel="nofollow"&gt;&lt;strong&gt;P90X fitness&lt;/strong&gt;&lt;/a&gt; program.&lt;/p&gt;</description>
      <pubDate>Mon, 14 Jun 2010 21:05:27 -0500</pubDate>
      <guid isPermaLink="false">urn:uuid:44b3bf29-87cd-49ed-85b7-09f5ec51c8f8</guid>
      <link>http://blog.objectmentor.com/articles/2010/06/03/tdd-in-clojure#comment-13074</link>
    </item>
  </channel>
</rss>
