<?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/"
	>

<channel>
	<title>the kiZZ notes &#187; TDD</title>
	<atom:link href="http://kizzx2.com/blog/index.php/tag/tdd/feed/" rel="self" type="application/rss+xml" />
	<link>http://kizzx2.com/blog</link>
	<description>random stupid ideas from a narcissistic chode</description>
	<lastBuildDate>Thu, 01 Dec 2011 16:25:03 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>why Test Driven Development (TDD) matters</title>
		<link>http://kizzx2.com/blog/index.php/2008/05/02/why-test-driven-development-tdd-matters/</link>
		<comments>http://kizzx2.com/blog/index.php/2008/05/02/why-test-driven-development-tdd-matters/#comments</comments>
		<pubDate>Fri, 02 May 2008 09:56:16 +0000</pubDate>
		<dc:creator>kiZZ kiZZ</dc:creator>
				<category><![CDATA[geek stuffs]]></category>
		<category><![CDATA[TDD]]></category>
		<category><![CDATA[test driven development]]></category>

		<guid isPermaLink="false">http://kizzx2.com/blog/?p=46</guid>
		<description><![CDATA[Like many programmers who first heard of concepts of Test Driven Development (TDD), I was like &#8220;What the heck? Yet more code to write for something that won&#8217;t produce end user output?&#8221;. I&#8217;ve been puzzling for quite some time to get myself accepting this concept, because Code Complete mentioned it so I thought it must [...]]]></description>
			<content:encoded><![CDATA[<p>Like many programmers who first heard of concepts of <a href="http://en.wikipedia.org/wiki/Test-driven_development">Test Driven Development (TDD)</a>, I was like &#8220;What the heck? Yet more code to write for something that won&#8217;t produce end user output?&#8221;. I&#8217;ve been puzzling for quite some time to get myself accepting this concept, because <a href="http://www.amazon.com/gp/product/0735619670?ie=UTF8&amp;tag=kizzx2-20&amp;linkCode=as2&amp;camp=1789&amp;creative=390957&amp;creativeASIN=0735619670">Code Complete</a> mentioned it so I thought it must have been a good thing (very great book by the way, every serious programmer should read it).</p>

<p><a href="http://www.amazon.com/gp/product/0735619670?ie=UTF8&amp;tag=kizzx2-20&amp;linkCode=as2&amp;camp=1789&amp;creative=390957&amp;creativeASIN=0735619670"><img src="http://ecx.images-amazon.com/images/I/51I%2BCgVe4oL._SS500_.jpg" alt="Code Complete by Steve McConnell" /></a></p>

<p>I sometimes write unit tests and I think unit tests are very useful in some tricky areas. It&#8217;s just that I haven&#8217;t been motivated enough to try TDD (test first then write code).</p>

<p>Then today I realized how TDD is a natural progression for people writing unit tests. TDD <em>promotes</em> clean OO designs. In short, I can even almost say that <em>&#8220;If you can test it, it has good design”</em>.</p>

<p>I came across this realization while trying to write unit tests for this piece of JavaScript code<em> afterwards</em>:</p>

<div class="codecolorer-container javascript default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br /></div></td><td><div class="javascript codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #006600; font-style: italic;">/**<br />
&nbsp;* Existing (bad design) JavaScript<br />
&nbsp;*/</span><br />
<br />
<span style="color: #003366; font-weight: bold;">var</span> Gateway <span style="color: #339933;">=</span><br />
<span style="color: #009900;">&#123;</span><br />
ajaxGet<span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span><br />
<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span><br />
<br />
<span style="color: #006600; font-style: italic;">// AccountManager uses Gateway, this is the “class” we want to test in this example</span><br />
<span style="color: #003366; font-weight: bold;">var</span> AccountManager <span style="color: #339933;">=</span><br />
<span style="color: #009900;">&#123;</span><br />
get<span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">function</span> <span style="color: #009900;">&#40;</span> id<span style="color: #339933;">,</span> onComplete <span style="color: #009900;">&#41;</span><br />
<span style="color: #009900;">&#123;</span><br />
Gateway.<span style="color: #660066;">ajaxGet</span> <span style="color: #009900;">&#40;</span> “<span style="color: #339933;">/</span>accounts<span style="color: #339933;">/</span>” <span style="color: #339933;">+</span> id <span style="color: #339933;">,</span> <span style="color: #003366; font-weight: bold;">function</span> <span style="color: #009900;">&#40;</span> profile <span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span> onComplete <span style="color: #009900;">&#40;</span> profile <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #009900;">&#125;</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #009900;">&#125;</span><br />
<span style="color: #009900;">&#125;</span></div></td></tr></tbody></table></div>

<p>That’s intuitive enough, huh? As much as I thought it was, until I tried to write unit tests for it using <a href="http://jsmock.sourceforge.net/">JsMock</a>, which has the typical usage of:</p>

<div class="codecolorer-container javascript default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br /></div></td><td><div class="javascript codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #006600; font-style: italic;">/**<br />
&nbsp;* Typical JsMock usage example<br />
*/</span><br />
<br />
<span style="color: #003366; font-weight: bold;">var</span> mockControl <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">null</span><span style="color: #339933;">;</span><br />
<br />
<span style="color: #003366; font-weight: bold;">function</span> Worker<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span><span style="color: #009900;">&#125;</span><br />
Worker.<span style="color: #660066;">prototype</span><span style="color: #339933;">&lt;</span>span<span style="color: #339933;">&gt;</span> &nbsp;<span style="color: #339933;">&lt;/</span>span<span style="color: #339933;">&gt;=</span><br />
<span style="color: #009900;">&#123;</span><br />
doWork<span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span><span style="color: #009900;">&#125;</span><br />
<span style="color: #009900;">&#125;</span><br />
<br />
<span style="color: #003366; font-weight: bold;">function</span> setUp<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><br />
<span style="color: #009900;">&#123;</span><br />
mockControl <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">new</span> MockControl<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #009900;">&#125;</span><br />
<br />
<span style="color: #003366; font-weight: bold;">function</span> testWorker<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><br />
<span style="color: #009900;">&#123;</span><br />
<span style="color: #003366; font-weight: bold;">var</span> workerMock <span style="color: #339933;">=</span> mockControl.<span style="color: #660066;">createMock</span> <span style="color: #009900;">&#40;</span> Worker <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
workerMock.<span style="color: #660066;">expects</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">doWork</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
workerMock.<span style="color: #660066;">doWork</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
workerMock.<span style="color: #660066;">verify</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #009900;">&#125;</span></div></td></tr></tbody></table></div>

<p>With the code I have written, it is impossible to do testing with JsUnit:</p>

<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br /></div></td><td><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">/**<br />
&nbsp;* Attempt to test my existing code with JsMock (in JsUnit)<br />
&nbsp;*/<br />
<br />
var mockControl;<br />
<br />
function setUp()<br />
{<br />
mockControl = new MockControl();<br />
}<br />
<br />
function testAccountManagerGet()<br />
{<br />
var accountManagerMock = mockControl.createMock ( Gateway );<br />
&lt;span style=&quot;color: red;&quot;&gt;<br />
// ERROR! mockControl.createMock() only accepts a class name,<br />
// but Gateway is a variable name<br />
&lt;/span&gt;<br />
}</div></td></tr></tbody></table></div>

<p>So to make things compatible with JsUnit, I had to rewrote the whole stuff:</p>

<div class="codecolorer-container javascript default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br /></div></td><td><div class="javascript codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #006600; font-style: italic;">/**<br />
&nbsp;* My revised JavaScript compatible with JsUnit<br />
&nbsp;*/</span><span style="color: #003366; font-weight: bold;">function</span> Gateway <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span><span style="color: #009900;">&#125;</span><br />
<br />
Gateway.<span style="color: #660066;">prototype</span> <span style="color: #339933;">=</span><br />
<span style="color: #009900;">&#123;</span><br />
ajaxGet<span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span><span style="color: #009900;">&#125;</span><br />
<span style="color: #009900;">&#125;</span><br />
<br />
<span style="color: #003366; font-weight: bold;">function</span> AccountManager <span style="color: #009900;">&#40;</span> gateway <span style="color: #009900;">&#41;</span><br />
<span style="color: #009900;">&#123;</span><br />
<span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">gateway</span> <span style="color: #339933;">=</span> gateway<span style="color: #339933;">;</span><br />
<span style="color: #009900;">&#125;</span><br />
<br />
AccountManager.<span style="color: #660066;">prototype</span> <span style="color: #339933;">=</span><br />
<span style="color: #009900;">&#123;</span><br />
get<span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">function</span> <span style="color: #009900;">&#40;</span> id <span style="color: #009900;">&#41;</span><br />
<span style="color: #009900;">&#123;</span><br />
<span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">gateway</span>.<span style="color: #660066;">ajaxGet</span> <span style="color: #009900;">&#40;</span> “<span style="color: #339933;">/</span>accounts<span style="color: #339933;">/</span>” <span style="color: #339933;">+</span> id <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #009900;">&#125;</span><br />
<span style="color: #009900;">&#125;</span></div></td></tr></tbody></table></div>

<div class="codecolorer-container javascript default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br /></div></td><td><div class="javascript codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #006600; font-style: italic;">/**<br />
&nbsp;* JsUnit tests for my revised code<br />
&nbsp;*/</span><span style="color: #003366; font-weight: bold;">var</span> mockControl <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">null</span><span style="color: #339933;">;</span><br />
<br />
<span style="color: #003366; font-weight: bold;">function</span> setUp<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><br />
<span style="color: #009900;">&#123;</span><br />
mockControl <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">new</span> MockControl<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #009900;">&#125;</span><br />
<br />
<span style="color: #003366; font-weight: bold;">function</span> testAccountManagerGet<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><br />
<span style="color: #009900;">&#123;</span><br />
<span style="color: #006600; font-style: italic;">// OK now, because Gateway is a class</span><br />
<span style="color: #003366; font-weight: bold;">var</span> gatewayMock <span style="color: #339933;">=</span> mockControl.<span style="color: #660066;">createMock</span> <span style="color: #009900;">&#40;</span> Gateway <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<br />
<span style="color: #003366; font-weight: bold;">var</span> accountManager <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">new</span> AccountManager <span style="color: #009900;">&#40;</span> gatewayMock <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<br />
<span style="color: #006600; font-style: italic;">// test fixtures</span><br />
<span style="color: #003366; font-weight: bold;">var</span> id <span style="color: #339933;">=</span> “kizzx2”<span style="color: #339933;">;</span><br />
<br />
gatewayMock.<span style="color: #660066;">expects</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">ajaxGet</span> <span style="color: #009900;">&#40;</span> “<span style="color: #339933;">/</span>accounts<span style="color: #339933;">/</span>” <span style="color: #339933;">+</span> id <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
accountManager.<span style="color: #660066;">get</span> <span style="color: #009900;">&#40;</span> id <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<br />
mockControl.<span style="color: #660066;">verify</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #009900;">&#125;</span></div></td></tr></tbody></table></div>

<p>The above changes might look redundant at first and not so intuitive. But then I came to think of it, it <strong>removed the dependency </strong>between my AccountManager class and the Gateway class. I wasn’t quite aware of such anti-pattern until JsUnit/JsMock brought it to my attention.</p>

<p>If I had used TDD in the first place, where I would have to write the tests first, it would have <strong>enforced</strong> me to use clean OO models to design things. Now I think that’s a pretty solid justification for using TDD.</p>
]]></content:encoded>
			<wfw:commentRss>http://kizzx2.com/blog/index.php/2008/05/02/why-test-driven-development-tdd-matters/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

