<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">

  <title><![CDATA[That TDD Fellow | Tech Blog | Screencasts]]></title>
  <link href="http://www.tddfellow.com/atom.xml" rel="self"/>
  <link href="http://www.tddfellow.com/"/>
  <updated>2022-02-05T16:48:18+01:00</updated>
  <id>http://www.tddfellow.com/</id>
  <author>
    <name><![CDATA[Oleksii Fedorov (waterlink)]]></name>
    
  </author>
  <generator uri="http://octopress.org/">Octopress</generator>

  
  <entry>
    <title type="html"><![CDATA[Why Best Software Engineering Practices Are Insanely Important, Really]]></title>
    <link href="http://www.tddfellow.com/blog/2022/02/05/why-best-software-engineering-practices-are-insanely-important-really/"/>
    <updated>2022-02-05T14:43:04+02:00</updated>
    <id>http://www.tddfellow.com/blog/2022/02/05/why-best-software-engineering-practices-are-insanely-important-really</id>
    <content type="html"><![CDATA[<p>&ldquo;So, what software engineering practices do you like to use?&rdquo; — I asked another developer the other day. And the answer has wholly shaken me:</p>

<p>&ldquo;What do you mean by &#8220;software engineering practices?&rdquo; — was the developer&rsquo;s response.</p>

<p>When I explain what I mean by these three words (apparently, I took for granted), the person starts listing technologies. This conversation has been repeating a bit too frequently for my liking recently.</p>

<p>Look, I get it. Technologies knowledge and experience are vital for a software engineer. However, the fundamental practices of software engineering are insanely important nevertheless.</p>

<p>Let&rsquo;s discover why.</p>

<!-- more -->


<h2>Holy Grail of Software Development</h2>

<p>Why do these practices exist in the first place, and why are countless books written on them? And why is the industry trying to improve on the existing ones and invent new ones?</p>

<p>Why just a bunch of technology skills is not enough?</p>

<p>That&rsquo;s because we all want to get stuff done fast. And we want it done with a high level of quality. And we want it to be valuable.</p>

<p>The &ldquo;Holy Grail of Software Development&rdquo; is the ability to deliver fast and with high quality.</p>

<p>While innovative programming language or framework can improve speed and reduce the chance of making mistakes, the improvement effect is negligible in &ldquo;speed x quality x value.&rdquo;</p>

<p>What matters then?</p>

<p>How the software is developed creates a tremendous effect on speed and quality.</p>

<p>It&rsquo;s the processes applied, techniques used, disciplines practiced.</p>

<h2>Whether You Know it or Not, You&rsquo;re Still Using Practices.</h2>

<p>Just not necessarily the good ones.</p>

<p>Slap some code together, use a lot of copy-paste from StackOverflow and your previous project, and get it to production as quickly as possible? — That&rsquo;s a software engineering practice.</p>

<p>It gives you great speed (at first) and, of course, reduces quality substantially. Do that for a few weeks, and you&rsquo;ll inevitably slow down because you&rsquo;ll constantly be debugging all the bugs produced.</p>

<p>Then, on the other hand, there is another practice of unit-testing and integration-testing the code and refactoring it until it becomes &ldquo;Clean Code.&rdquo; — This is a simple example of a few good practices applied:</p>

<ul>
<li>Automated testing.</li>
<li>Refactoring.</li>
<li>Clean Code.</li>
</ul>


<h2>Not Every &ldquo;Best&rdquo; Practice is Always Good — Context is King</h2>

<p>Let&rsquo;s say that you&rsquo;ve committed to using a whole bunch of best practices, such as keeping your code decoupled and flexible using design patterns. Moreover, you&rsquo;ve decided to exhaustively implement and test all the different scenarios that you think could happen in the future.</p>

<p>These are all that many would consider best practices.</p>

<p>That sounds quite reasonable, however, applied in the wrong context, that could lead to the following:</p>

<ul>
<li>The business never leveraged that extra flexibility because no need in the future came to pass.</li>
<li>You still had to maintain more code that was more complex to support these flexibilities for many years. That&rsquo;s an extra cost — WASTE.</li>
<li>It took you originally longer to implement the functionality — WASTE.</li>
<li>Oh, and half of the scenarios you came up with also never happened. The feature changed significantly after customer feedback, so most cases became impossible later on. — WASTE.</li>
<li>Additionally, one of the flexibilities constrained the implementation of another flexibility that became required later on. So the business had to go for a trade-off and deliver less value to the customer. — ACTUAL BUSINESS VALUE DAMAGE.</li>
</ul>


<p>As you can see, the idea was to increase quality, increase speed in the future, and deliver as much customer and business value as possible.</p>

<p>What happened instead?</p>

<p>The quality was excellent — that&rsquo;s all good!</p>

<p>Now, the speed was initially slower, and it kept being slower in the future because none of the expected came to pass.</p>

<p>The best thing you can expect in software development is change (not the one you expected). Also, prepare to have your expectations and assumptions hammered all the time.</p>

<p>Finally, too much flexibility harmed the business value.</p>

<p>The same set of practices could&rsquo;ve been fantastic in another context, where you, for example, precisely know what will happen in the future. An example scenario is when you&rsquo;re rebuilding an existing successful system.</p>

<p>In that case, you would have gotten lots of speed, quality, and business value throughout the endeavor.</p>

<h2>Software Engineering Practices Are Based on Principles</h2>

<p>What are these practices based on? How to detect whether the context is proper or not? When to apply and when not? How to apply?</p>

<p>You guide the choice of practices and patterns by the software engineering principles!</p>

<p>When you adopt multiple principles (such as YAGNI, DRY, SOLID, etc.), they will guide you when you need to act in specific ways (e.g., apply one practice or another, or make this or that choice).</p>

<p>The challenge would be when multiple principles you&rsquo;ve adopted conflict with each other.</p>

<p>That&rsquo;s when you&rsquo;ll have to make trade-offs.</p>

<h2>Where do Principles Come From? How to choose?</h2>

<p>Principles should be based on values. The values that you, your team, and your organization adopts.</p>

<p>For example, when I was talking about the &ldquo;Holy Grail of SWE,&rdquo; I&rsquo;ve mentioned the &ldquo;speed x quality x value&rdquo; as the three most important ones. That&rsquo;s a value statement.</p>

<p>Also, who said that these three values are the silver bullet to success? Nobody knows. Every person and organization can have its own set of values.</p>

<p>However, for any organization or group to achieve a big goal and execute a complex strategy, it would need to align everybody involved on the same set of values.</p>

<p>Once you and your group have agreed on what values you should adopt to achieve the challenging long-term goals, you must pick or create the principles that will get you there.</p>

<p>Picking existing principles that are tried and tested to improve software engineering in terms of the values you&rsquo;ve chosen is the most straightforward approach. However, that shouldn&rsquo;t deter you from thinking about a custom set of principles that would work for your group&rsquo;s values in particular.</p>

<h2>Example Values That I Like to Optimize For</h2>

<p>I&rsquo;ll give you a few values that I usually go for in most software products where the only constant is the change itself:</p>

<ul>
<li>Shortest lead time — how long does it take from idea inception to value delivery to the hands of the user.</li>
<li>Lowest inventory — how much work is &ldquo;done&rdquo; but isn&rsquo;t being used by anybody (by users, other developers, or other team members).</li>
<li>Highest quality — how many bugs or failures the software has. It should behave precisely as the development team expects it to.</li>
<li>Largest valuable impact — how valuable is the software to the user, customer, and the business.</li>
</ul>


<p>Once these values are defined, it&rsquo;s pretty simple to pick the principles to guide the decisions.</p>

<h2>Example Software Engineering Principles</h2>

<ul>
<li>LEAN product and development</li>
<li>YAGNI/KISS</li>
<li>Evolutionary Design</li>
<li>Simple Design</li>
<li>SOLID</li>
<li>High-coverage automated testing (no manual QA)</li>
<li>No throwing responsibilities over to another department — Extreme ownership</li>
<li>Code stewardship (next level after ownership)</li>
</ul>


<p>And given the principles, you can pick or design your software engineering practices.</p>

<h2>Example Software Engineering Practices</h2>

<ul>
<li>TDD &amp; BDD &amp; ATDD</li>
<li>Continuous Refactoring</li>
<li>CI/CD</li>
<li>Trunk-Based Development (TBD) &amp; &ldquo;Live on Main&rdquo;</li>
<li>Clean Code</li>
<li>Slicing work items as small as possible</li>
<li>Instant Code Review (aka Pair-programming)</li>
<li>Ensemble programming</li>
<li>Rolling pair rotation</li>
<li>Spike &amp; PoC (for experimentation)</li>
<li>Design Patterns</li>
</ul>


<p>Most of these are parts of original Extreme Programming, and this is no surprise because the values I have listed above are almost the same as values of XP.</p>

<p>Moreover, there are a few more principles and practices that are modern, and they could be considered as the evolution of XP.</p>

<h2>Values, Principles &amp; Practices Are Technology-Agnostic</h2>

<p>Now I want to return to that situation where the developer responded with a list of technologies when asked about practices.</p>

<p>Here&rsquo;s the thing: the practices, principles, and values are universal. No matter which technology you use, you can rely on your practices, given that your principles and values haven&rsquo;t changed.</p>

<p>Moreover, when you master the practices and principles, you&rsquo;ll be able to change technologies and tools like gloves while maintaining high parameters on all your values and delivering excellent results!</p>

<h2>Conclusion</h2>

<p>Of course, if you are starting in software engineering, knowing <strong>specific technologies</strong> is most essential for you.</p>

<p>That&rsquo;s because your effectiveness is a product of your tools experience and the practices you apply. And to use and understand the practices, you need to have at least a bit of skill with the programming language and basic problem-solving.</p>

<p>However, beyond that, the equation:</p>

<p>TOOLS SKILL x PRACTICES SKILL x SOFT SKILLS</p>

<p>kicks in!</p>

<p>So the most effective way to develop as a software engineer is to have both a robust set of hard and soft skills and learn and apply the best software engineering practices (that are applicable in your context).</p>

<p>Thank you for reading!</p>

<p>If you have other ideas on the topic, <a href="https://twitter.com/tdd_fellow">feel free to send me a Tweet</a>!</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Are We Addicted to Complexity?]]></title>
    <link href="http://www.tddfellow.com/blog/2021/09/08/are-we-addicted-to-complexity/"/>
    <updated>2021-09-08T14:49:04+02:00</updated>
    <id>http://www.tddfellow.com/blog/2021/09/08/are-we-addicted-to-complexity</id>
    <content type="html"><![CDATA[<p>As software engineers, we tend to be lifelong learners. Suppose our current job becomes less challenging, and there is nothing more to learn. In that case, we usually resort to one of the following:</p>

<ul>
<li>Find a more exciting team or company.</li>
<li>Start something on the side in our free time.</li>
<li>Bring more advanced concepts to the current team and codebase.</li>
</ul>


<p>It&rsquo;s the third one that is the most worrying because it happens way too often, and it&rsquo;s probably more harmful than you think.</p>

<!-- more -->


<p>This article isn&rsquo;t preaching against new technologies, architectures, etc.</p>

<p>Instead, I&rsquo;d like to point out that in about 95% of the cases, they are introduced years before they are actually necessary. Instead of making the software more straightforward, this makes the software more complex.</p>

<p>What should we do instead if we want to learn more new stuff then?</p>

<p>Well, one thing is to invert your focus. Instead of chasing something more complex, take on the challenge of making what you have much simpler.</p>

<p>In fact, making the existing codebase and architecture more straightforward than it already is — is a considerable challenge, in the process of which you are guaranteed to learn new things!</p>

<p>Suppose you feel the urge to learn something new and deal with a more complex task. Perhaps, you should talk to your business stakeholders to see if they have an idea that they don&rsquo;t even want to mention to product &amp; engineering. (Because they think it&rsquo;s too challenging or impossible)</p>

<p>These types of ideas are where there is real gold for learning, innovation, and valuable complexity!</p>

<p>If you have other ideas on the topic, <a href="https://twitter.com/tdd_fellow">feel free to send me a Tweet</a>!</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Feedback Time at the End of the Pairing Session]]></title>
    <link href="http://www.tddfellow.com/blog/2017/03/22/feedback-time-at-the-end-of-the-pairing-session/"/>
    <updated>2017-03-22T08:01:29+01:00</updated>
    <id>http://www.tddfellow.com/blog/2017/03/22/feedback-time-at-the-end-of-the-pairing-session</id>
    <content type="html"><![CDATA[<p>Hi there! Today I want to share the technique that we are using to improve the collaboration inside of our teams. This technique is most useful in synergy with the pairing. It is so powerful that it can remove the tension from our work and make us more productive in two or three days.</p>

<p>First, let me give you some context.</p>

<!-- more -->


<h2>Pairing ~100% of the Time</h2>

<p>At <a href="https://pivotal.io">Pivotal</a> we pair all the time. It is very rare to see anyone solo. Pairing does not end with pair-programming, it also includes other roles such as design and product. Also, pairing is, at times, cross-functional, e.g.: product designer pairs with a software engineer, or product designer pairs with a product manager, etc. I love that.</p>

<p>With pairing, not everything is so shiny.</p>

<h3>Chemistry</h3>

<p>Now and then, you need to pair with someone, you have never paired with before. That happens in the event of new hires, team member rotations between teams, and cross-team pairing sessions.</p>

<p>We are all humans, so, from time to time, it feels like you are not getting along very well with your pair. There is a certain amount of tension. Of course, that harms your productivity, and, also, drains your energy.</p>

<p>On the contrary side, the chemistry between pairs might be so good, that you are just having fun the whole day and enjoy the pairing session, and the amount of work being done is suboptimal.</p>

<p>The pairing session might go not so well not only because of chemistry. Pairs could have chosen a non-suitable style of pairing (one of: ping-pong, switch on red, driver-navigator, etc.). From time to time, how pairs solve the problem, can also be improved.</p>

<h2>Five Minutes Feedback Time</h2>

<p>That is a technique that we are utilizing all the time when we have such problems. First, ask your pair if they want to apply this technique and reserve 5 minutes at the end of the pairing session (end of the work day is the most suitable). Then, when the time comes, give each other the feedback in the format of &ldquo;Pluses and Deltas&rdquo;:</p>

<ul>
<li>First, tell what went well.</li>
<li>Second, describe what could be improved.</li>
</ul>


<p>When both pairs are proficient with this technique, then most of the problems can be resolved in 2-4 pairing sessions. By &ldquo;proficient&rdquo; we mean here: both are open to receiving the feedback, and are capable of calling out complicated things without triggering defensiveness on the receiving side.</p>

<p>If the whole team applies this technique daily for two or three weeks, they will have to stop using it because there will be nothing to talk about anymore. That means that the team has solved most of the problems, and there is no longer need in a daily application of such technique.</p>

<h2>Conclusion</h2>

<p>All these problems are not unique to pairing. They are inherent to the collaboration. Essentially, any team will have these problems. It is just that, in non-pairing environments, these problems will become apparent only after months of work. That is all while they continue harming productivity and people&rsquo;s happiness for these long months.</p>

<p>With pairing these problems become apparent immediately. So you can start fixing them on the day one, and not after the half a year of the broken collaboration.</p>

<p>If you pair often, or if you have any other sort of collaboration within the team, I recommend trying out this technique. It will take some time to get proficient at giving feedback.</p>

<p>There is <a href="https://www.infoq.com/presentations/feedback-models-techniques">a marvelous talk</a> from <a href="https://dannorth.net">Dan North</a> on how to provide an effective feedback in different contexts.</p>

<h2>Thanks</h2>

<p>Thank you for reading, my dear reader. If you liked it, please share this article on social networks, Reddit, and Hacker News, and follow me on Twitter: <a href="https://twitter.com/tdd_fellow">@tdd_fellow</a>.</p>

<p>If you have any questions or feedback for me, don’t hesitate to reach me out on Twitter: <a href="https://twitter.com/tdd_fellow">@tdd_fellow</a>.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[On Being More Productive in the Morning. Even if You Are an Owl]]></title>
    <link href="http://www.tddfellow.com/blog/2017/03/21/on-being-more-productive-in-the-morning-even-if-you-are-an-owl/"/>
    <updated>2017-03-21T07:58:17+01:00</updated>
    <id>http://www.tddfellow.com/blog/2017/03/21/on-being-more-productive-in-the-morning-even-if-you-are-an-owl</id>
    <content type="html"><![CDATA[<p>Hi there! Today I want to share my experience of a productivity shift from the late evening/night to the morning. First, let me tell you a story on how my day was structured before for countless years.</p>

<h2>Mornings That Start with a Lunch</h2>

<!-- more -->


<p>A year ago and before I was pulling out late nights almost every single day. Making an open-source contribution, working on the astounding side project idea, writing a blog post, watching a conference talk or a fun video. As an owl type, I have a lot of bright ideas at that time of day. Also, my productivity is at its top. Or at least it feels that way.</p>

<p>That usually meant, that I would go to work next day somewhere between 10 AM and 12 PM. Mostly, that was okay because a lot of other developers around me did the same thing.</p>

<p>So, imagine having your work day (for your employer, client or yourself) start this way:</p>

<ol>
<li>Come to the work</li>
<li>Drink coffee and eat breakfast, because, obviously you didn&rsquo;t have time to do that at home</li>
<li>Chit chat with your colleagues (offline or online), go through the email inbox</li>
<li>Do some work for half an hour</li>
<li>It is a lunch time</li>
<li>Food coma for 1 hour</li>
<li>Be not-so-productive (because you&rsquo;re tired and an owl type) for what you have left in a day (2-4 hours)</li>
<li>Maybe pull out overtime because there are things to deliver and you are the most productive in the evening/night</li>
</ol>


<p>You can see, that my work day wasn&rsquo;t as productive as it should. One may say that I&rsquo;m just shifting focus to my activities and invest less productivity into the work for my employer/client/etc. And I have another story to tell here.</p>

<h2>A Lot of Rework</h2>

<p>I have been noticing for some time that all the work that I do in the late evenings and the night for myself needs to be re-worked all the time. To put it simply, quality of my most &ldquo;productive&rdquo; work was not as good as I would expect it to be.</p>

<p>Additionally, since I was working in a pair-programming environment and everybody started their work day at a different time, it was hard to pair-program all the time - there was a lot of time I had to solo. When I have joined <a href="https://pivotal.io">Pivotal</a> I was amazed by the fact that they pair-program nearly 100% of the time. I was enjoying that right from the first day. Pairing 100% of the time also means that the whole team has to start the work day and end it at the same time. We are starting early in the morning, and ending our work day at 5 PM every day.</p>

<p>Also, at Pivotal we <a href="http://www.businessinsider.de/pivotal-ceo-rob-mee-on-meetings-2016-7?r=US&amp;IR=T">finish all of our daily meetings in 10 minutes</a> right at the beginning of the day. We&rsquo;re off to work right after. That builds a crazy momentum of making things done and makes us productive.</p>

<h2>Productive Mornings with Momentum</h2>

<p>That kind of momentum results in a lot of done work. The amount of work being done before lunch ultimately exceeds the amount of work I remember doing after lunch and, especially, in the evening.</p>

<p>Even though I feel more productive in the late evening, and in the night, practical results show that most productive work is done in the morning if I maintain that kind of momentum.</p>

<p>Maybe it is only about work, what about personal things that I need to do? - One might ask. I have another story for you. A couple of months ago I started developing a <a href="https://www.amazon.com/gp/product/1494882272/ref=as_li_tl?ie=UTF8&amp;camp=1789&amp;creative=9325&amp;creativeASIN=1494882272&amp;linkCode=as2&amp;tag=tddfellow-20&amp;linkId=b6cd36eccddacf6c74eac24496ce206f">&ldquo;mini habit&rdquo;</a>: wake up every day at 6 AM. That gives me about 50 minutes of free time before I need to go to the office. Add to that 35-45 minutes commute on the subway. Now and then, when I am talking to my pair during our break (we are using the <a href="http://pomodorotechnique.com">pomodoro productivity technique</a>), I realize that at 9:05 AM I have done all the personal things that I have to do today. These things include morning exercise, household chores, contributing to open-source, writing a blog post, reading a book, sending a letter, etc. By the way, most of these things are also mini habits.</p>

<p>Another thing that I am experiencing right now is that the quality of the work is much higher than before - I have to do much less reworking. I still get the most remarkable ideas in the evening and before going to sleep, so what do I do about them? Note them down, and go through them next morning or later.</p>

<h2>Thanks</h2>

<p>I am amazed so far, how waking up in the morning every day, earlier than you normally have to, allows to build up a significant momentum, complete all the personal tasks that need to be done and transfer that increased momentum to my work. It works very well for me, and I recommend trying it, even if you are an owl type.</p>

<p>Thank you for reading, my dear reader. If you liked it, please share this article on social networks and follow me on Twitter: <a href="https://twitter.com/tdd_fellow">@tdd_fellow</a>.</p>

<p>If you have any questions or feedback for me, don’t hesitate to reach me out on Twitter: <a href="https://twitter.com/tdd_fellow">@tdd_fellow</a>.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Drake's 24 Hours Challenge or How to Be Less Negative]]></title>
    <link href="http://www.tddfellow.com/blog/2017/03/20/drakes-24-hours-challenge-or-how-to-be-less-negative/"/>
    <updated>2017-03-20T07:53:37+01:00</updated>
    <id>http://www.tddfellow.com/blog/2017/03/20/drakes-24-hours-challenge-or-how-to-be-less-negative</id>
    <content type="html"><![CDATA[<p>Did you ever look at the chunk of code that is not very pretty, and immediately uttered some bad word or bad remark, such as &ldquo;Who wrote this?&rdquo; And not even noticed it?</p>

<p>Or did you ever had an incident happening in production, and half of your vocabulary at that time was not normative? Also, did you feel stressed and down afterward?</p>

<p>Or did you ever had to converse with a difficult person or someone holding a strong opinion, and thought not very good about them? Or even dismissed a valid argument just because you didn&rsquo;t like the conversation?</p>

<p>Did you ever felt or did something negative, and thought afterward that it would be better not to? Then the technique described in this article is perfect for you!</p>

<!-- more -->


<p>Shall we get the ball rolling?</p>

<h2>Drake&rsquo;s Challenge</h2>

<p>About one year ago I was talking to <a href="https://www.danielirvine.com">Daniel Irvine</a> at the Software Craftsmanship meetup in Berlin about the technique that he was applying daily. I was amazed by how challenging it is and what results it can potentially yield. Since then I&rsquo;m using this technique to increase awareness of how I feel, what I think, and what I am about to say.</p>

<p>It gives me the ability to respond to events around me instead of reacting to them. The reaction is the immediate reply executed by the subconscious part of our brain. The response is the delayed reply produced by the concious part of our brain. Responding is much better because it gives us time to think what would be the best response to the current situation. Especially it is better when something negative or weird is happening around us.</p>

<p>Enough preaching, let me tell you the challenge itself. For twenty-four hours do not say anything negative and do not think negatively.</p>

<h3>How I Apply It</h3>

<ol>
<li>Get the stopwatch application running on my smartphone.</li>
<li>Start the stopwatch and leave the app in the background.</li>
<li>Every time I notice a negative thought, or I am saying something negative, reset the stopwatch.</li>
</ol>


<h3>My Experience So Far</h3>

<p>Over this year, I felt like I can detect the negative feeling before it manifests as a negative thought, judgement, or a phrase. That helps me to be calmer, be more patient, and not spend time on insignificant things. If I know that something makes me unhappy or confuses me, I can call it out, and fix the problem without causing people around me to feel bad about it. Additionally, it makes me feel better.</p>

<p>Another thing that I have learned that, as soon as I am tired, I lose these abilities and fall back to reacting instead of responding. Good night sleep helps a lot with that ;)</p>

<p>I highly recommend you try this challenge. Caution: it is very hard.</p>

<h2>Thanks</h2>

<p>Thank you for reading, my dear reader. If you liked it, please share this article on social networks and follow me on Twitter: <a href="https://twitter.com/tdd_fellow">@tdd_fellow</a>.</p>

<p>If you have any questions or feedback for me, don’t hesitate to reach me out on Twitter: <a href="https://twitter.com/tdd_fellow">@tdd_fellow</a>.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Build Your Own Testing Framework. Part 6: Test Suite Does Not Run All Tests!]]></title>
    <link href="http://www.tddfellow.com/blog/2017/03/13/build-your-own-testing-framework-part-6-test-suite-does-not-run-all-tests/"/>
    <updated>2017-03-13T23:13:28+01:00</updated>
    <id>http://www.tddfellow.com/blog/2017/03/13/build-your-own-testing-framework-part-6-test-suite-does-not-run-all-tests</id>
    <content type="html"><![CDATA[<p>Welcome back to the new issue of &ldquo;Build Your Own Testing Framework&rdquo; series! When trying to implement better formatting, we have discovered that some of our test suites do not run all tests! Today we are going to fix that, and we will make sure that such test suite will fail if it didn&rsquo;t execute all tests.</p>

<!-- more -->


<p>This article is the sixth one of the series “Build Your Own Testing Framework” so make sure to stick around for next parts! Find all posts of these series <a href="http://www.tddfellow.com/blog/categories/build-your-own-testing-framework/">here</a>.</p>

<p>Shall we get started?</p>

<h2>Verify All Tests Run</h2>

<p>We will start from the <code>RunTestSuiteTest</code> and run the test suite with the single test. Then we are going to assert that for that the test with the name <code>testOk</code> has been reported as passing:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="c1">// test/RunTestSuiteTest.js</span>
</span><span class='line'>
</span><span class='line'><span class="k">this</span><span class="p">.</span><span class="nx">testItOutputsOkForThePassingTest</span> <span class="o">=</span> <span class="kd">function</span> <span class="p">()</span> <span class="p">{</span>
</span><span class='line'>    <span class="nx">runTestSuite</span><span class="p">(</span><span class="kd">function</span> <span class="p">(</span><span class="nx">t</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>        <span class="k">this</span><span class="p">.</span><span class="nx">testOk</span> <span class="o">=</span> <span class="kd">function</span> <span class="p">()</span> <span class="p">{</span>
</span><span class='line'>            <span class="nx">t</span><span class="p">.</span><span class="nx">assertTrue</span><span class="p">(</span><span class="kc">true</span><span class="p">);</span>
</span><span class='line'>        <span class="p">};</span>
</span><span class='line'>    <span class="p">},</span> <span class="p">{</span><span class="nx">reporter</span><span class="o">:</span> <span class="nx">reporter</span><span class="p">});</span>
</span><span class='line'>
</span><span class='line'>    <span class="nx">reporter</span><span class="p">.</span><span class="nx">assertHasReportedPassingTest</span><span class="p">(</span><span class="s2">&quot;testOk&quot;</span><span class="p">);</span>
</span><span class='line'><span class="p">};</span>
</span></code></pre></td></tr></table></div></figure>


<p>If we run this test suite, we can see that only one test executes!</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="nx">RunTestSuiteTest</span>
</span><span class='line'>    <span class="nx">testItCallsAllTestMethods</span>
</span><span class='line'>
</span><span class='line'><span class="nx">Process</span> <span class="nx">finished</span> <span class="kd">with</span> <span class="nx">exit</span> <span class="nx">code</span> <span class="mi">0</span>
</span></code></pre></td></tr></table></div></figure>


<p>Oh, that is interesting. This test suite does not run. Upon investigating, it turns out, that <code>process.exit(0)</code> is being called during the <code>runTestSuite(...)</code> function run. That is because of the latest feature that we have implemented - &ldquo;exit with an appropriate exit code (zero for success, and one for failure).&rdquo; We should be able to fix that by providing the process spy in the options of the <code>runTestSuite</code> function that we are calling from the inside of the individual tests in the <code>RunTestSuiteTest</code> test suite. And we ought to alleviate this kind of mistake somehow - we need a mechanism that would alert us if not all tests have been run. Maybe something like <code>verifyAllTestsRun: true</code> option for the <code>runTestSuite</code>. For that let&rsquo;s write a test:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="k">this</span><span class="p">.</span><span class="nx">testVerifyAllTestsRun</span> <span class="o">=</span> <span class="kd">function</span> <span class="p">()</span> <span class="p">{</span>
</span><span class='line'>    <span class="nx">t</span><span class="p">.</span><span class="nx">assertThrow</span><span class="p">(</span><span class="s2">&quot;Expected all tests to run&quot;</span><span class="p">,</span> <span class="kd">function</span> <span class="p">()</span> <span class="p">{</span>
</span><span class='line'>
</span><span class='line'>        <span class="nx">runTestSuite</span><span class="p">(</span><span class="kd">function</span> <span class="nx">SuiteWithTwoTests</span><span class="p">(</span><span class="nx">t</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>
</span><span class='line'>            <span class="k">this</span><span class="p">.</span><span class="nx">testWithRunTestSuite</span> <span class="o">=</span> <span class="kd">function</span> <span class="p">()</span> <span class="p">{</span>
</span><span class='line'>                <span class="nx">runTestSuite</span><span class="p">(</span><span class="kd">function</span> <span class="p">(</span><span class="nx">t</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>                    <span class="k">this</span><span class="p">.</span><span class="nx">testOne</span> <span class="o">=</span> <span class="kd">function</span> <span class="p">()</span> <span class="p">{};</span>
</span><span class='line'>                <span class="p">},</span> <span class="p">{</span><span class="nx">reporter</span><span class="o">:</span> <span class="nx">reporter</span><span class="p">});</span>
</span><span class='line'>            <span class="p">};</span>
</span><span class='line'>
</span><span class='line'>            <span class="k">this</span><span class="p">.</span><span class="nx">testThatShouldAlsoRun</span> <span class="o">=</span> <span class="kd">function</span> <span class="p">()</span> <span class="p">{};</span>
</span><span class='line'>
</span><span class='line'>        <span class="p">},</span> <span class="p">{</span><span class="nx">reporter</span><span class="o">:</span> <span class="nx">reporter</span><span class="p">,</span>
</span><span class='line'>            <span class="nx">process</span><span class="o">:</span> <span class="nx">process</span><span class="p">,</span>
</span><span class='line'>            <span class="nx">verifyAllTestsRun</span><span class="o">:</span> <span class="kc">true</span><span class="p">});</span>
</span><span class='line'>
</span><span class='line'>    <span class="p">});</span>
</span><span class='line'><span class="p">};</span>
</span></code></pre></td></tr></table></div></figure>


<p>That might be a bit complex at first. Let&rsquo;s take a closer look how this test is supposed to work:</p>

<ol>
<li>First of all, we do assert that there was an assertion failure about all tests required to run.</li>
<li>Inside of the action for this assertion we create and run the new test suite with two tests:

<ul>
<li>test with the <code>runTestSuite</code> without process spy provided</li>
<li>empty test that should also execute</li>
</ul>
</li>
</ol>


<p>If we run this test, it will pass. That is unexpected because we wanted it to fail. Apparently, most inner <code>runTestSuite</code> is doing <code>process.exit(0)</code>.</p>

<p>For that to work, we will need to be able to provide a hook into <code>process.exit(code)</code> function. For that, we would need to create a <code>SimpleProcess</code> class, that allows installation of such hooks. Let&rsquo;s test-drive it!</p>

<h3><code>process.exit</code> with hooks</h3>

<p>First, we should start from the normal behavior without any hooks:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="c1">// test/SimpleProcessTest.js</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">runTestSuite</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s2">&quot;../src/TestingFramework&quot;</span><span class="p">);</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">SimpleProcess</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s2">&quot;../src/TestingFramework&quot;</span><span class="p">).</span><span class="nx">SimpleProcess</span><span class="p">;</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">ProcessSpy</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s2">&quot;./ProcessSpy&quot;</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'><span class="nx">runTestSuite</span><span class="p">(</span><span class="kd">function</span> <span class="nx">SimpleProcessTest</span><span class="p">(</span><span class="nx">t</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">this</span><span class="p">.</span><span class="nx">testWithoutHooks</span> <span class="o">=</span> <span class="kd">function</span> <span class="p">()</span> <span class="p">{</span>
</span><span class='line'>        <span class="kd">var</span> <span class="nx">globalProcess</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">ProcessSpy</span><span class="p">();</span>
</span><span class='line'>        <span class="kd">var</span> <span class="nx">process</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">SimpleProcess</span><span class="p">(</span><span class="nx">globalProcess</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>        <span class="nx">process</span><span class="p">.</span><span class="nx">exit</span><span class="p">(</span><span class="mi">0</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>        <span class="nx">t</span><span class="p">.</span><span class="nx">assertEqual</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="nx">globalProcess</span><span class="p">.</span><span class="nx">hasExitedWithCode</span><span class="p">);</span>
</span><span class='line'>    <span class="p">};</span>
</span><span class='line'><span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>


<p>When running this test, we will get a failure about <code>SimpleProcess</code> being undefined. So let&rsquo;s define it:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="c1">// src/TestingFramework.js</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// ...</span>
</span><span class='line'><span class="c1">// define the class itself</span>
</span><span class='line'><span class="kd">function</span> <span class="nx">SimpleProcess</span><span class="p">(</span><span class="nx">globalProcess</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// ..</span>
</span><span class='line'><span class="c1">// and don&#39;t forget to export it</span>
</span><span class='line'><span class="nx">module</span><span class="p">.</span><span class="nx">exports</span><span class="p">.</span><span class="nx">SimpleProcess</span> <span class="o">=</span> <span class="nx">SimpleProcess</span><span class="p">;</span>
</span></code></pre></td></tr></table></div></figure>


<p>If we run our test suite now, we will get an error <code>TypeError: process.exit is not a function</code>. To fix that failure we will have to define the <code>exit(code)</code> method on our newly created class <code>SimpleProcess</code>:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="kd">function</span> <span class="nx">SimpleProcess</span><span class="p">(</span><span class="nx">globalProcess</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">this</span><span class="p">.</span><span class="nx">exit</span> <span class="o">=</span> <span class="kd">function</span> <span class="p">(</span><span class="nx">code</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>
</span><span class='line'>    <span class="p">};</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>After doing that we will get an assertion failure <code>Error: Expected to equal 0, but got: null</code>, as expected. To make the test pass, it would be enough to call <code>globalProcess.exit(0)</code>:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="k">this</span><span class="p">.</span><span class="nx">exit</span> <span class="o">=</span> <span class="kd">function</span> <span class="p">(</span><span class="nx">code</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="nx">globalProcess</span><span class="p">.</span><span class="nx">exit</span><span class="p">(</span><span class="mi">0</span><span class="p">);</span>
</span><span class='line'><span class="p">};</span>
</span></code></pre></td></tr></table></div></figure>


<p>If we run our test suite now, we will get no failures. That is great! Now, we can see that <code>globalProcess.exit(0)</code> is probably not exactly what we want to have there. We ought to pass the <code>code</code> parameter to the <code>exit</code> function. To test-drive this properly, we will have to triangulate, i.e.: add another test with the different value of the <code>code</code> parameter:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="k">this</span><span class="p">.</span><span class="nx">testWithoutHooks_andDifferentExitCode</span> <span class="o">=</span> <span class="kd">function</span> <span class="p">()</span> <span class="p">{</span>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">globalProcess</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">ProcessSpy</span><span class="p">();</span>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">process</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">SimpleProcess</span><span class="p">(</span><span class="nx">globalProcess</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>    <span class="nx">process</span><span class="p">.</span><span class="nx">exit</span><span class="p">(</span><span class="mi">1</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>    <span class="nx">t</span><span class="p">.</span><span class="nx">assertEqual</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="nx">globalProcess</span><span class="p">.</span><span class="nx">hasExitedWithCode</span><span class="p">);</span>
</span><span class='line'><span class="p">};</span>
</span></code></pre></td></tr></table></div></figure>


<p>That fails as expected: <code>Error: Expected to equal 1, but got: 0</code>. To make it pass we can either write some weird &ldquo;if&rdquo; statement or we could pass the <code>code</code> parameter to the <code>globalProcess.exit</code> function. The second option is simpler. According to the third rule of test-driven development, we should go for it:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="k">this</span><span class="p">.</span><span class="nx">exit</span> <span class="o">=</span> <span class="kd">function</span> <span class="p">(</span><span class="nx">code</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="nx">globalProcess</span><span class="p">.</span><span class="nx">exit</span><span class="p">(</span><span class="nx">code</span><span class="p">);</span>
</span><span class='line'><span class="p">};</span>
</span></code></pre></td></tr></table></div></figure>


<p>That change makes our test suite pass. We probably should refactor the test suite to reduce the level of the duplication by extracting common variables from the tests:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="nx">runTestSuite</span><span class="p">(</span><span class="kd">function</span> <span class="nx">SimpleProcessTest</span><span class="p">(</span><span class="nx">t</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">globalProcess</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">ProcessSpy</span><span class="p">();</span>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">process</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">SimpleProcess</span><span class="p">(</span><span class="nx">globalProcess</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">this</span><span class="p">.</span><span class="nx">testWithoutHooks</span> <span class="o">=</span> <span class="kd">function</span> <span class="p">()</span> <span class="p">{</span>
</span><span class='line'>        <span class="nx">process</span><span class="p">.</span><span class="nx">exit</span><span class="p">(</span><span class="mi">0</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>        <span class="nx">t</span><span class="p">.</span><span class="nx">assertEqual</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="nx">globalProcess</span><span class="p">.</span><span class="nx">hasExitedWithCode</span><span class="p">);</span>
</span><span class='line'>    <span class="p">};</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">this</span><span class="p">.</span><span class="nx">testWithoutHooks_andDifferentExitCode</span> <span class="o">=</span> <span class="kd">function</span> <span class="p">()</span> <span class="p">{</span>
</span><span class='line'>        <span class="nx">process</span><span class="p">.</span><span class="nx">exit</span><span class="p">(</span><span class="mi">1</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>        <span class="nx">t</span><span class="p">.</span><span class="nx">assertEqual</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="nx">globalProcess</span><span class="p">.</span><span class="nx">hasExitedWithCode</span><span class="p">);</span>
</span><span class='line'>    <span class="p">};</span>
</span><span class='line'><span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>


<p>At that point, we should move on to tests for the hook installation functionality. Because right now we need only at most one hook we will not support multiple hooks at the same time - only one:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="k">this</span><span class="p">.</span><span class="nx">testCanInstallOneHook</span> <span class="o">=</span> <span class="kd">function</span> <span class="p">()</span> <span class="p">{</span>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">aSpy</span> <span class="o">=</span> <span class="nx">t</span><span class="p">.</span><span class="nx">spy</span><span class="p">();</span>
</span><span class='line'>
</span><span class='line'>    <span class="nx">process</span><span class="p">.</span><span class="nx">installHook</span><span class="p">(</span><span class="nx">aSpy</span><span class="p">);</span>
</span><span class='line'>    <span class="nx">process</span><span class="p">.</span><span class="nx">exit</span><span class="p">(</span><span class="mi">0</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>    <span class="nx">aSpy</span><span class="p">.</span><span class="nx">assertCalled</span><span class="p">();</span>
</span><span class='line'><span class="p">};</span>
</span></code></pre></td></tr></table></div></figure>


<p>When we run this test, it fails because <code>installHook</code> function is not defined: <code>TypeError: process.installHook is not a function</code>. So we should define it:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="kd">function</span> <span class="nx">SimpleProcess</span><span class="p">(</span><span class="nx">globalProcess</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="c1">// ..</span>
</span><span class='line'>    <span class="k">this</span><span class="p">.</span><span class="nx">installHook</span> <span class="o">=</span> <span class="kd">function</span> <span class="p">(</span><span class="nx">aHook</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>
</span><span class='line'>    <span class="p">};</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>Upon running these tests, we get <code>Error: Expected to be called</code> because we didn&rsquo;t call this hook yet. The simplest way to make it pass is to just call the hook from the <code>installHook</code> function:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="kd">function</span> <span class="nx">SimpleProcess</span><span class="p">(</span><span class="nx">globalProcess</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="c1">// ...</span>
</span><span class='line'>    <span class="k">this</span><span class="p">.</span><span class="nx">installHook</span> <span class="o">=</span> <span class="kd">function</span> <span class="p">(</span><span class="nx">aHook</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>        <span class="nx">aHook</span><span class="p">();</span>
</span><span class='line'>    <span class="p">};</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>While that will make the tests pass it is not the behavior that we are after. To drive out the correct behavior, we ought to check that the function is being called only after <code>process.exit(..)</code>, not earlier. For that we will need to have a sanity-check assertion:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="k">this</span><span class="p">.</span><span class="nx">testCanInstallOneHook</span> <span class="o">=</span> <span class="kd">function</span> <span class="p">()</span> <span class="p">{</span>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">aSpy</span> <span class="o">=</span> <span class="nx">t</span><span class="p">.</span><span class="nx">spy</span><span class="p">();</span>
</span><span class='line'>
</span><span class='line'>    <span class="nx">process</span><span class="p">.</span><span class="nx">installHook</span><span class="p">(</span><span class="nx">aSpy</span><span class="p">);</span>
</span><span class='line'>    <span class="nx">aSpy</span><span class="p">.</span><span class="nx">assertNotCalled</span><span class="p">();</span>
</span><span class='line'>
</span><span class='line'>    <span class="nx">process</span><span class="p">.</span><span class="nx">exit</span><span class="p">(</span><span class="mi">0</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>    <span class="nx">aSpy</span><span class="p">.</span><span class="nx">assertCalled</span><span class="p">();</span>
</span><span class='line'><span class="p">};</span>
</span></code></pre></td></tr></table></div></figure>


<p>That fails as expected with the error <code>Error: Expected not to be called</code>. To make it pass we need to store the function in the variable and call it from the <code>process.exit(..)</code>:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="kd">function</span> <span class="nx">SimpleProcess</span><span class="p">(</span><span class="nx">globalProcess</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">hook</span> <span class="o">=</span> <span class="kc">null</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">this</span><span class="p">.</span><span class="nx">exit</span> <span class="o">=</span> <span class="kd">function</span> <span class="p">(</span><span class="nx">code</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>        <span class="k">if</span> <span class="p">(</span><span class="nx">hook</span> <span class="o">!==</span> <span class="kc">null</span><span class="p">)</span>
</span><span class='line'>            <span class="nx">hook</span><span class="p">();</span>
</span><span class='line'>
</span><span class='line'>        <span class="nx">globalProcess</span><span class="p">.</span><span class="nx">exit</span><span class="p">(</span><span class="nx">code</span><span class="p">);</span>
</span><span class='line'>    <span class="p">};</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">this</span><span class="p">.</span><span class="nx">installHook</span> <span class="o">=</span> <span class="kd">function</span> <span class="p">(</span><span class="nx">aHook</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>        <span class="nx">hook</span> <span class="o">=</span> <span class="nx">aHook</span><span class="p">;</span>
</span><span class='line'>    <span class="p">};</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>All the tests pass now! Finally, we want to be able to uninstall the hook, so let&rsquo;s write the test for it:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="k">this</span><span class="p">.</span><span class="nx">testCanUninstallTheHook</span> <span class="o">=</span> <span class="kd">function</span> <span class="p">()</span> <span class="p">{</span>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">aSpy</span> <span class="o">=</span> <span class="nx">t</span><span class="p">.</span><span class="nx">spy</span><span class="p">();</span>
</span><span class='line'>
</span><span class='line'>    <span class="nx">process</span><span class="p">.</span><span class="nx">installHook</span><span class="p">(</span><span class="nx">aSpy</span><span class="p">);</span>
</span><span class='line'>    <span class="nx">process</span><span class="p">.</span><span class="nx">uninstallHook</span><span class="p">();</span>
</span><span class='line'>
</span><span class='line'>    <span class="nx">process</span><span class="p">.</span><span class="nx">exit</span><span class="p">(</span><span class="mi">0</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>    <span class="nx">aSpy</span><span class="p">.</span><span class="nx">assertNotCalled</span><span class="p">();</span>
</span><span class='line'><span class="p">};</span>
</span></code></pre></td></tr></table></div></figure>


<p>To make it work it is enough to introduce this function and set <code>hook</code> variable back to <code>null</code> in it:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="kd">function</span> <span class="nx">SimpleProcess</span><span class="p">(</span><span class="nx">globalProcess</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="c1">// ...</span>
</span><span class='line'>    <span class="k">this</span><span class="p">.</span><span class="nx">uninstallHook</span> <span class="o">=</span> <span class="kd">function</span> <span class="p">()</span> <span class="p">{</span>
</span><span class='line'>        <span class="nx">hook</span> <span class="o">=</span> <span class="kc">null</span><span class="p">;</span>
</span><span class='line'>    <span class="p">};</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>And all the tests will pass. Now we, also, want to replace the default value for the <code>options.process</code> option with the instance of <code>SimpleProcess</code> object. And all the tests should work as they were working before:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="kd">var</span> <span class="nx">simpleProcess</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">SimpleProcess</span><span class="p">(</span><span class="nx">global</span><span class="p">.</span><span class="nx">process</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'><span class="kd">function</span> <span class="nx">TestSuiteRunContext</span><span class="p">(</span><span class="nx">testSuiteConstructor</span><span class="p">,</span> <span class="nx">options</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="c1">// ...</span>
</span><span class='line'>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">process</span> <span class="o">=</span> <span class="nx">options</span><span class="p">.</span><span class="nx">process</span> <span class="o">||</span> <span class="nx">simpleProcess</span><span class="p">;</span>
</span><span class='line'>    <span class="c1">// instead of just &quot;global.process&quot;</span>
</span><span class='line'>
</span><span class='line'>    <span class="c1">// ...</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<h3>Installing the &ldquo;verify all tests run&rdquo; hook</h3>

<p>Now, we can get back to our &ldquo;verify all tests run&rdquo; test. It still doesn&rsquo;t fail as expected, so we need to install the hook, count all tests, count tests that had already run and compare them in the hook:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
<span class='line-number'>37</span>
<span class='line-number'>38</span>
<span class='line-number'>39</span>
<span class='line-number'>40</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="kd">function</span> <span class="nx">TestSuiteRunContext</span><span class="p">(</span><span class="nx">testSuiteConstructor</span><span class="p">,</span> <span class="nx">options</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="c1">// ...</span>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">verifyAllTestsRun</span> <span class="o">=</span> <span class="nx">options</span><span class="p">.</span><span class="nx">verifyAllTestsRun</span> <span class="o">||</span> <span class="kc">false</span><span class="p">;</span>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">testCount</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">testRun</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">this</span><span class="p">.</span><span class="nx">invoke</span> <span class="o">=</span> <span class="kd">function</span> <span class="p">()</span> <span class="p">{</span>
</span><span class='line'>        <span class="k">if</span> <span class="p">(</span><span class="nx">verifyAllTestsRun</span><span class="p">)</span>
</span><span class='line'>            <span class="nx">installVerifyAllTestsRunHook</span><span class="p">();</span>  <span class="c1">// &lt;---</span>
</span><span class='line'>
</span><span class='line'>        <span class="nx">reportTestSuite</span><span class="p">();</span>
</span><span class='line'>        <span class="nx">countAllTests</span><span class="p">();</span>                     <span class="c1">// &lt;---</span>
</span><span class='line'>        <span class="nx">runAllTests</span><span class="p">();</span>
</span><span class='line'>        <span class="nx">finishTestRun</span><span class="p">();</span>
</span><span class='line'>    <span class="p">};</span>
</span><span class='line'>
</span><span class='line'>    <span class="kd">function</span> <span class="nx">installVerifyAllTestsRunHook</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>        <span class="nx">simpleProcess</span><span class="p">.</span><span class="nx">installHook</span><span class="p">(</span><span class="kd">function</span> <span class="p">()</span> <span class="p">{</span>
</span><span class='line'>            <span class="k">if</span> <span class="p">(</span><span class="nx">testRun</span> <span class="o">&lt;</span> <span class="nx">testCount</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>                <span class="k">throw</span> <span class="k">new</span> <span class="nb">Error</span><span class="p">(</span><span class="s2">&quot;Expected all tests to run&quot;</span><span class="p">);</span>
</span><span class='line'>            <span class="p">}</span>
</span><span class='line'>        <span class="p">});</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="c1">// ...</span>
</span><span class='line'>
</span><span class='line'>    <span class="kd">function</span> <span class="nx">countAllTests</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>        <span class="k">for</span> <span class="p">(</span><span class="kd">var</span> <span class="nx">testName</span> <span class="k">in</span> <span class="nx">createTestSuite</span><span class="p">())</span>
</span><span class='line'>            <span class="k">if</span> <span class="p">(</span><span class="nx">testName</span><span class="p">.</span><span class="nx">match</span><span class="p">(</span><span class="sr">/^test/</span><span class="p">))</span>
</span><span class='line'>                <span class="nx">testCount</span><span class="o">++</span><span class="p">;</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="c1">// ...</span>
</span><span class='line'>
</span><span class='line'>    <span class="kd">function</span> <span class="nx">handleTest</span><span class="p">(</span><span class="nx">testName</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>        <span class="nx">testRun</span><span class="o">++</span><span class="p">;</span>                            <span class="c1">// &lt;---</span>
</span><span class='line'>        <span class="nx">reportTest</span><span class="p">(</span><span class="nx">testName</span><span class="p">);</span>
</span><span class='line'>        <span class="nx">runTest</span><span class="p">(</span><span class="nx">createTestSuite</span><span class="p">(),</span> <span class="nx">testName</span><span class="p">);</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>At this point, this throws an error <code>Expected all tests to run</code> and finishes the test fully without reaching our <code>assertThrow(..)</code> assertion. That happens because we catch this error in the function <code>runTest</code>, where we mark the test as failed, log the error and ignore the error object itself from there. One way to solve this problem is to have a particular error, that can propagate up the stack:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="kd">function</span> <span class="nx">installVerifyAllTestsRunHook</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>    <span class="nx">simpleProcess</span><span class="p">.</span><span class="nx">installHook</span><span class="p">(</span><span class="kd">function</span> <span class="p">()</span> <span class="p">{</span>
</span><span class='line'>        <span class="k">if</span> <span class="p">(</span><span class="nx">testRun</span> <span class="o">&lt;</span> <span class="nx">testCount</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>            <span class="kd">var</span> <span class="nx">error</span> <span class="o">=</span> <span class="k">new</span> <span class="nb">Error</span><span class="p">(</span><span class="s2">&quot;Expected all tests to run&quot;</span><span class="p">);</span>
</span><span class='line'>            <span class="nx">error</span><span class="p">.</span><span class="nx">bubbleUp</span> <span class="o">=</span> <span class="kc">true</span><span class="p">;</span>
</span><span class='line'>            <span class="k">throw</span> <span class="nx">error</span><span class="p">;</span>
</span><span class='line'>        <span class="p">}</span>
</span><span class='line'>    <span class="p">});</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// ...</span>
</span><span class='line'>
</span><span class='line'><span class="kd">function</span> <span class="nx">runTest</span><span class="p">(</span><span class="nx">testSuite</span><span class="p">,</span> <span class="nx">testName</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">try</span> <span class="p">{</span>
</span><span class='line'>        <span class="nx">testSuite</span><span class="p">[</span><span class="nx">testName</span><span class="p">]();</span>
</span><span class='line'>    <span class="p">}</span> <span class="k">catch</span> <span class="p">(</span><span class="nx">error</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>        <span class="k">if</span> <span class="p">(</span><span class="nx">error</span><span class="p">.</span><span class="nx">bubbleUp</span><span class="p">)</span> <span class="k">throw</span> <span class="nx">error</span><span class="p">;</span>  <span class="c1">// &lt;---</span>
</span><span class='line'>        <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="nx">silenceFailures</span><span class="p">)</span> <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">error</span><span class="p">);</span>
</span><span class='line'>        <span class="nx">status</span><span class="p">.</span><span class="nx">markAsFailed</span><span class="p">();</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>Now our current test is passing, and the next test is failing with the error <code>Expected all tests to run</code>. That happens because we have not uninstalled the hook as soon as it has triggered. Let&rsquo;s do that:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="kd">function</span> <span class="nx">installVerifyAllTestsRunHook</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>    <span class="nx">simpleProcess</span><span class="p">.</span><span class="nx">installHook</span><span class="p">(</span><span class="kd">function</span> <span class="p">()</span> <span class="p">{</span>
</span><span class='line'>        <span class="k">if</span> <span class="p">(</span><span class="nx">testRun</span> <span class="o">&lt;</span> <span class="nx">testCount</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>            <span class="nx">simpleProcess</span><span class="p">.</span><span class="nx">uninstallHook</span><span class="p">();</span>   <span class="c1">// &lt;---</span>
</span><span class='line'>
</span><span class='line'>            <span class="kd">var</span> <span class="nx">error</span> <span class="o">=</span> <span class="k">new</span> <span class="nb">Error</span><span class="p">(</span><span class="s2">&quot;Expected all tests to run&quot;</span><span class="p">);</span>
</span><span class='line'>            <span class="nx">error</span><span class="p">.</span><span class="nx">bubbleUp</span> <span class="o">=</span> <span class="kc">true</span><span class="p">;</span>
</span><span class='line'>            <span class="k">throw</span> <span class="nx">error</span><span class="p">;</span>
</span><span class='line'>        <span class="p">}</span>
</span><span class='line'>    <span class="p">});</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>That makes the next test run, succeed and exit immediately after that with error code zero. Let&rsquo;s see what will happen if we put <code>verifyAllTestsRun: true</code> on the top test suite here:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="nx">runTestSuite</span><span class="p">(</span><span class="kd">function</span> <span class="nx">RunTestSuiteTest</span><span class="p">(</span><span class="nx">t</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="c1">// ...</span>
</span><span class='line'><span class="p">},</span> <span class="p">{</span><span class="nx">verifyAllTestsRun</span><span class="o">:</span> <span class="kc">true</span><span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>


<p>That doesn&rsquo;t work because we re-install different hook inside of this test and as soon as this test finishes, we uninstall it. So we have two ways out of this situation: allow multiple hooks, or move that single test to its own test suite file. I think the second options is much simpler. Also, we will add the test for the negative case, where all tests run correctly (when we provide proper process spy):</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
<span class='line-number'>37</span>
<span class='line-number'>38</span>
<span class='line-number'>39</span>
<span class='line-number'>40</span>
<span class='line-number'>41</span>
<span class='line-number'>42</span>
<span class='line-number'>43</span>
<span class='line-number'>44</span>
<span class='line-number'>45</span>
<span class='line-number'>46</span>
<span class='line-number'>47</span>
<span class='line-number'>48</span>
<span class='line-number'>49</span>
<span class='line-number'>50</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="c1">// test/VerifyAllTestsRunTest.js</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">runTestSuite</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s2">&quot;../src/TestingFramework&quot;</span><span class="p">);</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">ReporterSpy</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s2">&quot;./ReporterSpy&quot;</span><span class="p">);</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">ProcessSpy</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s2">&quot;./ProcessSpy&quot;</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'><span class="nx">runTestSuite</span><span class="p">(</span><span class="kd">function</span> <span class="nx">VerifyAllTestsRunTest</span><span class="p">(</span><span class="nx">t</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">reporter</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">ReporterSpy</span><span class="p">(</span><span class="nx">t</span><span class="p">);</span>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">process</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">ProcessSpy</span><span class="p">(</span><span class="nx">t</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">this</span><span class="p">.</span><span class="nx">testVerifyAllTestsRun</span> <span class="o">=</span> <span class="kd">function</span> <span class="p">()</span> <span class="p">{</span>
</span><span class='line'>        <span class="nx">t</span><span class="p">.</span><span class="nx">assertThrow</span><span class="p">(</span><span class="s2">&quot;Expected all tests to run&quot;</span><span class="p">,</span> <span class="kd">function</span> <span class="p">()</span> <span class="p">{</span>
</span><span class='line'>
</span><span class='line'>            <span class="nx">runTestSuite</span><span class="p">(</span><span class="kd">function</span> <span class="nx">SuiteWithTwoTests</span><span class="p">(</span><span class="nx">t</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>
</span><span class='line'>                <span class="k">this</span><span class="p">.</span><span class="nx">testWithRunTestSuite</span> <span class="o">=</span> <span class="kd">function</span> <span class="p">()</span> <span class="p">{</span>
</span><span class='line'>                    <span class="nx">runTestSuite</span><span class="p">(</span><span class="kd">function</span> <span class="p">(</span><span class="nx">t</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>                        <span class="k">this</span><span class="p">.</span><span class="nx">testOne</span> <span class="o">=</span> <span class="kd">function</span> <span class="p">()</span> <span class="p">{};</span>
</span><span class='line'>                    <span class="p">},</span> <span class="p">{</span><span class="nx">reporter</span><span class="o">:</span> <span class="nx">reporter</span><span class="p">});</span>
</span><span class='line'>                <span class="p">};</span>
</span><span class='line'>
</span><span class='line'>                <span class="k">this</span><span class="p">.</span><span class="nx">testThatShouldAlsoRun</span> <span class="o">=</span> <span class="kd">function</span> <span class="p">()</span> <span class="p">{};</span>
</span><span class='line'>
</span><span class='line'>            <span class="p">},</span> <span class="p">{</span><span class="nx">reporter</span><span class="o">:</span> <span class="nx">reporter</span><span class="p">,</span>
</span><span class='line'>                <span class="nx">process</span><span class="o">:</span> <span class="nx">process</span><span class="p">,</span>
</span><span class='line'>                <span class="nx">verifyAllTestsRun</span><span class="o">:</span> <span class="kc">true</span><span class="p">});</span>
</span><span class='line'>
</span><span class='line'>        <span class="p">});</span>
</span><span class='line'>    <span class="p">};</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">this</span><span class="p">.</span><span class="nx">testVerifyAllTestsRun_withoutFailure</span> <span class="o">=</span> <span class="kd">function</span> <span class="p">()</span> <span class="p">{</span>
</span><span class='line'>        <span class="nx">t</span><span class="p">.</span><span class="nx">assertNotThrow</span><span class="p">(</span><span class="kd">function</span> <span class="p">()</span> <span class="p">{</span>
</span><span class='line'>
</span><span class='line'>            <span class="nx">runTestSuite</span><span class="p">(</span><span class="kd">function</span> <span class="nx">SuiteWithTwoTests</span><span class="p">(</span><span class="nx">t</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>
</span><span class='line'>                <span class="k">this</span><span class="p">.</span><span class="nx">testWithRunTestSuite</span> <span class="o">=</span> <span class="kd">function</span> <span class="p">()</span> <span class="p">{</span>
</span><span class='line'>                    <span class="nx">runTestSuite</span><span class="p">(</span><span class="kd">function</span> <span class="p">(</span><span class="nx">t</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>                        <span class="k">this</span><span class="p">.</span><span class="nx">testOne</span> <span class="o">=</span> <span class="kd">function</span> <span class="p">()</span> <span class="p">{};</span>
</span><span class='line'>                    <span class="p">},</span> <span class="p">{</span><span class="nx">reporter</span><span class="o">:</span> <span class="nx">reporter</span><span class="p">,</span>
</span><span class='line'>                        <span class="nx">process</span><span class="o">:</span> <span class="nx">process</span><span class="p">});</span>
</span><span class='line'>                <span class="p">};</span>
</span><span class='line'>
</span><span class='line'>                <span class="k">this</span><span class="p">.</span><span class="nx">testThatShouldAlsoRun</span> <span class="o">=</span> <span class="kd">function</span> <span class="p">()</span> <span class="p">{};</span>
</span><span class='line'>
</span><span class='line'>            <span class="p">},</span> <span class="p">{</span><span class="nx">reporter</span><span class="o">:</span> <span class="nx">reporter</span><span class="p">,</span>
</span><span class='line'>                <span class="nx">process</span><span class="o">:</span> <span class="nx">process</span><span class="p">,</span>
</span><span class='line'>                <span class="nx">verifyAllTestsRun</span><span class="o">:</span> <span class="kc">true</span><span class="p">});</span>
</span><span class='line'>
</span><span class='line'>        <span class="p">});</span>
</span><span class='line'>    <span class="p">};</span>
</span><span class='line'><span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>


<p>And this new test suite passes as expected. Just to double-check that these tests verify anything, we can break them (change expected error message and change <code>assertNotThrow</code> to <code>assertThrow</code>) and see if there is a failure and if it looks as expected:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="c1">// was: t.assertThrow(&quot;some error&quot;, ...);</span>
</span><span class='line'><span class="nx">t</span><span class="p">.</span><span class="nx">assertThrow</span><span class="p">(</span><span class="s2">&quot;some error&quot;</span><span class="p">,</span> <span class="kd">function</span> <span class="p">()</span> <span class="p">{</span>
</span><span class='line'>    <span class="c1">// ...</span>
</span><span class='line'><span class="p">});</span>
</span><span class='line'><span class="c1">// =&gt; Error: Expected to equal some error,</span>
</span><span class='line'><span class="c1">//    but got: Expected all tests to run</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// was: t.assertNotThrow(...);</span>
</span><span class='line'><span class="nx">t</span><span class="p">.</span><span class="nx">assertThrow</span><span class="p">(</span><span class="s2">&quot;some error&quot;</span><span class="p">,</span> <span class="kd">function</span> <span class="p">()</span> <span class="p">{</span>
</span><span class='line'>    <span class="c1">// ...</span>
</span><span class='line'><span class="p">});</span>
</span><span class='line'><span class="c1">// =&gt; Error: Expected to throw an error,</span>
</span><span class='line'><span class="c1">//    but nothing was thrown</span>
</span></code></pre></td></tr></table></div></figure>


<p>And it fails as expected, which means that our refactored tests still work as they should.</p>

<blockquote><p>We have just applied a neat technique here: whenever we do a major refactoring in tests, we need to make sure they are still functioning correctly. For that, we break every single one of them (by changing the assertion or breaking the production code). Then we see if they fail as we expect them to. When they don&rsquo;t, we know that refactoring didn&rsquo;t quite work.</p></blockquote>

<h3>Fixing test suites to run all tests</h3>

<p>Now we can go back to the <code>RunTestSuiteTest</code> and see if it works as expected without that test. And it does: <code>Error: Expected all tests to run</code>. To fix that we need to provide a process spy in every inner call to <code>runTestSuite</code>. For that we will first extract <code>{reporter: reporter}</code> as a common variable of the test suite:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="kd">var</span> <span class="nx">options</span> <span class="o">=</span> <span class="p">{</span><span class="nx">reporter</span><span class="o">:</span> <span class="nx">reporter</span><span class="p">};</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// ...</span>
</span><span class='line'><span class="c1">// all the inner calls to &quot;runTestSuite&quot;:</span>
</span><span class='line'><span class="nx">runTestSuite</span><span class="p">(</span><span class="kd">function</span><span class="p">(</span><span class="nx">t</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="c1">// ...</span>
</span><span class='line'><span class="p">},</span> <span class="nx">options</span><span class="p">);</span>
</span></code></pre></td></tr></table></div></figure>


<p>And to make the error go away, we now can create a process spy and provide it through options:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="kd">var</span> <span class="nx">process</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">ProcessSpy</span><span class="p">(</span><span class="nx">t</span><span class="p">);</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">options</span> <span class="o">=</span> <span class="p">{</span>
</span><span class='line'>    <span class="nx">reporter</span><span class="o">:</span> <span class="nx">reporter</span><span class="p">,</span>
</span><span class='line'>    <span class="nx">process</span><span class="o">:</span> <span class="nx">process</span>
</span><span class='line'><span class="p">};</span>
</span></code></pre></td></tr></table></div></figure>


<p>If we run tests now, they all pass. And we can see that they all execute. Now we just need to double-check that all tests, that have inner calls to <code>runTestSuite</code> have <code>verifyAllTestsRun</code> option enabled. The only other test suite is the <code>FailureTest</code>. Adding the option does not produce a failure because this test suite already uses process spy in all inner calls to <code>runTestSuite</code>.</p>

<h2>Conclusion</h2>

<p>Today we learned that it is tricky to work with <code>process.exit</code> or any function that can exit our program in the middle of the test. Such functions need to be mocked out completely inside of the tests. Also, we learned that it is possible to make sure we don&rsquo;t forget to do that. That is quite important because, if we do forget, everything runs smoothly, and we don&rsquo;t know that we made a mistake.</p>

<p>There is still a lot to go through. In a few next episodes we will:</p>

<ul>
<li>Report OK and FAIL for each test;</li>
<li>Output carefully formatted failures to the STDERR;</li>
<li>Enable our testing framework to run multiple test suite files at once;</li>
<li>Enable our testing framework to run in a browser (it is javascript after all).</li>
</ul>


<p>See you reading the next exciting article of the series: &ldquo;Formatting the Output&rdquo;!</p>

<h2>Thanks</h2>

<p>Thank you for reading, my dear reader. If you liked it, please share this article on social networks and follow me on Twitter: <a href="https://twitter.com/tdd_fellow">@tdd_fellow</a>.</p>

<p>If you have any questions or feedback for me, don’t hesitate to reach me out on Twitter: <a href="https://twitter.com/tdd_fellow">@tdd_fellow</a>.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Learning Test-Driven Development With Javascript: Laws of TDD]]></title>
    <link href="http://www.tddfellow.com/blog/2017/02/03/learning-test-driven-development-with-javascript-laws-of-tdd/"/>
    <updated>2017-02-03T22:19:40+01:00</updated>
    <id>http://www.tddfellow.com/blog/2017/02/03/learning-test-driven-development-with-javascript-laws-of-tdd</id>
    <content type="html"><![CDATA[<p><strong>Level: Beginner</strong></p>

<p>Today we are going to learn the basic principles behind the Test-Driven Development Discipline. We will learn three rules of TDD. We will learn what are the benefits of doing Test-Driven Development. And we will take a look at the example application of these laws.</p>

<div about='https://farm8.static.flickr.com/7430/12500965335_75001934e7.jpg'>
  <img xmlns:dct='http://purl.org/dc/terms/' href='http://purl.org/dc/dcmitype/StillImage' rel='dct:type' src='http://www.tddfellow.com/images/learning-tdd-with-js/feedback.png' alt='feedback by Sonti Malonti, on Flickr' title='feedback by Sonti Malonti, on Flickr' border='0'/>
  <br/>
  <span class="img-attribution">
    &quot;
    <a href='https://www.flickr.com/photos/sontimalonti/12500965335/' target='_blank'>feedback</a>
    &quot;&nbsp;
    (<a rel='license' href='https://creativecommons.org/licenses/by-sa/2.0/' target='_blank'>CC BY-SA 2.0</a>)
    &nbsp;by&nbsp;<a xmlns:cc='http://creativecommons.org/ns#' rel='cc:attributionURL' property='cc:attributionName' href='https://www.flickr.com/people/sontimalonti/' target='_blank'>Sonti Malonti</a>
  </span>
</div>




<!-- more -->


<p>Articles of these series have exercises and going through them would make for more effective learning. Also, if you feel stuck with these exercises, fell free to shoot me an email or get in touch on Twitter: @tdd_fellow.</p>

<p>&ldquo;Learning Test-Driven Development with Javascript&rdquo; is a series of articles and you, my dear reader, can shape the content by providing an invaluable feedback. To do that, shoot me an email - <a href="&#x6d;&#x61;&#x69;&#108;&#x74;&#111;&#x3a;&#x6f;&#108;&#101;&#107;&#x73;&#105;&#105;&#x40;&#116;&#x64;&#100;&#102;&#101;&#x6c;&#108;&#x6f;&#119;&#x2e;&#x63;&#111;&#x6d;&#46;">&#x6f;&#108;&#x65;&#107;&#x73;&#x69;&#x69;&#x40;&#x74;&#x64;&#100;&#x66;&#x65;&#x6c;&#x6c;&#111;&#x77;&#46;&#x63;&#x6f;&#109;&#x2e;</a></p>

<h2>Basics of Test-Driven Development</h2>

<p>A test is a single program, procedure or function, that executes our system under the test and verifies that it works as expected. The system under the test is any other program, part of the program or library, procedure or function. The system under the test is called SUT for short.</p>

<p>SUT is the code that executes with a purpose of satisfying needs of our end users. Using the term &ldquo;end user&rdquo; we mean actual people using our system via the user interface (graphical and non-graphical), and other automated systems using our system via application programming interface (for short, API). A different term for the &ldquo;end user&rdquo; is &ldquo;consumer of the system.&rdquo; Another term for the SUT is &ldquo;production code&rdquo; - we are going to use the latter, as it is used in Test-Driven Development much more often.</p>

<p>Test-Driven Development is based on a simple concept of writing production code only when there is a failing test that demands that production code for it to pass.</p>

<p>We call a test failing when there is some error happening when we execute it. Possible failures are the following: there is a syntax error, or code does not compile, or there is a runtime failure during test setup or production code execution, or there is an assertion error. The assertion failure is the particular kind of error that happens during the final phase of the test, where we are verifying the outcomes after running the production code under the test. An assertion error signals that the production code executed successfully, but it produced incorrect results or changed the state of the system in a wrong fashion.</p>

<p>We call a test passing when there are no errors happen when we execute it. We, also, call the failing test &ldquo;a red test&rdquo; and we call the passing test &ldquo;a green test.&rdquo; That is because we can not deliver the code to our customers or consumers when there are &ldquo;red&rdquo; tests - think of red traffic light, and we are free to go when all the tests are &ldquo;green&rdquo; - think of green traffic light. Most of the testing tools and frameworks format their output to present failing tests in the red color and passing tests in the green color.</p>

<p>Multiple tests aiming to test single SUT or a particular feature of the system are usually called test suite. Depending on the context, test suite could mean that collection of tests all testing the same thing, or it could mean all tests of the entire system. For example, in the sentence &ldquo;Let&rsquo;s read <code>User</code> class&#8217; test suite&rdquo; that phrase means a collection of tests testing class <code>User</code>. On the other hand, in the sentence &ldquo;Let&rsquo;s run the whole test suite and see if we can deploy that right now&rdquo; that phrase means all tests of the entire system. The latter, sometimes, is called &ldquo;suite of tests.&rdquo;</p>

<p>When the system behaves in an unexpected way, and the expected behavior was previously defined or present in the code, it is called a &ldquo;bug.&rdquo; For example, the behavior that is specified by the development team and not implemented correctly considered a bug. The behavior that is defined by the development team and implemented correctly, but now it is not working, considered a bug. And, finally, the behavior that was not defined may or may not be considered as a bug. The latter depends on the produced results - if it harms or brings any value. This phenomenon is called a &ldquo;bug&rdquo; for historical reasons: the first bug in computing was a real bug, that stuck in the computer&rsquo;s hardware and was causing short circuits which made the computer misbehave.</p>

<h2>Three Rules of Test-Driven Development</h2>

<p>In the core of Test-Driven Development there are three steps that we need to follow:</p>

<ol>
<li>We start with a failing test. We consider any error a failure, including compilation and syntax errors. Meaning, that our first test for any part of the production code will fail for the reason that there is no production code to execute yet. For example class, method or function is undefined.</li>
<li>Then, we resolve the failure by writing the production code. For example: in the case of missing class, we would create a class; in the event of a missing method, we would create it; and in the instance of a failing assertion error, we would fix the logic to pass the test.</li>
<li>We write no more than the simplest production code, which makes our current failing test pass, and, also, still passes all other tests.</li>
</ol>


<p>We repeat these steps over and over until we finish the implementation of the system under the test. Strictly following these steps will lock us in a very tight loop, where we will be switching between test code and production code all the time: write one or two lines of the test code and write or change one or two lines of the production code, repeat. This cycle is, probably, twenty or thirty seconds long. It, of course, depends on how fast we can run our tests. Ideally, we want our test suite for the current system under the test to run as fast as one clap of hands, or blink of an eye.</p>

<h2>Feedback Loop Benefits</h2>

<p>This tight cycle gives us following benefits:</p>

<ul>
<li>Alerts us to the mistakes we do while coding immediately. Usually, it is enough to do one or two &ldquo;Undo&rdquo; commands in our editor to get back to the &ldquo;green&rdquo; state of the system - when all our tests are passing (occasionally, except for the last test we have added, as we will undo the incorrect implementation for it).</li>
<li>Provides the safety net from bugs for the future development thanks to the fact, that no single line of production code is written other than to pass a failing test. Meaning, that whenever production code is broken in any fashion, there is a test that will point it out via failure. When adding new features or modifying the behavior of the existing ones, we might inadvertently introduce a bug. Our suite of tests will detect that bug as soon as we run all our tests, which we would certainly do during development and, especially, before the deployment or release of our systems. This is, basically, a near 100% test coverage. Surely, there are subtle and complex bugs that involve whole sub-systems and 3rd-party systems to come together in some special edge case to appear - rarely, such bugs are not prevented by Test-Driven Development. Of course, we are talking about 1-3 such bugs per year - this is much better than having a bug tracker, that contains thousands of unresolved bugs. Who said it was a good idea to have a database that stores the bugs in our system? - When we apply TDD correctly, and our bug counts are so small, as 1-3 per year, we should treat bugs as &ldquo;Red Alerts&rdquo; and concentrate all the effort on shooting them down. Writing a test for these bugs when we already figured them out allows us to programmatically prove, that the system, indeed, does misbehave in a certain edge case, and prevents this bug from reoccurring after we have fixed it.</li>
<li>Gives the confidence to refactor freely and ruthlessly. Essentially, allows changing the software design of the system on the go without applying the big design upfront (BDUF). Let&rsquo;s take a look at the example. Imagine, we have a system with a perfect design and without any tests. Over time the design will degrade until the code becomes nearly impossible to work with. Now, imagine, we have a system with bad design and close to 100% test coverage. Over time we can improve the design of the application gradually while responding to the changes in the needs of our end users. And we will be faster as the time passes.</li>
<li>Makes the development team always ready to deploy. While practicing test-driven development, development teams will keep latest implemented features in the version control system for the source code in the state, that is well-known to be &ldquo;green.&rdquo; This condition of the system is deliverable to the end users with one push of the button. That, also, enables teams to do continuous delivery: as soon as the code is checked-in in the version control system (VCS), it is going to be automatically deployed to production and our end users will get the value out of it sooner.</li>
<li>Promotes simplicity and alleviates the scope creep. &ldquo;Oh, we don&rsquo;t need that yet&rdquo; is the most used phrase in the vocabulary of the typical test-driven development practitioner. Tests that we write specify only the useful functionality that we need to deliver the value to our end users. These tests don&rsquo;t talk about performance optimizations, security concerns, rare edge cases, &ldquo;re-usable&rdquo; abstractions (that, usually, are harder to understand and are difficult to re-use), etc. These things need to be implemented only when there is an actual end user value to be achieved, or the system is obviously running slower than it should, or there is an actual security concern. In that case, a very specific test (or tests) will be written to drive out that additional functionality. Since the most software development cost is in the maintenance of the existing functionality leaving out as much functionality (and code) as possible is a good idea.</li>
<li>Promotes cleaner interfaces. As in test-driven development, we have to write the usage example before we implement (or even design) the API in the production code, it will be optimized for ease and clarity of use and less so with the internal implementation details of that production code. Generally speaking, test-driven production code is easier to use and understand.</li>
<li>Tests that call the production code serve as usage examples of that code. Essentially, in a test-driven code base, to know how a particular API can be used, it is enough to read and understand its test suite. These tests are the perfect low-level documentation for the APIs in our code base that developers can understand and read best. And that documentation is so precise that it can be executed and verified that it is still in sync with the actual code it is describing. Therefore this documentation is always up-to-date.</li>
</ul>


<p>The most important of these benefits is the confidence to make any change to the software and know in one minute or two, if that change is good to be delivered to the end user or not, with a simple push of the button. No quality assurance (QA) manual testing cycles are required. Let&rsquo;s take a look at the example of the application of three rules of test-driven development. We will start from a very simple example, so that we don&rsquo;t have to touch more advanced TDD techniques.</p>

<h2>English Numbers Kata</h2>

<blockquote><p><strong>Given</strong> an integer number<br/>
<strong>When</strong> I call the system with that number<br/>
<strong>Then</strong> I receive a string representation of that number in an English language</p>

<p>For example:</p>

<ul>
<li>for number <code>37</code> I receive <code>"thirty-seven"</code></li>
<li>for number <code>-17451</code> I receive <code>"minus seventeen thousand four hundred fifty-one"</code></li>
</ul>
</blockquote>

<p>According to the first rule of TDD, we have to start the implementation from the test. In test-driven development it is important to start from the simplest tests, that can be implemented via a small, simple change to production code. For example: with number zero we expect the result to be &ldquo;zero.&rdquo; When writing the first test for the new functionality we are going to design its API. In our case we are going to come up with the function name and its argument list:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="nx">describe</span><span class="p">(</span><span class="s2">&quot;toEnglishNumber&quot;</span><span class="p">,</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>    <span class="nx">it</span><span class="p">(</span><span class="s2">&quot;converts 0 to zero&quot;</span><span class="p">,</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>        <span class="c1">// ARRANGE</span>
</span><span class='line'>        <span class="kd">var</span> <span class="nx">number</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>        <span class="c1">// ACT</span>
</span><span class='line'>        <span class="kd">var</span> <span class="nx">englishNumber</span> <span class="o">=</span> <span class="nx">toEnglishNumber</span><span class="p">(</span><span class="nx">number</span><span class="p">);</span>
</span><span class='line'>    <span class="p">});</span>
</span><span class='line'><span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>


<p>As soon as we write <code>toEnglishNumber(number)</code> we have designed the function&rsquo;s signature, at least, for the single simplest case. Also, the test suite is failing now, because <code>toEnglishNumber</code> is not a function - in fact, it is undefined. That means that we have entered the red stage of test driven development and according to the second rule of TDD we have to switch back to the production code. And according to the third rule, we have to write just enough of it to make the failing test pass. That means writing the simplest and easiest code possible to make it succeed. In this case, we could just return nothing (<code>null</code> in javascript):</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="kd">function</span> <span class="nx">toEnglishNumber</span><span class="p">(</span><span class="nx">number</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">return</span> <span class="kc">null</span><span class="p">;</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>This is going to turn our test suite back to the green stage. At this point it is a good idea to look at both test code and production code and see if there are any opportunities for refactoring, such as better names, extracting methods/functions, clarifying variable names, de-duplication, etc. Because we are currently in a green state, we can safely apply any refactoring, automated or manual, and see if it was successful by running the test again. If for some reason, the test is failing after the refactoring, we always have an option to CTRL/CMD+Z back to the green state, back to safety. At this point, we have finished applying one cycle of rules of TDD. Now we need to start over. We go back to our test code. There we extend the existing test to be more specific. Or we add more tests. Since we didn&rsquo;t finish writing the test yet - we have only &ldquo;arrange&rdquo; and &ldquo;act&rdquo; parts, and we are missing the &ldquo;assert&rdquo; part of the test, - we ought to extend the current test to make it more specific. So what can we assert about the result of the <code>toEnglishNumber</code> call? We probably ought to return the string &ldquo;zero&rdquo;, aren&rsquo;t we? So, let&rsquo;s make an appropriate assertion:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="nx">it</span><span class="p">(</span><span class="s2">&quot;converts 0 to zero&quot;</span><span class="p">,</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>    <span class="c1">// ARRANGE</span>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">number</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>    <span class="c1">// ACT</span>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">englishNumber</span> <span class="o">=</span> <span class="nx">toEnglishNumber</span><span class="p">(</span><span class="nx">number</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>    <span class="c1">// ASSERT</span>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">expected</span> <span class="o">=</span> <span class="s2">&quot;zero&quot;</span><span class="p">;</span>
</span><span class='line'>    <span class="nx">expect</span><span class="p">(</span><span class="nx">englishNumber</span><span class="p">).</span><span class="nx">toEqual</span><span class="p">(</span><span class="nx">expected</span><span class="p">);</span>
</span><span class='line'><span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>


<p>If we run our tests right now, they will fail. We should take a careful look at the failure and see if the failure message is readable and it is what we expected. In the current situation, we will receive an assertion failure, telling us that <code>null</code> was not equal to &ldquo;zero.&rdquo; Imagine now, that we are working on some other feature and we are not in the context of the English number conversion feature. What would be our reaction, when we run this test and see this failure? - We will probably be confused for a moment and will resort to jump to the line in the source code of the test suite that produces that error and try to understand what happened there. That is a huge context switch, and it will disrupt our current flow. So we can do better and make the failure much more readable by just adding a small thing - a cue, what that <code>null</code> was supposed to be: &ldquo;english number&rdquo;:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="nx">expect</span><span class="p">(</span><span class="nx">englishNumber</span><span class="p">).</span><span class="nx">toEqual</span><span class="p">(</span><span class="nx">expected</span><span class="p">,</span> <span class="s2">&quot;english number&quot;</span><span class="p">);</span>
</span></code></pre></td></tr></table></div></figure>


<p>In Jasmine, the second argument to the <code>toEqual</code> matching function is the description of the failure. I think our test looks great, and so is the failure in the test output. And because we are having a good failing test, according to the second rule, we don&rsquo;t have to write any of test code. Now, we should make the test pass according to the third rule. And what would be the simplest way to make it work? - Return &ldquo;zero&rdquo;:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="kd">function</span> <span class="nx">toEnglishNumber</span><span class="p">(</span><span class="nx">number</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">return</span> <span class="s2">&quot;zero&quot;</span><span class="p">;</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>At this point, we should look out for the refactoring opportunities, and I don&rsquo;t think there are any yet. So let&rsquo;s start the cycle over. To apply the first rule, we might just copy the existing test and change the input and the expected output accordingly. In that case, we would want to test another simple one-digit number - &ldquo;one&rdquo;:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="nx">it</span><span class="p">(</span><span class="s2">&quot;converts 1 to one&quot;</span><span class="p">,</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>    <span class="c1">// ARRANGE</span>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">number</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>    <span class="c1">// ACT</span>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">englishNumber</span> <span class="o">=</span> <span class="nx">toEnglishNumber</span><span class="p">(</span><span class="nx">number</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>    <span class="c1">// ASSERT</span>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">expected</span> <span class="o">=</span> <span class="s2">&quot;one&quot;</span><span class="p">;</span>
</span><span class='line'>    <span class="nx">expect</span><span class="p">(</span><span class="nx">englishNumber</span><span class="p">).</span><span class="nx">toEqual</span><span class="p">(</span><span class="nx">expected</span><span class="p">,</span> <span class="s2">&quot;english number&quot;</span><span class="p">);</span>
</span><span class='line'><span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>


<p>Now, because the test is failing, we apply the second rule and switch back to the production code. To make the test pass, according to the third rule, we will need to introduce the simplest change possible: in that case, an &ldquo;if&rdquo; statement (and we will use <code>===</code> instead of <code>==</code> for comparison to avoid implicit type conversions in javascript):</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="kd">function</span> <span class="nx">toEnglishNumber</span><span class="p">(</span><span class="nx">number</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">if</span> <span class="p">(</span><span class="nx">number</span> <span class="o">===</span> <span class="mi">1</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>        <span class="k">return</span> <span class="s2">&quot;one&quot;</span><span class="p">;</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">return</span> <span class="s2">&quot;zero&quot;</span><span class="p">;</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>That is going to make all our tests pass. If we continue adding tests for the single-digit numbers while following these three rules, we will wind up with something like that:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
<span class='line-number'>37</span>
<span class='line-number'>38</span>
<span class='line-number'>39</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="kd">function</span> <span class="nx">toEnglishNumber</span><span class="p">(</span><span class="nx">number</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">if</span> <span class="p">(</span><span class="nx">number</span> <span class="o">===</span> <span class="mi">1</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>        <span class="k">return</span> <span class="s2">&quot;one&quot;</span><span class="p">;</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">if</span> <span class="p">(</span><span class="nx">number</span> <span class="o">===</span> <span class="mi">2</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>        <span class="k">return</span> <span class="s2">&quot;two&quot;</span><span class="p">;</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">if</span> <span class="p">(</span><span class="nx">number</span> <span class="o">===</span> <span class="mi">3</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>        <span class="k">return</span> <span class="s2">&quot;three&quot;</span><span class="p">;</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">if</span> <span class="p">(</span><span class="nx">number</span> <span class="o">===</span> <span class="mi">4</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>        <span class="k">return</span> <span class="s2">&quot;four&quot;</span><span class="p">;</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">if</span> <span class="p">(</span><span class="nx">number</span> <span class="o">===</span> <span class="mi">5</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>        <span class="k">return</span> <span class="s2">&quot;five&quot;</span><span class="p">;</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">if</span> <span class="p">(</span><span class="nx">number</span> <span class="o">===</span> <span class="mi">6</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>        <span class="k">return</span> <span class="s2">&quot;six&quot;</span><span class="p">;</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">if</span> <span class="p">(</span><span class="nx">number</span> <span class="o">===</span> <span class="mi">7</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>        <span class="k">return</span> <span class="s2">&quot;seven&quot;</span><span class="p">;</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">if</span> <span class="p">(</span><span class="nx">number</span> <span class="o">===</span> <span class="mi">8</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>        <span class="k">return</span> <span class="s2">&quot;eight&quot;</span><span class="p">;</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">if</span> <span class="p">(</span><span class="nx">number</span> <span class="o">===</span> <span class="mi">9</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>        <span class="k">return</span> <span class="s2">&quot;nine&quot;</span><span class="p">;</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">return</span> <span class="s2">&quot;zero&quot;</span><span class="p">;</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>At this point, we can see a clear pattern: one-to-one correspondence of a single-digit integer to the string. This code can be simplified as a pre-defined array of strings at the corresponding indices:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="kd">var</span> <span class="nx">singleDigitNumbers</span> <span class="o">=</span> <span class="p">[</span>
</span><span class='line'>    <span class="s2">&quot;zero&quot;</span><span class="p">,</span>
</span><span class='line'>    <span class="s2">&quot;one&quot;</span><span class="p">,</span>
</span><span class='line'>    <span class="s2">&quot;two&quot;</span><span class="p">,</span>
</span><span class='line'>    <span class="s2">&quot;three&quot;</span><span class="p">,</span>
</span><span class='line'>    <span class="s2">&quot;four&quot;</span><span class="p">,</span>
</span><span class='line'>    <span class="s2">&quot;five&quot;</span><span class="p">,</span>
</span><span class='line'>    <span class="s2">&quot;six&quot;</span><span class="p">,</span>
</span><span class='line'>    <span class="s2">&quot;seven&quot;</span><span class="p">,</span>
</span><span class='line'>    <span class="s2">&quot;eight&quot;</span><span class="p">,</span>
</span><span class='line'>    <span class="s2">&quot;nine&quot;</span>
</span><span class='line'><span class="p">];</span>
</span></code></pre></td></tr></table></div></figure>


<p>We also include string &ldquo;zero&rdquo; in that array because <code>return "zero"</code> is only happening when the number is equal to zero since we don&rsquo;t have any other tests right now - only from zero to nine. And the function itself will look much simpler:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="kd">function</span> <span class="nx">toEnglishNumber</span><span class="p">(</span><span class="nx">number</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">return</span> <span class="nx">singleDigitNumbers</span><span class="p">[</span><span class="nx">number</span><span class="p">];</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>Since we are done with the refactoring, we should proceed using the first rule of test-driven development, which means we need to write a test that fails. So let&rsquo;s increase the complexity of our tests and go for teen numbers. We&rsquo;ll start from ten:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="nx">it</span><span class="p">(</span><span class="s2">&quot;converts 10 to ten&quot;</span><span class="p">,</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>    <span class="c1">// ARRANGE</span>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">number</span> <span class="o">=</span> <span class="mi">10</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>    <span class="c1">// ACT</span>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">englishNumber</span> <span class="o">=</span> <span class="nx">toEnglishNumber</span><span class="p">(</span><span class="nx">number</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>    <span class="c1">// ASSERT</span>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">expected</span> <span class="o">=</span> <span class="s2">&quot;ten&quot;</span><span class="p">;</span>
</span><span class='line'>    <span class="nx">expect</span><span class="p">(</span><span class="nx">englishNumber</span><span class="p">).</span><span class="nx">toEqual</span><span class="p">(</span><span class="nx">expected</span><span class="p">,</span> <span class="s2">&quot;english number&quot;</span><span class="p">);</span>
</span><span class='line'><span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>


<p>That will fail because so far our production code tries to fetch a string representation of the english number from the array using the number itself as an index. At the index ten, we don&rsquo;t have anything, so our function returns nothing. According to the second rule of test-driven development, we need to switch to production code to make it pass. There are a few ways to fix the current problem: add specific if statement to the production code, or add a string &ldquo;ten&rdquo; to the array. Second seems to be simpler, and we know that we can do it for the teen numbers because they can not be composed of any other small parts. So, according to the third rule, we should go for it because it is a much simpler solution:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="kd">var</span> <span class="nx">singleDigitNumbers</span> <span class="o">=</span> <span class="p">[</span>
</span><span class='line'>    <span class="c1">// ...</span>
</span><span class='line'>    <span class="s2">&quot;ten&quot;</span>
</span><span class='line'><span class="p">];</span>
</span></code></pre></td></tr></table></div></figure>


<p>That makes our tests pass. And I think we have a refactoring opportunity: variable name <code>singleDigitNumbers</code> does not make any sense anymore - it contains not only single digit numbers, but, also, number &ldquo;ten,&rdquo; which is a two-digit number. So what is common between single digit numbers and ten? They are simple numbers, i.e.: can not be composed out of other english number string representations. Let&rsquo;s just call them <code>simpleNumbers</code> in this case:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="kd">var</span> <span class="nx">simpleNumbers</span> <span class="o">=</span> <span class="p">[</span>
</span><span class='line'>    <span class="c1">// ...</span>
</span><span class='line'><span class="p">];</span>
</span><span class='line'>
</span><span class='line'><span class="kd">function</span> <span class="nx">toEnglishNumber</span><span class="p">(</span><span class="nx">number</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">return</span> <span class="nx">simpleNumbers</span><span class="p">[</span><span class="nx">number</span><span class="p">];</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>After making this refactoring, we need not forget to run the test suite to see if we didn&rsquo;t make a mistake. When we run it, then all our tests pass. So we can go back to the first rule of test-driven development again. Going through this cycle again for a few times will produce tests for numbers from eleven to nineteen. The production code will only have those numbers&#8217; english string representations added to the <code>simpleNumbers</code> array:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="kd">var</span> <span class="nx">simpleNumbers</span> <span class="o">=</span> <span class="p">[</span>
</span><span class='line'>    <span class="s2">&quot;zero&quot;</span><span class="p">,</span> <span class="s2">&quot;one&quot;</span><span class="p">,</span> <span class="s2">&quot;two&quot;</span><span class="p">,</span> <span class="s2">&quot;three&quot;</span><span class="p">,</span> <span class="s2">&quot;four&quot;</span><span class="p">,</span>
</span><span class='line'>    <span class="s2">&quot;five&quot;</span><span class="p">,</span> <span class="s2">&quot;six&quot;</span><span class="p">,</span> <span class="s2">&quot;seven&quot;</span><span class="p">,</span> <span class="s2">&quot;eight&quot;</span><span class="p">,</span> <span class="s2">&quot;nine&quot;</span><span class="p">,</span>
</span><span class='line'>
</span><span class='line'>    <span class="s2">&quot;ten&quot;</span><span class="p">,</span> <span class="s2">&quot;eleven&quot;</span><span class="p">,</span> <span class="s2">&quot;twelve&quot;</span><span class="p">,</span> <span class="s2">&quot;thirteen&quot;</span><span class="p">,</span> <span class="s2">&quot;fourteen&quot;</span><span class="p">,</span>
</span><span class='line'>    <span class="s2">&quot;fifteen&quot;</span><span class="p">,</span> <span class="s2">&quot;sixteen&quot;</span><span class="p">,</span> <span class="s2">&quot;seventeen&quot;</span><span class="p">,</span> <span class="s2">&quot;eighteen&quot;</span><span class="p">,</span> <span class="s2">&quot;nineteen&quot;</span>
</span><span class='line'><span class="p">];</span>
</span><span class='line'>
</span><span class='line'><span class="kd">function</span> <span class="nx">toEnglishNumber</span><span class="p">(</span><span class="nx">number</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">return</span> <span class="nx">simpleNumbers</span><span class="p">[</span><span class="nx">number</span><span class="p">];</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>Now it is time to introduce the concept of a complex number, such as twenty-three. It is a number that consists of the &ldquo;tens&rdquo; part and single-digit part. According to the first rule we have to start with the failing test, and I think we should just go for the number twenty-three:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="nx">it</span><span class="p">(</span><span class="s2">&quot;converts 23 to twenty-three&quot;</span><span class="p">,</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>    <span class="c1">// ARRANGE</span>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">number</span> <span class="o">=</span> <span class="mi">23</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>    <span class="c1">// ACT</span>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">englishNumber</span> <span class="o">=</span> <span class="nx">toEnglishNumber</span><span class="p">(</span><span class="nx">number</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>    <span class="c1">// ASSERT</span>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">expected</span> <span class="o">=</span> <span class="s2">&quot;twenty-three&quot;</span><span class="p">;</span>
</span><span class='line'>    <span class="nx">expect</span><span class="p">(</span><span class="nx">englishNumber</span><span class="p">).</span><span class="nx">toEqual</span><span class="p">(</span><span class="nx">expected</span><span class="p">,</span> <span class="s2">&quot;english number&quot;</span><span class="p">);</span>
</span><span class='line'><span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>


<p>If we run our test suite, that test will fail. According to the second rule of test-driven development, now we have to switch to the production code. According to the third rule, we will have to choose the simplest code that makes this test pass (and doesn&rsquo;t break any other test). In our case, we have multiple options, which are similar in their simplicity. One of them is to return &ldquo;twenty-three&rdquo; if the number is greater than or equal to twenty:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="kd">function</span> <span class="nx">toEnglishNumber</span><span class="p">(</span><span class="nx">number</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">if</span> <span class="p">(</span><span class="nx">number</span> <span class="o">&gt;=</span> <span class="mi">20</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>        <span class="k">return</span> <span class="s2">&quot;twenty-three&quot;</span><span class="p">;</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">return</span> <span class="nx">simpleNumbers</span><span class="p">[</span><span class="nx">number</span><span class="p">];</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>If we run our test suite, all tests will pass. Now we should see if there are any opportunities for making the code more readable and easier to understand. While the whole if statement returning a constant might feel strange, there is a concept that we can already give a name to in there: &ldquo;three.&rdquo; We already can obtain a string &ldquo;three&rdquo; from number three using the method <code>toEnglishNumber(number)</code>. Let&rsquo;s try this refactoring:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="kd">function</span> <span class="nx">toEnglishNumber</span><span class="p">(</span><span class="nx">number</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">if</span> <span class="p">(</span><span class="nx">number</span> <span class="o">&gt;=</span> <span class="mi">20</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>        <span class="k">return</span> <span class="s2">&quot;twenty-&quot;</span> <span class="o">+</span> <span class="nx">toEnglishNumber</span><span class="p">(</span><span class="mi">3</span><span class="p">);</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">return</span> <span class="nx">simpleNumbers</span><span class="p">[</span><span class="nx">number</span><span class="p">];</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>That code now looks interesting. And it passes all its tests. Since, of course, we are not done yet with the implementation, according to the first rule of test-driven development, we ought to write another failing test. And we have a multitude of choices what it could be, we can just come up with other random two-digit number, such as forty-two, or we could leave the &ldquo;twenty-&rdquo; part in and change the &ldquo;three&rdquo; part to &ldquo;seven,&rdquo; for example. Also, we could change &ldquo;twenty-&rdquo; part to &ldquo;thirty-.&rdquo; Generally, in test-driven development it is better to go for the test, that will cause the smallest change to the production code, - later we will explore more on why that is. So, we could go for twenty-seven, as it will cause the smallest change to our production code:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="nx">it</span><span class="p">(</span><span class="s2">&quot;converts 27 to twenty-seven&quot;</span><span class="p">,</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>    <span class="c1">// ARRANGE</span>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">number</span> <span class="o">=</span> <span class="mi">27</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>    <span class="c1">// ACT</span>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">englishNumber</span> <span class="o">=</span> <span class="nx">toEnglishNumber</span><span class="p">(</span><span class="nx">number</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>    <span class="c1">// ASSERT</span>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">expected</span> <span class="o">=</span> <span class="s2">&quot;twenty-seven&quot;</span><span class="p">;</span>
</span><span class='line'>    <span class="nx">expect</span><span class="p">(</span><span class="nx">englishNumber</span><span class="p">).</span><span class="nx">toEqual</span><span class="p">(</span><span class="nx">expected</span><span class="p">,</span> <span class="s2">&quot;english number&quot;</span><span class="p">);</span>
</span><span class='line'><span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>


<p>This test is failing, as expected. According to the second rule, we have to switch to the production code and make it pass. Also, the simplest change (third rule) that we could do is to change &ldquo;3&rdquo; to the last digit of the number, the remainder of the division by ten - &ldquo;number % 10&rdquo;:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="kd">function</span> <span class="nx">toEnglishNumber</span><span class="p">(</span><span class="nx">number</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">if</span> <span class="p">(</span><span class="nx">number</span> <span class="o">&gt;=</span> <span class="mi">20</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>        <span class="k">return</span> <span class="s2">&quot;twenty-&quot;</span> <span class="o">+</span> <span class="nx">toEnglishNumber</span><span class="p">(</span><span class="nx">number</span> <span class="o">%</span> <span class="mi">10</span><span class="p">);</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">return</span> <span class="nx">simpleNumbers</span><span class="p">[</span><span class="nx">number</span><span class="p">];</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>Now if we run our test suite all the tests will pass. &ldquo;The remainder of division by ten&rdquo; part looks right and &ldquo;twenty-&rdquo; constant still feels like it is not gonna work for every two-digit number. I think it is time to write a new failing test (first rule). That will be the test that will prove that &ldquo;twenty-&rdquo; is not correct code. In that case, we just need to change the first digit of the number so that we could go for forty-two:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="nx">it</span><span class="p">(</span><span class="s2">&quot;converts 42 to forty-two&quot;</span><span class="p">,</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>    <span class="c1">// ARRANGE</span>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">number</span> <span class="o">=</span> <span class="mi">42</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>    <span class="c1">// ACT</span>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">englishNumber</span> <span class="o">=</span> <span class="nx">toEnglishNumber</span><span class="p">(</span><span class="nx">number</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>    <span class="c1">// ASSERT</span>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">expected</span> <span class="o">=</span> <span class="s2">&quot;forty-two&quot;</span><span class="p">;</span>
</span><span class='line'>    <span class="nx">expect</span><span class="p">(</span><span class="nx">englishNumber</span><span class="p">).</span><span class="nx">toEqual</span><span class="p">(</span><span class="nx">expected</span><span class="p">,</span> <span class="s2">&quot;english number&quot;</span><span class="p">);</span>
</span><span class='line'><span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>


<p>As soon as we finish writing the assertion we will have a test failure: we are returning &ldquo;twenty-two&rdquo; instead of &ldquo;forty-two.&rdquo; So it is time to switch to the production code (second rule). And we need to write just enough of it to make this test pass (third rule). We can do that by having yet another if statement:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="kd">function</span> <span class="nx">toEnglishNumber</span><span class="p">(</span><span class="nx">number</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">if</span> <span class="p">(</span><span class="nx">number</span> <span class="o">&gt;=</span> <span class="mi">20</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>        <span class="k">if</span> <span class="p">(</span><span class="nx">number</span> <span class="o">/</span> <span class="mi">10</span> <span class="o">==</span> <span class="mi">2</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>            <span class="k">return</span> <span class="s2">&quot;twenty-&quot;</span> <span class="o">+</span> <span class="nx">toEnglishNumber</span><span class="p">(</span><span class="nx">number</span> <span class="o">%</span> <span class="mi">10</span><span class="p">);</span>
</span><span class='line'>        <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>        <span class="k">return</span> <span class="s2">&quot;forty-&quot;</span> <span class="o">+</span> <span class="nx">toEnglishNumber</span><span class="p">(</span><span class="nx">number</span> <span class="o">%</span> <span class="mi">10</span><span class="p">);</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">return</span> <span class="nx">simpleNumbers</span><span class="p">[</span><span class="nx">number</span><span class="p">];</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>And this will make the test pass. It looks very similar to what we had with one-digit numbers, where we had an &ldquo;if&rdquo; statement checking that some value is equal to some number and returning an appropriate string. That is where we converted it to an array with string values, and in the function, we were fetching these strings by their index. To see if that pattern applies here we could write another similar test that will make us write another if statement:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="nx">it</span><span class="p">(</span><span class="s2">&quot;converts 39 to thirty-nine&quot;</span><span class="p">,</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>    <span class="c1">// ARRANGE</span>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">number</span> <span class="o">=</span> <span class="mi">39</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>    <span class="c1">// ACT</span>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">englishNumber</span> <span class="o">=</span> <span class="nx">toEnglishNumber</span><span class="p">(</span><span class="nx">number</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>    <span class="c1">// ASSERT</span>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">expected</span> <span class="o">=</span> <span class="s2">&quot;thirty-nine&quot;</span><span class="p">;</span>
</span><span class='line'>    <span class="nx">expect</span><span class="p">(</span><span class="nx">englishNumber</span><span class="p">).</span><span class="nx">toEqual</span><span class="p">(</span><span class="nx">expected</span><span class="p">,</span> <span class="s2">&quot;english number&quot;</span><span class="p">);</span>
</span><span class='line'><span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>


<p>And this fails as expected because our production code in no case can return &ldquo;thirty-.&rdquo; So let&rsquo;s write the simplest if statement to make it pass. Also, to make it uniform, we would wrap &ldquo;forty-&rdquo; case in its appropriate if statement as a refactoring after we have a passing test suite:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="kd">function</span> <span class="nx">toEnglishNumber</span><span class="p">(</span><span class="nx">number</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">if</span> <span class="p">(</span><span class="nx">number</span> <span class="o">&gt;=</span> <span class="mi">20</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>        <span class="k">if</span> <span class="p">(</span><span class="nx">number</span> <span class="o">/</span> <span class="mi">10</span> <span class="o">==</span> <span class="mi">2</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>            <span class="k">return</span> <span class="s2">&quot;twenty-&quot;</span> <span class="o">+</span> <span class="nx">toEnglishNumber</span><span class="p">(</span><span class="nx">number</span> <span class="o">%</span> <span class="mi">10</span><span class="p">);</span>
</span><span class='line'>        <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>        <span class="k">if</span> <span class="p">(</span><span class="nx">number</span> <span class="o">/</span> <span class="mi">10</span> <span class="o">==</span> <span class="mi">3</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>            <span class="k">return</span> <span class="s2">&quot;thirty-&quot;</span> <span class="o">+</span> <span class="nx">toEnglishNumber</span><span class="p">(</span><span class="nx">number</span> <span class="o">%</span> <span class="mi">10</span><span class="p">);</span>
</span><span class='line'>        <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>        <span class="k">if</span> <span class="p">(</span><span class="nx">number</span> <span class="o">/</span> <span class="mi">10</span> <span class="o">==</span> <span class="mi">4</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>            <span class="k">return</span> <span class="s2">&quot;forty-&quot;</span> <span class="o">+</span> <span class="nx">toEnglishNumber</span><span class="p">(</span><span class="nx">number</span> <span class="o">%</span> <span class="mi">10</span><span class="p">);</span>
</span><span class='line'>        <span class="p">}</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">return</span> <span class="nx">simpleNumbers</span><span class="p">[</span><span class="nx">number</span><span class="p">];</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>Certainly, there is a fair bit of duplication right now: &ldquo;number / 10&rdquo; and &ldquo;number % 10&rdquo;. Let&rsquo;s extract them as variables. Also, let&rsquo;s extract &ldquo;twenty&rdquo;, &ldquo;thirty&rdquo;, &ldquo;forty&rdquo; and &ldquo;toEnglishNumber(lastDigit)&rdquo; parts as variables:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="kd">function</span> <span class="nx">toEnglishNumber</span><span class="p">(</span><span class="nx">number</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">if</span> <span class="p">(</span><span class="nx">number</span> <span class="o">&gt;=</span> <span class="mi">20</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>        <span class="kd">var</span> <span class="nx">firstDigit</span> <span class="o">=</span> <span class="nx">number</span> <span class="o">/</span> <span class="mi">10</span><span class="p">;</span>
</span><span class='line'>        <span class="kd">var</span> <span class="nx">lastDigit</span> <span class="o">=</span> <span class="nx">number</span> <span class="o">%</span> <span class="mi">10</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>        <span class="kd">var</span> <span class="nx">firstPart</span><span class="p">;</span>
</span><span class='line'>        <span class="k">if</span> <span class="p">(</span><span class="nx">firstDigit</span> <span class="o">==</span> <span class="mi">2</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>            <span class="nx">firstPart</span> <span class="o">=</span> <span class="s2">&quot;twenty&quot;</span><span class="p">;</span>
</span><span class='line'>        <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>        <span class="k">if</span> <span class="p">(</span><span class="nx">firstDigit</span> <span class="o">==</span> <span class="mi">3</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>            <span class="nx">firstPart</span> <span class="o">=</span> <span class="s2">&quot;thirty&quot;</span><span class="p">;</span>
</span><span class='line'>        <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>        <span class="k">if</span> <span class="p">(</span><span class="nx">firstDigit</span> <span class="o">==</span> <span class="mi">4</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>            <span class="nx">firstPart</span> <span class="o">=</span> <span class="s2">&quot;forty&quot;</span><span class="p">;</span>
</span><span class='line'>        <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>        <span class="kd">var</span> <span class="nx">secondPart</span> <span class="o">=</span> <span class="nx">toEnglishNumber</span><span class="p">(</span><span class="nx">lastDigit</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>        <span class="k">return</span> <span class="nx">firstPart</span> <span class="o">+</span> <span class="s2">&quot;-&quot;</span> <span class="o">+</span> <span class="nx">secondPart</span><span class="p">;</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">return</span> <span class="nx">simpleNumbers</span><span class="p">[</span><span class="nx">number</span><span class="p">];</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>Now, we could extract the function for conversion of the first digit to the first english part, such as twenty or thirty:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="kd">function</span> <span class="nx">convertTens</span><span class="p">(</span><span class="nx">digit</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">if</span> <span class="p">(</span><span class="nx">digit</span> <span class="o">==</span> <span class="mi">2</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>        <span class="k">return</span> <span class="s2">&quot;twenty&quot;</span><span class="p">;</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">if</span> <span class="p">(</span><span class="nx">digit</span> <span class="o">==</span> <span class="mi">3</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>        <span class="k">return</span> <span class="s2">&quot;thirty&quot;</span><span class="p">;</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">if</span> <span class="p">(</span><span class="nx">digit</span> <span class="o">==</span> <span class="mi">4</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>        <span class="k">return</span> <span class="s2">&quot;forty&quot;</span><span class="p">;</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="kd">function</span> <span class="nx">toEnglishNumber</span><span class="p">(</span><span class="nx">number</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">if</span> <span class="p">(</span><span class="nx">number</span> <span class="o">&gt;=</span> <span class="mi">20</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>        <span class="kd">var</span> <span class="nx">firstDigit</span> <span class="o">=</span> <span class="nx">number</span> <span class="o">/</span> <span class="mi">10</span><span class="p">;</span>
</span><span class='line'>        <span class="kd">var</span> <span class="nx">lastDigit</span> <span class="o">=</span> <span class="nx">number</span> <span class="o">%</span> <span class="mi">10</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>        <span class="kd">var</span> <span class="nx">firstPart</span> <span class="o">=</span> <span class="nx">convertTens</span><span class="p">(</span><span class="nx">firstDigit</span><span class="p">);</span>
</span><span class='line'>        <span class="kd">var</span> <span class="nx">secondPart</span> <span class="o">=</span> <span class="nx">toEnglishNumber</span><span class="p">(</span><span class="nx">lastDigit</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>        <span class="k">return</span> <span class="nx">firstPart</span> <span class="o">+</span> <span class="s2">&quot;-&quot;</span> <span class="o">+</span> <span class="nx">secondPart</span><span class="p">;</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">return</span> <span class="nx">simpleNumbers</span><span class="p">[</span><span class="nx">number</span><span class="p">];</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>Now, it looks like the function <code>convertTens</code> can be simplified through usage of array in the same way as we did before with <code>toEnglishNumber</code>:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="kd">var</span> <span class="nx">tens</span> <span class="o">=</span> <span class="p">[</span><span class="s2">&quot;&quot;</span><span class="p">,</span> <span class="s2">&quot;&quot;</span><span class="p">,</span> <span class="s2">&quot;twenty&quot;</span><span class="p">,</span> <span class="s2">&quot;thirty&quot;</span><span class="p">,</span> <span class="s2">&quot;forty&quot;</span><span class="p">];</span>
</span><span class='line'>
</span><span class='line'><span class="kd">function</span> <span class="nx">convertTens</span><span class="p">(</span><span class="nx">digit</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">return</span> <span class="nx">tens</span><span class="p">[</span><span class="nx">digit</span><span class="p">];</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>At this point, we can write more tests to cover all different first digits, for example fifty-seven, sixty-five, seventy-three, eighty-nine and ninety-one. To make them pass we will have to add corresponding &ldquo;tens&rdquo; number to our array:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="kd">var</span> <span class="nx">tens</span> <span class="o">=</span> <span class="p">[</span>
</span><span class='line'>    <span class="s2">&quot;&quot;</span><span class="p">,</span> <span class="s2">&quot;&quot;</span><span class="p">,</span>
</span><span class='line'>
</span><span class='line'>    <span class="s2">&quot;twenty&quot;</span><span class="p">,</span> <span class="s2">&quot;thirty&quot;</span><span class="p">,</span> <span class="s2">&quot;forty&quot;</span><span class="p">,</span> <span class="s2">&quot;fifty&quot;</span><span class="p">,</span>
</span><span class='line'>    <span class="s2">&quot;sixty&quot;</span><span class="p">,</span> <span class="s2">&quot;seventy&quot;</span><span class="p">,</span> <span class="s2">&quot;eighty&quot;</span><span class="p">,</span> <span class="s2">&quot;ninety&quot;</span>
</span><span class='line'><span class="p">];</span>
</span></code></pre></td></tr></table></div></figure>


<p>So, that is how we apply three rules of test-driven development. Here is the full code:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
<span class='line-number'>37</span>
<span class='line-number'>38</span>
<span class='line-number'>39</span>
<span class='line-number'>40</span>
<span class='line-number'>41</span>
<span class='line-number'>42</span>
<span class='line-number'>43</span>
<span class='line-number'>44</span>
<span class='line-number'>45</span>
<span class='line-number'>46</span>
<span class='line-number'>47</span>
<span class='line-number'>48</span>
<span class='line-number'>49</span>
<span class='line-number'>50</span>
<span class='line-number'>51</span>
<span class='line-number'>52</span>
<span class='line-number'>53</span>
<span class='line-number'>54</span>
<span class='line-number'>55</span>
<span class='line-number'>56</span>
<span class='line-number'>57</span>
<span class='line-number'>58</span>
<span class='line-number'>59</span>
<span class='line-number'>60</span>
<span class='line-number'>61</span>
<span class='line-number'>62</span>
<span class='line-number'>63</span>
<span class='line-number'>64</span>
<span class='line-number'>65</span>
<span class='line-number'>66</span>
<span class='line-number'>67</span>
<span class='line-number'>68</span>
<span class='line-number'>69</span>
<span class='line-number'>70</span>
<span class='line-number'>71</span>
<span class='line-number'>72</span>
<span class='line-number'>73</span>
<span class='line-number'>74</span>
<span class='line-number'>75</span>
<span class='line-number'>76</span>
<span class='line-number'>77</span>
<span class='line-number'>78</span>
<span class='line-number'>79</span>
<span class='line-number'>80</span>
<span class='line-number'>81</span>
<span class='line-number'>82</span>
<span class='line-number'>83</span>
<span class='line-number'>84</span>
<span class='line-number'>85</span>
<span class='line-number'>86</span>
<span class='line-number'>87</span>
<span class='line-number'>88</span>
<span class='line-number'>89</span>
<span class='line-number'>90</span>
<span class='line-number'>91</span>
<span class='line-number'>92</span>
<span class='line-number'>93</span>
<span class='line-number'>94</span>
<span class='line-number'>95</span>
<span class='line-number'>96</span>
<span class='line-number'>97</span>
<span class='line-number'>98</span>
<span class='line-number'>99</span>
<span class='line-number'>100</span>
<span class='line-number'>101</span>
<span class='line-number'>102</span>
<span class='line-number'>103</span>
<span class='line-number'>104</span>
<span class='line-number'>105</span>
<span class='line-number'>106</span>
<span class='line-number'>107</span>
<span class='line-number'>108</span>
<span class='line-number'>109</span>
<span class='line-number'>110</span>
<span class='line-number'>111</span>
<span class='line-number'>112</span>
<span class='line-number'>113</span>
<span class='line-number'>114</span>
<span class='line-number'>115</span>
<span class='line-number'>116</span>
<span class='line-number'>117</span>
<span class='line-number'>118</span>
<span class='line-number'>119</span>
<span class='line-number'>120</span>
<span class='line-number'>121</span>
<span class='line-number'>122</span>
<span class='line-number'>123</span>
<span class='line-number'>124</span>
<span class='line-number'>125</span>
<span class='line-number'>126</span>
<span class='line-number'>127</span>
<span class='line-number'>128</span>
<span class='line-number'>129</span>
<span class='line-number'>130</span>
<span class='line-number'>131</span>
<span class='line-number'>132</span>
<span class='line-number'>133</span>
<span class='line-number'>134</span>
<span class='line-number'>135</span>
<span class='line-number'>136</span>
<span class='line-number'>137</span>
<span class='line-number'>138</span>
<span class='line-number'>139</span>
<span class='line-number'>140</span>
<span class='line-number'>141</span>
<span class='line-number'>142</span>
<span class='line-number'>143</span>
<span class='line-number'>144</span>
<span class='line-number'>145</span>
<span class='line-number'>146</span>
<span class='line-number'>147</span>
<span class='line-number'>148</span>
<span class='line-number'>149</span>
<span class='line-number'>150</span>
<span class='line-number'>151</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="nx">describe</span><span class="p">(</span><span class="s2">&quot;toEnglishNumber&quot;</span><span class="p">,</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>
</span><span class='line'>    <span class="nx">it</span><span class="p">(</span><span class="s2">&quot;converts 0 to zero&quot;</span><span class="p">,</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>        <span class="c1">// ARRANGE</span>
</span><span class='line'>        <span class="kd">var</span> <span class="nx">number</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>        <span class="c1">// ACT</span>
</span><span class='line'>        <span class="kd">var</span> <span class="nx">englishNumber</span> <span class="o">=</span> <span class="nx">toEnglishNumber</span><span class="p">(</span><span class="nx">number</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>        <span class="c1">// ASSERT</span>
</span><span class='line'>        <span class="kd">var</span> <span class="nx">expected</span> <span class="o">=</span> <span class="s2">&quot;zero&quot;</span><span class="p">;</span>
</span><span class='line'>        <span class="nx">expect</span><span class="p">(</span><span class="nx">englishNumber</span><span class="p">).</span><span class="nx">toEqual</span><span class="p">(</span><span class="nx">expected</span><span class="p">);</span>
</span><span class='line'>    <span class="p">});</span>
</span><span class='line'>
</span><span class='line'>    <span class="nx">it</span><span class="p">(</span><span class="s2">&quot;converts 1 to one&quot;</span><span class="p">,</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>        <span class="c1">// ARRANGE</span>
</span><span class='line'>        <span class="kd">var</span> <span class="nx">number</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>        <span class="c1">// ACT</span>
</span><span class='line'>        <span class="kd">var</span> <span class="nx">englishNumber</span> <span class="o">=</span> <span class="nx">toEnglishNumber</span><span class="p">(</span><span class="nx">number</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>        <span class="c1">// ASSERT</span>
</span><span class='line'>        <span class="kd">var</span> <span class="nx">expected</span> <span class="o">=</span> <span class="s2">&quot;one&quot;</span><span class="p">;</span>
</span><span class='line'>        <span class="nx">expect</span><span class="p">(</span><span class="nx">englishNumber</span><span class="p">).</span><span class="nx">toEqual</span><span class="p">(</span><span class="nx">expected</span><span class="p">,</span> <span class="s2">&quot;english number&quot;</span><span class="p">);</span>
</span><span class='line'>    <span class="p">});</span>
</span><span class='line'>
</span><span class='line'>    <span class="nx">it</span><span class="p">(</span><span class="s2">&quot;converts other one-digit numbers&quot;</span><span class="p">,</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>        <span class="nx">expect</span><span class="p">(</span><span class="nx">toEnglishNumber</span><span class="p">(</span><span class="mi">2</span><span class="p">)).</span><span class="nx">toEqual</span><span class="p">(</span><span class="s2">&quot;two&quot;</span><span class="p">,</span> <span class="s2">&quot;english number&quot;</span><span class="p">);</span>
</span><span class='line'>        <span class="nx">expect</span><span class="p">(</span><span class="nx">toEnglishNumber</span><span class="p">(</span><span class="mi">3</span><span class="p">)).</span><span class="nx">toEqual</span><span class="p">(</span><span class="s2">&quot;three&quot;</span><span class="p">,</span> <span class="s2">&quot;english number&quot;</span><span class="p">);</span>
</span><span class='line'>        <span class="nx">expect</span><span class="p">(</span><span class="nx">toEnglishNumber</span><span class="p">(</span><span class="mi">4</span><span class="p">)).</span><span class="nx">toEqual</span><span class="p">(</span><span class="s2">&quot;four&quot;</span><span class="p">,</span> <span class="s2">&quot;english number&quot;</span><span class="p">);</span>
</span><span class='line'>        <span class="nx">expect</span><span class="p">(</span><span class="nx">toEnglishNumber</span><span class="p">(</span><span class="mi">5</span><span class="p">)).</span><span class="nx">toEqual</span><span class="p">(</span><span class="s2">&quot;five&quot;</span><span class="p">,</span> <span class="s2">&quot;english number&quot;</span><span class="p">);</span>
</span><span class='line'>        <span class="nx">expect</span><span class="p">(</span><span class="nx">toEnglishNumber</span><span class="p">(</span><span class="mi">6</span><span class="p">)).</span><span class="nx">toEqual</span><span class="p">(</span><span class="s2">&quot;six&quot;</span><span class="p">,</span> <span class="s2">&quot;english number&quot;</span><span class="p">);</span>
</span><span class='line'>        <span class="nx">expect</span><span class="p">(</span><span class="nx">toEnglishNumber</span><span class="p">(</span><span class="mi">7</span><span class="p">)).</span><span class="nx">toEqual</span><span class="p">(</span><span class="s2">&quot;seven&quot;</span><span class="p">,</span> <span class="s2">&quot;english number&quot;</span><span class="p">);</span>
</span><span class='line'>        <span class="nx">expect</span><span class="p">(</span><span class="nx">toEnglishNumber</span><span class="p">(</span><span class="mi">8</span><span class="p">)).</span><span class="nx">toEqual</span><span class="p">(</span><span class="s2">&quot;eight&quot;</span><span class="p">,</span> <span class="s2">&quot;english number&quot;</span><span class="p">);</span>
</span><span class='line'>        <span class="nx">expect</span><span class="p">(</span><span class="nx">toEnglishNumber</span><span class="p">(</span><span class="mi">9</span><span class="p">)).</span><span class="nx">toEqual</span><span class="p">(</span><span class="s2">&quot;nine&quot;</span><span class="p">,</span> <span class="s2">&quot;english number&quot;</span><span class="p">);</span>
</span><span class='line'>    <span class="p">});</span>
</span><span class='line'>
</span><span class='line'>    <span class="nx">it</span><span class="p">(</span><span class="s2">&quot;converts 10 to ten&quot;</span><span class="p">,</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>        <span class="c1">// ARRANGE</span>
</span><span class='line'>        <span class="kd">var</span> <span class="nx">number</span> <span class="o">=</span> <span class="mi">10</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>        <span class="c1">// ACT</span>
</span><span class='line'>        <span class="kd">var</span> <span class="nx">englishNumber</span> <span class="o">=</span> <span class="nx">toEnglishNumber</span><span class="p">(</span><span class="nx">number</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>        <span class="c1">// ASSERT</span>
</span><span class='line'>        <span class="kd">var</span> <span class="nx">expected</span> <span class="o">=</span> <span class="s2">&quot;ten&quot;</span><span class="p">;</span>
</span><span class='line'>        <span class="nx">expect</span><span class="p">(</span><span class="nx">englishNumber</span><span class="p">).</span><span class="nx">toEqual</span><span class="p">(</span><span class="nx">expected</span><span class="p">,</span> <span class="s2">&quot;english number&quot;</span><span class="p">);</span>
</span><span class='line'>    <span class="p">});</span>
</span><span class='line'>
</span><span class='line'>    <span class="nx">it</span><span class="p">(</span><span class="s2">&quot;converts other teen numbers&quot;</span><span class="p">,</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>        <span class="nx">expect</span><span class="p">(</span><span class="nx">toEnglishNumber</span><span class="p">(</span><span class="mi">11</span><span class="p">)).</span><span class="nx">toEqual</span><span class="p">(</span><span class="s2">&quot;eleven&quot;</span><span class="p">,</span> <span class="s2">&quot;english number&quot;</span><span class="p">);</span>
</span><span class='line'>        <span class="nx">expect</span><span class="p">(</span><span class="nx">toEnglishNumber</span><span class="p">(</span><span class="mi">12</span><span class="p">)).</span><span class="nx">toEqual</span><span class="p">(</span><span class="s2">&quot;twelve&quot;</span><span class="p">,</span> <span class="s2">&quot;english number&quot;</span><span class="p">);</span>
</span><span class='line'>        <span class="nx">expect</span><span class="p">(</span><span class="nx">toEnglishNumber</span><span class="p">(</span><span class="mi">13</span><span class="p">)).</span><span class="nx">toEqual</span><span class="p">(</span><span class="s2">&quot;thirteen&quot;</span><span class="p">,</span> <span class="s2">&quot;english number&quot;</span><span class="p">);</span>
</span><span class='line'>        <span class="nx">expect</span><span class="p">(</span><span class="nx">toEnglishNumber</span><span class="p">(</span><span class="mi">14</span><span class="p">)).</span><span class="nx">toEqual</span><span class="p">(</span><span class="s2">&quot;fourteen&quot;</span><span class="p">,</span> <span class="s2">&quot;english number&quot;</span><span class="p">);</span>
</span><span class='line'>        <span class="nx">expect</span><span class="p">(</span><span class="nx">toEnglishNumber</span><span class="p">(</span><span class="mi">15</span><span class="p">)).</span><span class="nx">toEqual</span><span class="p">(</span><span class="s2">&quot;fifteen&quot;</span><span class="p">,</span> <span class="s2">&quot;english number&quot;</span><span class="p">);</span>
</span><span class='line'>        <span class="nx">expect</span><span class="p">(</span><span class="nx">toEnglishNumber</span><span class="p">(</span><span class="mi">16</span><span class="p">)).</span><span class="nx">toEqual</span><span class="p">(</span><span class="s2">&quot;sixteen&quot;</span><span class="p">,</span> <span class="s2">&quot;english number&quot;</span><span class="p">);</span>
</span><span class='line'>        <span class="nx">expect</span><span class="p">(</span><span class="nx">toEnglishNumber</span><span class="p">(</span><span class="mi">17</span><span class="p">)).</span><span class="nx">toEqual</span><span class="p">(</span><span class="s2">&quot;seventeen&quot;</span><span class="p">,</span> <span class="s2">&quot;english number&quot;</span><span class="p">);</span>
</span><span class='line'>        <span class="nx">expect</span><span class="p">(</span><span class="nx">toEnglishNumber</span><span class="p">(</span><span class="mi">18</span><span class="p">)).</span><span class="nx">toEqual</span><span class="p">(</span><span class="s2">&quot;eighteen&quot;</span><span class="p">,</span> <span class="s2">&quot;english number&quot;</span><span class="p">);</span>
</span><span class='line'>        <span class="nx">expect</span><span class="p">(</span><span class="nx">toEnglishNumber</span><span class="p">(</span><span class="mi">19</span><span class="p">)).</span><span class="nx">toEqual</span><span class="p">(</span><span class="s2">&quot;nineteen&quot;</span><span class="p">,</span> <span class="s2">&quot;english number&quot;</span><span class="p">);</span>
</span><span class='line'>    <span class="p">});</span>
</span><span class='line'>
</span><span class='line'>    <span class="nx">it</span><span class="p">(</span><span class="s2">&quot;converts 23 to twenty-three&quot;</span><span class="p">,</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>        <span class="c1">// ARRANGE</span>
</span><span class='line'>        <span class="kd">var</span> <span class="nx">number</span> <span class="o">=</span> <span class="mi">23</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>        <span class="c1">// ACT</span>
</span><span class='line'>        <span class="kd">var</span> <span class="nx">englishNumber</span> <span class="o">=</span> <span class="nx">toEnglishNumber</span><span class="p">(</span><span class="nx">number</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>        <span class="c1">// ASSERT</span>
</span><span class='line'>        <span class="kd">var</span> <span class="nx">expected</span> <span class="o">=</span> <span class="s2">&quot;twenty-three&quot;</span><span class="p">;</span>
</span><span class='line'>        <span class="nx">expect</span><span class="p">(</span><span class="nx">englishNumber</span><span class="p">).</span><span class="nx">toEqual</span><span class="p">(</span><span class="nx">expected</span><span class="p">,</span> <span class="s2">&quot;english number&quot;</span><span class="p">);</span>
</span><span class='line'>    <span class="p">});</span>
</span><span class='line'>
</span><span class='line'>    <span class="nx">it</span><span class="p">(</span><span class="s2">&quot;converts 27 to twenty-seven&quot;</span><span class="p">,</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>        <span class="c1">// ARRANGE</span>
</span><span class='line'>        <span class="kd">var</span> <span class="nx">number</span> <span class="o">=</span> <span class="mi">27</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>        <span class="c1">// ACT</span>
</span><span class='line'>        <span class="kd">var</span> <span class="nx">englishNumber</span> <span class="o">=</span> <span class="nx">toEnglishNumber</span><span class="p">(</span><span class="nx">number</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>        <span class="c1">// ASSERT</span>
</span><span class='line'>        <span class="kd">var</span> <span class="nx">expected</span> <span class="o">=</span> <span class="s2">&quot;twenty-seven&quot;</span><span class="p">;</span>
</span><span class='line'>        <span class="nx">expect</span><span class="p">(</span><span class="nx">englishNumber</span><span class="p">).</span><span class="nx">toEqual</span><span class="p">(</span><span class="nx">expected</span><span class="p">,</span> <span class="s2">&quot;english number&quot;</span><span class="p">);</span>
</span><span class='line'>    <span class="p">});</span>
</span><span class='line'>
</span><span class='line'>    <span class="nx">it</span><span class="p">(</span><span class="s2">&quot;converts 42 to forty-two&quot;</span><span class="p">,</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>        <span class="c1">// ARRANGE</span>
</span><span class='line'>        <span class="kd">var</span> <span class="nx">number</span> <span class="o">=</span> <span class="mi">42</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>        <span class="c1">// ACT</span>
</span><span class='line'>        <span class="kd">var</span> <span class="nx">englishNumber</span> <span class="o">=</span> <span class="nx">toEnglishNumber</span><span class="p">(</span><span class="nx">number</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>        <span class="c1">// ASSERT</span>
</span><span class='line'>        <span class="kd">var</span> <span class="nx">expected</span> <span class="o">=</span> <span class="s2">&quot;forty-two&quot;</span><span class="p">;</span>
</span><span class='line'>        <span class="nx">expect</span><span class="p">(</span><span class="nx">englishNumber</span><span class="p">).</span><span class="nx">toEqual</span><span class="p">(</span><span class="nx">expected</span><span class="p">,</span> <span class="s2">&quot;english number&quot;</span><span class="p">);</span>
</span><span class='line'>    <span class="p">});</span>
</span><span class='line'>
</span><span class='line'>    <span class="nx">it</span><span class="p">(</span><span class="s2">&quot;converts 39 to thirty-nine&quot;</span><span class="p">,</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>        <span class="c1">// ARRANGE</span>
</span><span class='line'>        <span class="kd">var</span> <span class="nx">number</span> <span class="o">=</span> <span class="mi">39</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>        <span class="c1">// ACT</span>
</span><span class='line'>        <span class="kd">var</span> <span class="nx">englishNumber</span> <span class="o">=</span> <span class="nx">toEnglishNumber</span><span class="p">(</span><span class="nx">number</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>        <span class="c1">// ASSERT</span>
</span><span class='line'>        <span class="kd">var</span> <span class="nx">expected</span> <span class="o">=</span> <span class="s2">&quot;thirty-nine&quot;</span><span class="p">;</span>
</span><span class='line'>        <span class="nx">expect</span><span class="p">(</span><span class="nx">englishNumber</span><span class="p">).</span><span class="nx">toEqual</span><span class="p">(</span><span class="nx">expected</span><span class="p">,</span> <span class="s2">&quot;english number&quot;</span><span class="p">);</span>
</span><span class='line'>    <span class="p">});</span>
</span><span class='line'>
</span><span class='line'>    <span class="nx">it</span><span class="p">(</span><span class="s2">&quot;converts other two-digit numbers&quot;</span><span class="p">,</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>        <span class="nx">expect</span><span class="p">(</span><span class="nx">toEnglishNumber</span><span class="p">(</span><span class="mi">57</span><span class="p">)).</span><span class="nx">toEqual</span><span class="p">(</span><span class="s2">&quot;fifty-seven&quot;</span><span class="p">,</span> <span class="s2">&quot;english number&quot;</span><span class="p">);</span>
</span><span class='line'>        <span class="nx">expect</span><span class="p">(</span><span class="nx">toEnglishNumber</span><span class="p">(</span><span class="mi">65</span><span class="p">)).</span><span class="nx">toEqual</span><span class="p">(</span><span class="s2">&quot;sixty-five&quot;</span><span class="p">,</span> <span class="s2">&quot;english number&quot;</span><span class="p">);</span>
</span><span class='line'>        <span class="nx">expect</span><span class="p">(</span><span class="nx">toEnglishNumber</span><span class="p">(</span><span class="mi">73</span><span class="p">)).</span><span class="nx">toEqual</span><span class="p">(</span><span class="s2">&quot;seventy-three&quot;</span><span class="p">,</span> <span class="s2">&quot;english number&quot;</span><span class="p">);</span>
</span><span class='line'>        <span class="nx">expect</span><span class="p">(</span><span class="nx">toEnglishNumber</span><span class="p">(</span><span class="mi">89</span><span class="p">)).</span><span class="nx">toEqual</span><span class="p">(</span><span class="s2">&quot;eighty-nine&quot;</span><span class="p">,</span> <span class="s2">&quot;english number&quot;</span><span class="p">);</span>
</span><span class='line'>        <span class="nx">expect</span><span class="p">(</span><span class="nx">toEnglishNumber</span><span class="p">(</span><span class="mi">91</span><span class="p">)).</span><span class="nx">toEqual</span><span class="p">(</span><span class="s2">&quot;ninety-one&quot;</span><span class="p">,</span> <span class="s2">&quot;english number&quot;</span><span class="p">);</span>
</span><span class='line'>    <span class="p">});</span>
</span><span class='line'>
</span><span class='line'><span class="p">});</span>
</span><span class='line'>
</span><span class='line'><span class="kd">var</span> <span class="nx">simpleNumbers</span> <span class="o">=</span> <span class="p">[</span>
</span><span class='line'>    <span class="s2">&quot;zero&quot;</span><span class="p">,</span> <span class="s2">&quot;one&quot;</span><span class="p">,</span> <span class="s2">&quot;two&quot;</span><span class="p">,</span> <span class="s2">&quot;three&quot;</span><span class="p">,</span> <span class="s2">&quot;four&quot;</span><span class="p">,</span>
</span><span class='line'>    <span class="s2">&quot;five&quot;</span><span class="p">,</span> <span class="s2">&quot;six&quot;</span><span class="p">,</span> <span class="s2">&quot;seven&quot;</span><span class="p">,</span> <span class="s2">&quot;eight&quot;</span><span class="p">,</span> <span class="s2">&quot;nine&quot;</span><span class="p">,</span>
</span><span class='line'>
</span><span class='line'>    <span class="s2">&quot;ten&quot;</span><span class="p">,</span> <span class="s2">&quot;eleven&quot;</span><span class="p">,</span> <span class="s2">&quot;twelve&quot;</span><span class="p">,</span> <span class="s2">&quot;thirteen&quot;</span><span class="p">,</span> <span class="s2">&quot;fourteen&quot;</span><span class="p">,</span>
</span><span class='line'>    <span class="s2">&quot;fifteen&quot;</span><span class="p">,</span> <span class="s2">&quot;sixteen&quot;</span><span class="p">,</span> <span class="s2">&quot;seventeen&quot;</span><span class="p">,</span> <span class="s2">&quot;eighteen&quot;</span><span class="p">,</span> <span class="s2">&quot;nineteen&quot;</span>
</span><span class='line'><span class="p">];</span>
</span><span class='line'>
</span><span class='line'><span class="kd">var</span> <span class="nx">tens</span> <span class="o">=</span> <span class="p">[</span>
</span><span class='line'>    <span class="s2">&quot;&quot;</span><span class="p">,</span> <span class="s2">&quot;&quot;</span><span class="p">,</span>
</span><span class='line'>
</span><span class='line'>    <span class="s2">&quot;twenty&quot;</span><span class="p">,</span> <span class="s2">&quot;thirty&quot;</span><span class="p">,</span> <span class="s2">&quot;forty&quot;</span><span class="p">,</span> <span class="s2">&quot;fifty&quot;</span><span class="p">,</span>
</span><span class='line'>    <span class="s2">&quot;sixty&quot;</span><span class="p">,</span> <span class="s2">&quot;seventy&quot;</span><span class="p">,</span> <span class="s2">&quot;eighty&quot;</span><span class="p">,</span> <span class="s2">&quot;ninety&quot;</span>
</span><span class='line'><span class="p">];</span>
</span><span class='line'>
</span><span class='line'><span class="kd">function</span> <span class="nx">convertTens</span><span class="p">(</span><span class="nx">digit</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">return</span> <span class="nx">tens</span><span class="p">[</span><span class="nx">digit</span><span class="p">];</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="kd">function</span> <span class="nx">toEnglishNumber</span><span class="p">(</span><span class="nx">number</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">if</span> <span class="p">(</span><span class="nx">number</span> <span class="o">&gt;=</span> <span class="mi">20</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>        <span class="kd">var</span> <span class="nx">firstDigit</span> <span class="o">=</span> <span class="nx">number</span> <span class="o">/</span> <span class="mi">10</span><span class="p">;</span>
</span><span class='line'>        <span class="kd">var</span> <span class="nx">lastDigit</span> <span class="o">=</span> <span class="nx">number</span> <span class="o">%</span> <span class="mi">10</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>        <span class="kd">var</span> <span class="nx">firstPart</span> <span class="o">=</span> <span class="nx">convertTens</span><span class="p">(</span><span class="nx">firstDigit</span><span class="p">);</span>
</span><span class='line'>        <span class="kd">var</span> <span class="nx">secondPart</span> <span class="o">=</span> <span class="nx">toEnglishNumber</span><span class="p">(</span><span class="nx">lastDigit</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>        <span class="k">return</span> <span class="nx">firstPart</span> <span class="o">+</span> <span class="s2">&quot;-&quot;</span> <span class="o">+</span> <span class="nx">secondPart</span><span class="p">;</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">return</span> <span class="nx">simpleNumbers</span><span class="p">[</span><span class="nx">number</span><span class="p">];</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<h2>Exercises</h2>

<ol>
<li>Do you see the missing edge case for two-digit numbers? Write a test for it and make it pass using three rules of test-driven development.</li>
<li>Add support for three-digit numbers.</li>
<li>Add support for negative numbers.</li>
<li>Add support for numbers with the floating point.</li>
</ol>


<h2>Conclusion</h2>

<p>Today we have learned a lot of concepts from testing and test-driven development. Also, we have learned the essence of TDD - three rules of TDD. We have learned how to apply these rules on a very simple example. We have touched on how beneficial test-driven development can be when applied well.</p>

<p>In the next article of the series, we will discuss what different kinds of tests exist, how and when to write them and how to apply TDD in these tests. Also, we will get back to our application and implement a new feature.</p>

<h2>Thanks</h2>

<p>Thank you for reading, my dear reader. If you liked it, please share this article on social networks and follow me on twitter: <a href="https://twitter.com/tdd_fellow">@tdd_fellow</a>.</p>

<p>If you have any questions or feedback for me, don’t hesitate to reach me out on Twitter: <a href="https://twitter.com/tdd_fellow">@tdd_fellow</a>.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Learning Test-Driven Development With Javascript: End-to-End Testing]]></title>
    <link href="http://www.tddfellow.com/blog/2016/12/23/learning-test-driven-development-with-javascript-end-to-end-testing/"/>
    <updated>2016-12-23T10:13:33+01:00</updated>
    <id>http://www.tddfellow.com/blog/2016/12/23/learning-test-driven-development-with-javascript-end-to-end-testing</id>
    <content type="html"><![CDATA[<p><strong>Level: Beginner.</strong></p>

<p>&ldquo;Learning TDD with Javascript&rdquo; is the series of articles where we learn basics of automated testing and test-driven development. While the language of choice for the code examples is Javascript, all described concepts are language-agnostic and are applicable in various technological stacks. In these articles, a reader is expected to do small exercises after each major topic to reinforce that theoretical knowledge with practice. Some of these exercises are practical and will involve coding, or simple writing; others will be food for thought. Also, a reader might want to get their feedback on these exercises, so don&rsquo;t hesitate to send the results my way: <a href="&#x6d;&#x61;&#x69;&#x6c;&#116;&#111;&#58;&#x6f;&#x6c;&#x65;&#107;&#x73;&#x69;&#x69;&#x40;&#116;&#x64;&#x64;&#102;&#101;&#108;&#108;&#111;&#x77;&#46;&#99;&#111;&#x6d;">&#111;&#x6c;&#x65;&#107;&#x73;&#105;&#x69;&#x40;&#x74;&#x64;&#100;&#102;&#101;&#108;&#x6c;&#x6f;&#x77;&#46;&#99;&#111;&#109;</a> - feedback on the practice is quite important as it helps to improve quicker, when you know what is well and what can be improved and how. Also, don&rsquo;t hesitate to send any questions and feedback regarding the content of these articles. Your questions, feedback, and your practical results will help authors shape this content better.</p>

<p>Today we are going to learn how to write tests that imitate real user interaction for the whole application. We are going to build a small web application using Vanilla Javascript. Vanilla Javascript is a plain Javascript without any framework or library. Such tests that imitate real user interaction via User Interface (UI) are called End-to-End Tests. These tests are the most simple to write because we only need to think about our application in the same way user does:</p>

<ul>
<li>Imitating the user clicking on the button would mean for us to trigger a button click;</li>
<li>Imitating the user typing text in the input field would mean for us to change input&rsquo;s value;</li>
<li>Imitating the user clicking on the link would mean for us to trigger a link click;</li>
<li>And so on.</li>
</ul>


<!-- more -->


<p>We don&rsquo;t need to think about specific implementation details, such as: which functions and classes do we have in our code and how they interact with each other, is there any interaction with the back-end server or 3rd-party API. Also, we don&rsquo;t need to be proficient with interaction testing - this is the topic for the future series.</p>

<p>Of course, for that kind of simplicity we are trading something off. In the case of End-to-End tests, they are slower, suffer concurrency, wait, and timeout problems, and are harder to maintain in the long run. We don&rsquo;t have to worry about that just yet because we want to learn how to write tests in general, and this kind of simplicity is perfect for us in this case.</p>

<p>Such simplicity stems from the fact that End-to-End tests, mostly, are direct translations of user stories (use case scenarios) into the UI manipulation code.</p>

<h2>User Story</h2>

<p>User stories are scenarios describing an individual feature of the software via user story context, sequences of user interactions and user expectations. User story context is the description of the situation the user and the software system are in at the beginning of the scenario. An example of the system context: &ldquo;user John is registered in the system with password &lsquo;welcome&rsquo;.&rdquo; An example of the user context: &ldquo;user is at the login page.&rdquo; User interaction is the description of a particular action user takes inside of the system, usually, doing something within the UI, for example: &ldquo;User enters email &lsquo;<a href="&#109;&#97;&#105;&#108;&#x74;&#111;&#58;&#x6a;&#111;&#104;&#x6e;&#x40;&#x65;&#x78;&#97;&#109;&#112;&#x6c;&#x65;&#46;&#x6f;&#x72;&#103;">&#x6a;&#111;&#104;&#110;&#64;&#101;&#x78;&#97;&#109;&#x70;&#x6c;&#101;&#46;&#x6f;&#114;&#x67;</a>&rsquo; in the email input field&rdquo; or &ldquo;User clicks on the submit button.&rdquo; Finally, user expectation is the description of what particular information user should receive from the system, for example: &ldquo;User sees the success message on the page&rdquo; or &ldquo;User receives the email with the verification code.&rdquo;</p>

<p>User stories come in different flavor and formats. It can be a free-form text, describing three parts: context, interactions, and expectations; or it can be in a formal &ldquo;Given-When-Then&rdquo; form. &ldquo;Given&rdquo; part is the sequence of the user story context descriptions, &ldquo;When&rdquo; part is the sequence of the user interaction descriptions, and &ldquo;Then&rdquo; part is the sequence of user expectation descriptions. Both forms can be used interchangeably, and some software companies use one or another formal version of the user story format consistently.</p>

<p>Let&rsquo;s take a look at the example of the free-form user story together with the example of the Given-When-Then user story for the same feature:</p>

<div class="next-table-layout-is-fixed"></div>


<table>
<thead>
<tr>
<th>Free-form</th>
<th>Given-When-Then</th>
</tr>
</thead>
<tbody>
<tr>
<td><hr></td>
<td><hr></td>
</tr>
<tr>
<td>User with email &lsquo;<a href="&#x6d;&#97;&#x69;&#108;&#116;&#111;&#x3a;&#106;&#x6f;&#104;&#x6e;&#x40;&#101;&#120;&#x61;&#x6d;&#112;&#x6c;&#101;&#46;&#x6f;&#x72;&#x67;">&#x6a;&#111;&#104;&#x6e;&#x40;&#x65;&#120;&#97;&#109;&#112;&#x6c;&#101;&#46;&#111;&#x72;&#103;</a>&rsquo; and password &lsquo;welcome&rsquo; exists in the system<br>John enters his email &lsquo;<a href="&#x6d;&#97;&#x69;&#108;&#116;&#x6f;&#x3a;&#x6a;&#x6f;&#x68;&#x6e;&#64;&#101;&#120;&#x61;&#109;&#x70;&#x6c;&#x65;&#46;&#111;&#x72;&#103;">&#106;&#111;&#104;&#110;&#64;&#101;&#120;&#x61;&#x6d;&#112;&#108;&#x65;&#46;&#111;&#114;&#x67;</a>&rsquo; into the email field and his password &lsquo;welcome&rsquo; into the password field on the login page<br>After that John submits the login form<br>Finally, John expects to see their profile page with the indication of him being logged in (name &lsquo;John&rsquo; is present on the page)</td>
<td><strong>Given</strong> User with email &lsquo;<a href="&#x6d;&#x61;&#x69;&#x6c;&#116;&#x6f;&#58;&#106;&#111;&#x68;&#x6e;&#64;&#x65;&#x78;&#x61;&#x6d;&#x70;&#x6c;&#101;&#x2e;&#x6f;&#114;&#103;">&#106;&#111;&#x68;&#x6e;&#64;&#x65;&#x78;&#x61;&#109;&#x70;&#108;&#101;&#x2e;&#111;&#114;&#x67;</a>&rsquo; and password &lsquo;welcome&rsquo; exists<br><strong>And</strong> I am at the login page<br><strong>When</strong> I enter &lsquo;<a href="&#109;&#97;&#105;&#x6c;&#x74;&#x6f;&#58;&#x6a;&#111;&#x68;&#x6e;&#64;&#101;&#x78;&#97;&#109;&#x70;&#x6c;&#x65;&#x2e;&#111;&#114;&#103;">&#x6a;&#x6f;&#x68;&#x6e;&#64;&#x65;&#x78;&#x61;&#x6d;&#x70;&#108;&#101;&#x2e;&#x6f;&#114;&#103;</a>&rsquo; in the email field<br><strong>And</strong> I enter &lsquo;welcome&rsquo; in the password field<br><strong>And</strong> I click on the submit button<br><strong>Then</strong> I see the profile page<br><strong>And</strong> I see my name as the title of the profile page</td>
</tr>
</tbody>
</table>


<p>As we can see, free-form can be very vague and is very flexible, and formal form is more strict and precise. The free-form on its own doesn&rsquo;t have much upsides or downsides - it is as good as it is written. On the other hand, the formal form does give us some value and also trades something off for that value. They are generally easy to write and, because they are so specific, are easy to translate to the automated test. On the other hand, they may hamper creativity either while creating the user story or when implementing it.</p>

<p>It is important to mention that these use case scenarios are not full user stories or features. One feature can have multiple scenarios like that - together they are called acceptance criteria. When all such scenarios of the given feature work correctly, the feature is done. There is another vital part of the user story - general description, that should contain the rationale behind the story and the value for the user or any other important actor in the system, such as the stakeholder. Before we write scenarios, we often come up with the rationale like that and it drives us to write a scenario. For example, for the feature above we would have used something like that:</p>

<div class="next-table-layout-is-fixed"></div>


<table>
<thead>
<tr>
<th>Free-form</th>
<th>Given-When-Then</th>
</tr>
</thead>
<tbody>
<tr>
<td><hr></td>
<td><hr></td>
</tr>
<tr>
<td>John needs to authenticate to the system so that he can access his private content</td>
<td><strong>As John</strong>, I want to be able to authenticate to the system<br><strong>So that</strong> I can access my private content</td>
</tr>
</tbody>
</table>


<p>Because formal form user stories are more precise, easier to write and simpler to translate to the automated test, we are going to use them to learn End-to-End testing in the context of Test-Driven Development.</p>

<h3>Exercises</h3>

<ol>
<li>Write a scenario for authentication story, when John enters the wrong password.</li>
<li>Write a user story with rationale and scenarios for the sign-up feature.</li>
<li>Imagine we are developing an instant messaging application. What do you think would be the next feature after login/sign-up? Write the user story with rationale and scenarios for this feature.</li>
</ol>


<p>Do you have questions? Or do you want to get quick feedback on how you did the exercises? - mail me: <a href="&#109;&#x61;&#x69;&#108;&#x74;&#111;&#58;&#x6f;&#x6c;&#101;&#107;&#115;&#105;&#x69;&#64;&#x74;&#100;&#x64;&#102;&#x65;&#108;&#108;&#111;&#119;&#x2e;&#99;&#111;&#109;">&#111;&#x6c;&#101;&#107;&#115;&#x69;&#105;&#64;&#x74;&#100;&#x64;&#102;&#101;&#108;&#108;&#x6f;&#x77;&#x2e;&#99;&#x6f;&#109;</a></p>

<h2>Setting Up the Project</h2>

<p>Now we will be writing a simple web application, using Vanilla Javascript (ECMAScript 5), so that our setup is rather simple. For the testing, we will be using a standalone version of the Jasmine testing framework. Also, we will be writing a single page application (SPA), so that we don&rsquo;t have to worry about rendering different pages in our tests for now. We are aiming for the following directory structure of our project:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>.
</span><span class='line'>├── lib
</span><span class='line'>├───── .. external libraries, such as Jasmine ..
</span><span class='line'>├── spec
</span><span class='line'>├───── .. sources with Jasmine automated tests ..
</span><span class='line'>└── src
</span><span class='line'>├───── .. sources with our main code ..
</span><span class='line'>├── index.html       - entry point to the application
</span><span class='line'>├── SpecRunner.html  - entry point to our test suite</span></code></pre></td></tr></table></div></figure>


<p>First, create required directories: <code>lib</code>, <code>spec</code> and <code>src</code>. Then download the latest standalone Jasmine release here: <a href="https://github.com/jasmine/jasmine/releases">https://github.com/jasmine/jasmine/releases</a> (jasmine-standalone-{version}.zip file). At the time of writing, the version is <code>2.5.2</code>. Unzip that file into your project directory. You should get the following files from it:</p>

<ul>
<li><code>./lib/jasmine-2.5.2/</code> directory - contains all the resources required by Jasmine.</li>
<li><code>./SpecRunner.html</code> - example entry point to our test suite.</li>
<li><code>./src/Player.js</code> and <code>./src/Song.js</code> - example source files.</li>
<li><code>./spec/PlayerSpec.js</code> and <code>./spec/SpecHelper.js</code> - example automated Jasmine tests.</li>
</ul>


<p>Now, try to open <code>SpecRunner.html</code> in your browser. It should run these example tests, and they should all pass. Here is how it should look like:</p>

<p><img src="http://www.tddfellow.com/images/learning-tdd-with-js/jasmine-example-run.png" alt="Jasmine example test run with all tests green" /></p>

<p>Also, create an empty <code>index.html</code>:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
</pre></td><td class='code'><pre><code class='html'><span class='line'><span class="cp">&lt;!DOCTYPE html&gt;</span>
</span><span class='line'><span class="nt">&lt;html</span> <span class="na">lang=</span><span class="s">&quot;en&quot;</span><span class="nt">&gt;</span>
</span><span class='line'><span class="nt">&lt;head&gt;</span>
</span><span class='line'>    <span class="nt">&lt;meta</span> <span class="na">charset=</span><span class="s">&quot;UTF-8&quot;</span><span class="nt">&gt;</span>
</span><span class='line'>    <span class="nt">&lt;title&gt;</span>Title<span class="nt">&lt;/title&gt;</span>
</span><span class='line'><span class="nt">&lt;/head&gt;</span>
</span><span class='line'><span class="nt">&lt;body&gt;</span>
</span><span class='line'>
</span><span class='line'><span class="nt">&lt;/body&gt;</span>
</span><span class='line'><span class="nt">&lt;/html&gt;</span>
</span></code></pre></td></tr></table></div></figure>


<p>And now we should have the desired project structure. So how does that Jasmine testing framework works, anyways?</p>

<h2>Crash Course into Jasmine</h2>

<p>Let&rsquo;s take a look at the example test file to get the gist of how Jasmine works:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
<span class='line-number'>37</span>
<span class='line-number'>38</span>
<span class='line-number'>39</span>
<span class='line-number'>40</span>
<span class='line-number'>41</span>
<span class='line-number'>42</span>
<span class='line-number'>43</span>
<span class='line-number'>44</span>
<span class='line-number'>45</span>
<span class='line-number'>46</span>
<span class='line-number'>47</span>
<span class='line-number'>48</span>
<span class='line-number'>49</span>
<span class='line-number'>50</span>
<span class='line-number'>51</span>
<span class='line-number'>52</span>
<span class='line-number'>53</span>
<span class='line-number'>54</span>
<span class='line-number'>55</span>
<span class='line-number'>56</span>
<span class='line-number'>57</span>
<span class='line-number'>58</span>
<span class='line-number'>59</span>
<span class='line-number'>60</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="c1">// spec/PlayerSpec.js</span>
</span><span class='line'>
</span><span class='line'><span class="nx">describe</span><span class="p">(</span><span class="s2">&quot;Player&quot;</span><span class="p">,</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">player</span><span class="p">;</span>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">song</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>  <span class="nx">beforeEach</span><span class="p">(</span><span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>    <span class="nx">player</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">Player</span><span class="p">();</span>
</span><span class='line'>    <span class="nx">song</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">Song</span><span class="p">();</span>
</span><span class='line'>  <span class="p">});</span>
</span><span class='line'>
</span><span class='line'>  <span class="nx">it</span><span class="p">(</span><span class="s2">&quot;should be able to play a Song&quot;</span><span class="p">,</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>    <span class="nx">player</span><span class="p">.</span><span class="nx">play</span><span class="p">(</span><span class="nx">song</span><span class="p">);</span>
</span><span class='line'>    <span class="nx">expect</span><span class="p">(</span><span class="nx">player</span><span class="p">.</span><span class="nx">currentlyPlayingSong</span><span class="p">).</span><span class="nx">toEqual</span><span class="p">(</span><span class="nx">song</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>    <span class="c1">//demonstrates use of custom matcher</span>
</span><span class='line'>    <span class="nx">expect</span><span class="p">(</span><span class="nx">player</span><span class="p">).</span><span class="nx">toBePlaying</span><span class="p">(</span><span class="nx">song</span><span class="p">);</span>
</span><span class='line'>  <span class="p">});</span>
</span><span class='line'>
</span><span class='line'>  <span class="nx">describe</span><span class="p">(</span><span class="s2">&quot;when song has been paused&quot;</span><span class="p">,</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>    <span class="nx">beforeEach</span><span class="p">(</span><span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>      <span class="nx">player</span><span class="p">.</span><span class="nx">play</span><span class="p">(</span><span class="nx">song</span><span class="p">);</span>
</span><span class='line'>      <span class="nx">player</span><span class="p">.</span><span class="nx">pause</span><span class="p">();</span>
</span><span class='line'>    <span class="p">});</span>
</span><span class='line'>
</span><span class='line'>    <span class="nx">it</span><span class="p">(</span><span class="s2">&quot;should indicate that the song is currently paused&quot;</span><span class="p">,</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>      <span class="nx">expect</span><span class="p">(</span><span class="nx">player</span><span class="p">.</span><span class="nx">isPlaying</span><span class="p">).</span><span class="nx">toBeFalsy</span><span class="p">();</span>
</span><span class='line'>
</span><span class='line'>      <span class="c1">// demonstrates use of &#39;not&#39; with a custom matcher</span>
</span><span class='line'>      <span class="nx">expect</span><span class="p">(</span><span class="nx">player</span><span class="p">).</span><span class="nx">not</span><span class="p">.</span><span class="nx">toBePlaying</span><span class="p">(</span><span class="nx">song</span><span class="p">);</span>
</span><span class='line'>    <span class="p">});</span>
</span><span class='line'>
</span><span class='line'>    <span class="nx">it</span><span class="p">(</span><span class="s2">&quot;should be possible to resume&quot;</span><span class="p">,</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>      <span class="nx">player</span><span class="p">.</span><span class="nx">resume</span><span class="p">();</span>
</span><span class='line'>      <span class="nx">expect</span><span class="p">(</span><span class="nx">player</span><span class="p">.</span><span class="nx">isPlaying</span><span class="p">).</span><span class="nx">toBeTruthy</span><span class="p">();</span>
</span><span class='line'>      <span class="nx">expect</span><span class="p">(</span><span class="nx">player</span><span class="p">.</span><span class="nx">currentlyPlayingSong</span><span class="p">).</span><span class="nx">toEqual</span><span class="p">(</span><span class="nx">song</span><span class="p">);</span>
</span><span class='line'>    <span class="p">});</span>
</span><span class='line'>  <span class="p">});</span>
</span><span class='line'>
</span><span class='line'>  <span class="c1">// demonstrates use of spies to intercept and test method calls</span>
</span><span class='line'>  <span class="nx">it</span><span class="p">(</span><span class="s2">&quot;tells the current song if the user has made it a favorite&quot;</span><span class="p">,</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>    <span class="nx">spyOn</span><span class="p">(</span><span class="nx">song</span><span class="p">,</span> <span class="s1">&#39;persistFavoriteStatus&#39;</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>    <span class="nx">player</span><span class="p">.</span><span class="nx">play</span><span class="p">(</span><span class="nx">song</span><span class="p">);</span>
</span><span class='line'>    <span class="nx">player</span><span class="p">.</span><span class="nx">makeFavorite</span><span class="p">();</span>
</span><span class='line'>
</span><span class='line'>    <span class="nx">expect</span><span class="p">(</span><span class="nx">song</span><span class="p">.</span><span class="nx">persistFavoriteStatus</span><span class="p">).</span><span class="nx">toHaveBeenCalledWith</span><span class="p">(</span><span class="kc">true</span><span class="p">);</span>
</span><span class='line'>  <span class="p">});</span>
</span><span class='line'>
</span><span class='line'>  <span class="c1">//demonstrates use of expected exceptions</span>
</span><span class='line'>  <span class="nx">describe</span><span class="p">(</span><span class="s2">&quot;#resume&quot;</span><span class="p">,</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>    <span class="nx">it</span><span class="p">(</span><span class="s2">&quot;should throw an exception if song is already playing&quot;</span><span class="p">,</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>      <span class="nx">player</span><span class="p">.</span><span class="nx">play</span><span class="p">(</span><span class="nx">song</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>      <span class="nx">expect</span><span class="p">(</span><span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>        <span class="nx">player</span><span class="p">.</span><span class="nx">resume</span><span class="p">();</span>
</span><span class='line'>      <span class="p">}).</span><span class="nx">toThrowError</span><span class="p">(</span><span class="s2">&quot;song is already playing&quot;</span><span class="p">);</span>
</span><span class='line'>    <span class="p">});</span>
</span><span class='line'>  <span class="p">});</span>
</span><span class='line'><span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>


<p>First important concept here is the <code>describe("...", function () { ... })</code>. <code>describe</code> function is used to describe a certain concept or a certain context. For example, <code>describe("Player", ...)</code> means that we are going to define tests for <code>Player</code> class or some other <code>Player</code> concept. Also, describes can be nested to indicate that we are describing some specific context (<code>describe("when a song has been paused", ...)</code>) or sub-concept of current concept, such as the method of currently described class (<code>describe("#resume", ...)</code>). That is a good example, of what the unit test suite might be describing. In the case of End-to-End tests we would like to describe a full feature, so <code>describe("Login Feature", ...)</code> is a good bet. The second argument for the <code>describe</code> is the function that will contain all tests and sub-describes for the described concept. This function is the capturing closure, so defining variables and functions on the outer-level describe will make them available on the inner-level describes and the tests themselves.</p>

<p>Second important concept here is the <code>it("...", function () { ... })</code>. <code>it</code> function is used to create a test for the currently described concept, context or sub-concept. The first argument is the description of what <em>it</em> does, where <em>it</em> is the described concept. For example, given we describe a <code>music player</code> and our context is <code>when the volume is at max</code>, then we might write the test <code>it("is deafening", ...)</code>. In the case of End-to-End tests we are describing a feature, so <em>it</em> will refer to our application, or application&rsquo;s user interface, for example: <code>it("shows user's nickname", ...)</code>. The second argument to the <code>it</code> is the function with the test itself. Here we will setup the stage for the test, call our main code and verify that everything happened as we expect.</p>

<p>Finally, the third important concept is the <code>expect(...).to...</code>. That is Jasmine&rsquo;s form of assertion. That is where we verify that our code worked as we expect it to. As an argument to expect we provide an actual value. The actual value is something that our code has returned as a result of the function or method execution or something that we have read from the UI using UI manipulation code, or something that we have read from some 3rd party service, such as our back-end server, 3rd-party API or database. Essentially, this is the value that we are verifying to be correct. The second part is the Jasmine matcher - the method defined on the object, that is returned from <code>expect(value)</code> call, that allows us to define what we want to assert about that value. The most used one is <code>toEqual(...)</code>, which asserts that the value was equal to some expected value.</p>

<p>These three concepts should be enough to start writing tests. Don&rsquo;t worry about everything else that you see in this example file from standalone Jasmine distribution. We will discover some of these concepts as we go. Now, let&rsquo;s remove <code>src/Player.js</code>, <code>src/Song.js</code>, <code>spec/PlayerSpec.js</code> and <code>spec/SpecHelper.js</code>, and run our test suite - it is enough to reload the page to re-run our test suite. Test run should report that <code>No specs found</code>:</p>

<p><img src="http://www.tddfellow.com/images/learning-tdd-with-js/jasmine-no-specs-found.png" alt="Jasmine no specs found example" /></p>

<p>To get the gist of how <code>describe("...", function () { ... })</code>, <code>it("...", function () { ... })</code> and <code>expect(...).toEqual(...)</code> works, let&rsquo;s write our first failing test. Also, that will let us see if the testing framework is configured correctly and is capable of showing us the test failure. Let&rsquo;s create a new file called <code>spec/JasmineWorksSpec.js</code>:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="c1">// spec/JasmineWorksSpec.js</span>
</span><span class='line'>
</span><span class='line'><span class="nx">describe</span><span class="p">(</span><span class="s2">&quot;testing framework&quot;</span><span class="p">,</span> <span class="kd">function</span> <span class="p">()</span> <span class="p">{</span>
</span><span class='line'>  <span class="nx">it</span><span class="p">(</span><span class="s2">&quot;works&quot;</span><span class="p">,</span> <span class="kd">function</span> <span class="p">()</span> <span class="p">{</span>
</span><span class='line'>    <span class="nx">expect</span><span class="p">(</span><span class="mi">2</span> <span class="o">+</span> <span class="mi">2</span><span class="p">).</span><span class="nx">toEqual</span><span class="p">(</span><span class="mi">5</span><span class="p">);</span>
</span><span class='line'>  <span class="p">});</span>
</span><span class='line'><span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>


<p>And we need to add this test file to the <code>SpecRunner.html</code>:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
</pre></td><td class='code'><pre><code class='html'><span class='line'><span class="c">&lt;!-- include source files here... --&gt;</span>
</span><span class='line'>
</span><span class='line'><span class="c">&lt;!-- include spec files here... --&gt;</span>
</span><span class='line'><span class="nt">&lt;script </span><span class="na">src=</span><span class="s">&quot;spec/JasmineWorksSpec.js&quot;</span><span class="nt">&gt;&lt;/script&gt;</span>
</span></code></pre></td></tr></table></div></figure>


<p>And if we run our test suite, we should see a failure:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class='html'><span class='line'>testing framework works
</span><span class='line'>  Expected 4 to equal 5.
</span></code></pre></td></tr></table></div></figure>


<p>And we ought to make it pass by fixing our incorrect assertion: <code>expect(2 + 2).toEqual(4);</code>. And if we run the test suite again, by reloading the page in the browser, all the test should pass.</p>

<h2>Writing our First Simple Tests</h2>

<p>Now we can write some real tests to practice usage of <code>describe</code>, <code>it</code> and <code>expect(...).toEqual</code>: let&rsquo;s create <code>ArithmeticsSpec.js</code> and write some tests for behavior of <code>add</code> function:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="c1">// spec/ArithmeticsSpec.js</span>
</span><span class='line'>
</span><span class='line'><span class="nx">describe</span><span class="p">(</span><span class="s2">&quot;Arithmetics&quot;</span><span class="p">,</span> <span class="kd">function</span> <span class="p">()</span> <span class="p">{</span>
</span><span class='line'>
</span><span class='line'>  <span class="nx">describe</span><span class="p">(</span><span class="s2">&quot;#add(a, b)&quot;</span><span class="p">,</span> <span class="kd">function</span> <span class="p">()</span> <span class="p">{</span>
</span><span class='line'>    <span class="nx">it</span><span class="p">(</span><span class="s2">&quot;calculates the sum of two numbers&quot;</span><span class="p">,</span> <span class="kd">function</span> <span class="p">()</span> <span class="p">{</span>
</span><span class='line'>      <span class="c1">// ARRANGE</span>
</span><span class='line'>      <span class="kd">var</span> <span class="nx">a</span> <span class="o">=</span> <span class="mi">3</span><span class="p">;</span>
</span><span class='line'>      <span class="kd">var</span> <span class="nx">b</span> <span class="o">=</span> <span class="mi">4</span><span class="p">;</span>
</span><span class='line'>      <span class="kd">var</span> <span class="nx">expected</span> <span class="o">=</span> <span class="mi">7</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>      <span class="c1">// ACT</span>
</span><span class='line'>      <span class="kd">var</span> <span class="nx">actual</span> <span class="o">=</span> <span class="nx">Arithmetics</span><span class="p">.</span><span class="nx">add</span><span class="p">(</span><span class="nx">a</span><span class="p">,</span> <span class="nx">b</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>      <span class="c1">// ASSERT</span>
</span><span class='line'>      <span class="nx">expect</span><span class="p">(</span><span class="nx">actual</span><span class="p">).</span><span class="nx">toEqual</span><span class="p">(</span><span class="nx">expected</span><span class="p">);</span>
</span><span class='line'>    <span class="p">});</span>
</span><span class='line'>  <span class="p">});</span>
</span><span class='line'>
</span><span class='line'><span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>


<p>Don&rsquo;t forget to add the <code>&lt;script src="spec/ArithmeticsSpec.js"&gt;&lt;/script&gt;</code> to the <code>SpecRunner.html</code>. This test will fail first because <code>Arithmetics</code> module is not defined. We will define it as an empty object. Next failure is because <code>Arithmetics.add</code> is not a function - it is undefined. We will define that function with two arguments inside of the <code>Arithmetics</code> object. Finally, the test will fail, because we expect the result to be seven, but it was undefined. We will make the simplest thing we can do to pass the failing test - return seven. That will make the test pass. The code will be in <code>src/Arithmetics.js</code>, which we include in our <code>SpecRunner.html</code>, and will look like that:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="c1">// src/Arithmetics.js</span>
</span><span class='line'>
</span><span class='line'><span class="kd">var</span> <span class="nx">Arithmetics</span> <span class="o">=</span> <span class="p">{</span>
</span><span class='line'>  <span class="nx">add</span><span class="o">:</span> <span class="kd">function</span> <span class="p">(</span><span class="nx">a</span><span class="p">,</span> <span class="nx">b</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">return</span> <span class="mi">7</span><span class="p">;</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'><span class="p">};</span>
</span></code></pre></td></tr></table></div></figure>


<p>That, of course, is not correct implementation, so we need another test to drive out the proper implementation - test with different inputs and a different result. To make it pass we will have to use <code>a + b</code>:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="c1">// spec/ArithmeticsSpec.js</span>
</span><span class='line'><span class="nx">describe</span><span class="p">(</span><span class="s2">&quot;Arithmetics&quot;</span><span class="p">,</span> <span class="kd">function</span> <span class="p">()</span> <span class="p">{</span>
</span><span class='line'>
</span><span class='line'>  <span class="nx">describe</span><span class="p">(</span><span class="s2">&quot;#add(a, b)&quot;</span><span class="p">,</span> <span class="kd">function</span> <span class="p">()</span> <span class="p">{</span>
</span><span class='line'>    <span class="nx">it</span><span class="p">(</span><span class="s2">&quot;calculates the sum of two numbers&quot;</span><span class="p">,</span> <span class="kd">function</span> <span class="p">()</span> <span class="p">{</span> <span class="p">...</span> <span class="p">});</span>
</span><span class='line'>
</span><span class='line'>    <span class="nx">it</span><span class="p">(</span><span class="s2">&quot;calculates the sum of two other numbers&quot;</span><span class="p">,</span> <span class="kd">function</span> <span class="p">()</span> <span class="p">{</span>
</span><span class='line'>      <span class="c1">// ARRANGE</span>
</span><span class='line'>      <span class="kd">var</span> <span class="nx">a</span> <span class="o">=</span> <span class="mi">73</span><span class="p">;</span>
</span><span class='line'>      <span class="kd">var</span> <span class="nx">b</span> <span class="o">=</span> <span class="mi">89</span><span class="p">;</span>
</span><span class='line'>      <span class="kd">var</span> <span class="nx">expected</span> <span class="o">=</span> <span class="mi">162</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>      <span class="c1">// ACT</span>
</span><span class='line'>      <span class="kd">var</span> <span class="nx">actual</span> <span class="o">=</span> <span class="nx">Arithmetics</span><span class="p">.</span><span class="nx">add</span><span class="p">(</span><span class="nx">a</span><span class="p">,</span> <span class="nx">b</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>      <span class="c1">// ASSERT</span>
</span><span class='line'>      <span class="nx">expect</span><span class="p">(</span><span class="nx">actual</span><span class="p">).</span><span class="nx">toEqual</span><span class="p">(</span><span class="nx">expected</span><span class="p">);</span>
</span><span class='line'>    <span class="p">});</span>
</span><span class='line'>  <span class="p">});</span>
</span><span class='line'>
</span><span class='line'><span class="p">});</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// src/Arithmetics.js</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">Arithmetics</span> <span class="o">=</span> <span class="p">{</span>
</span><span class='line'>  <span class="nx">add</span><span class="o">:</span> <span class="kd">function</span> <span class="p">(</span><span class="nx">a</span><span class="p">,</span> <span class="nx">b</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">return</span> <span class="nx">a</span> <span class="o">+</span> <span class="nx">b</span><span class="p">;</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'><span class="p">};</span>
</span></code></pre></td></tr></table></div></figure>


<h3>Three &ldquo;A&#8221;s: Arrange, Act, and Assert</h3>

<p>Have you noticed three comments that I have left in the example tests&#8217; code: <code>ARRANGE</code>, <code>ACT</code> and <code>ASSERT</code>? These are three &ldquo;A&#8221;s of writing a good test. Arrange is the part of the test, where we set up the stage: prepare input data, create objects, load resources, change the state of the system - it is the part where we create the context for our test. Act is the part of the test, where we call our system under the test. In the <code>Arithmetics</code> example it was a function <code>Arithmetics.add(a, b)</code>. The system under the test can return some useful value or change its state. To verify that either is correct we, finally, use Assert section of our test - part of the test where we verify the outcome of the call to the system under the test.</p>

<p>The sections <code>ARRANGE</code>, <code>ACT</code> and <code>ASSERT</code> are spelled out in the comments only for the reader&rsquo;s convenience - usually, real projects don&rsquo;t have such comments. It is worth noting that for learning and practicing purposes it is a good idea to name these sections explicitly in our tests - this develops a habit of recognizing which part of the test should belong to which section. Also, the formula Act -> Arrange -> Assert makes it easier to come up with the test when we lack deep experience in testing, or with the particular testing framework, or an environment.</p>

<p>Going a bit back to our user story scenarios: have you noticed the connection between &ldquo;Arrange, Act and Assert&rdquo; and &ldquo;Given-When-Then&rdquo;? Arrange part of the test corresponds to the Given part of the scenario, Act part of the test corresponds to the When part of the scenario, and Assert part of the test corresponds to the Then part of the scenario. Let&rsquo;s see it on of our previous example scenarios:</p>

<div class="next-table-is-top-aligned"></div>


<table>
<thead>
<tr>
<th>Test Section</th>
<th>Scenario Step</th>
</tr>
</thead>
<tbody>
<tr>
<td><hr></td>
<td><hr></td>
</tr>
<tr>
<td>ARRANGE</td>
<td><strong>Given</strong> User with email ‘john@example.org’ and password ‘welcome’ exists<br><strong>And</strong> I am at the login page</td>
</tr>
<tr>
<td><br></td>
<td><br></td>
</tr>
<tr>
<td>ACT</td>
<td><strong>When</strong> I enter ‘john@example.org’ in the email field<br><strong>And</strong> I enter ‘welcome’ in the password field<br><strong>And</strong> I click on the submit button</td>
</tr>
<tr>
<td><br></td>
<td><br></td>
</tr>
<tr>
<td>ASSERT</td>
<td><strong>Then</strong> I see the profile page<br><strong>And</strong> I see my name as the title of the profile page</td>
</tr>
</tbody>
</table>


<h3>Exercises</h3>

<ol>
<li>Write tests and implement functions on <code>Arithmetics</code> module: <code>subtract</code>, <code>multiply</code> and <code>divide</code>.</li>
<li>Inline Arrange, Act and Assert in a one-liner. Can you still recognize implicit Arrange, Act and Assert sections in that one line? Is it more or less readable? Is there a middle ground between two versions? Why would you choose one or the other?</li>
<li>Classify parts of the free-form story for the user log in from before as Arrange, Act, and Assert. Was it easier, than classifying formal Given-When-Then form? Was it harder? Or maybe the same? How would it be if you never saw Given-When-Then version of that free-form story?</li>
</ol>


<h2>Writing our First End-to-End Test</h2>

<p>Now that we know approximately, how to arrange the steps of our scenario into the test, let&rsquo;s give it a shot. We will start by creating a new test file for our login feature called <code>LoginFeatureSpec.js</code>. Don&rsquo;t forget to put an appropriate script tag in the <code>SpecRunner.html</code>. We will start by writing the skeleton of our test suite: <code>describe</code> and <code>it</code> inside of it. Next, we will put scenario steps as comments to our test, and we will split them into three sections: Arrange, Act, and Assert. It will look like this:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="c1">// spec/LoginFeatureSpec.js</span>
</span><span class='line'>
</span><span class='line'><span class="nx">describe</span><span class="p">(</span><span class="s2">&quot;Login Feature&quot;</span><span class="p">,</span> <span class="kd">function</span> <span class="p">()</span> <span class="p">{</span>
</span><span class='line'>
</span><span class='line'>  <span class="nx">it</span><span class="p">(</span><span class="s2">&quot;allows to login with correct credentials&quot;</span><span class="p">,</span> <span class="kd">function</span> <span class="p">()</span> <span class="p">{</span>
</span><span class='line'>    <span class="c1">// ARRANGE</span>
</span><span class='line'>    <span class="c1">// Given User with email ‘john@example.org’ and password ‘welcome’ exists</span>
</span><span class='line'>    <span class="c1">// And I am at the login page</span>
</span><span class='line'>
</span><span class='line'>    <span class="c1">// ACT</span>
</span><span class='line'>    <span class="c1">// When I enter ‘john@example.org’ in the email field</span>
</span><span class='line'>    <span class="c1">// And I enter ‘welcome’ in the password field</span>
</span><span class='line'>    <span class="c1">// And I click on the submit button</span>
</span><span class='line'>
</span><span class='line'>    <span class="c1">// ASSERT</span>
</span><span class='line'>    <span class="c1">// Then I see the profile page</span>
</span><span class='line'>    <span class="c1">// And I see my name as the title of the profile page</span>
</span><span class='line'>  <span class="p">});</span>
</span><span class='line'>
</span><span class='line'><span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>


<p>Next step would be to change the first <strong>Given</strong> comment to the function call. We should give a good readable name to that function. One straightforward option would be <code>givenUserExists(email, password).</code> Another good option is <code>addUser({email: email, password: password})</code>. While they are not that different, I prefer <code>addUser</code> for its higher conceptual flexibility - we will likely need that function in some different scenario step in the future. While I prefer that, we should not do that yet, because we might never need the function like that, and <code>givenUserExists</code> will do us more good right now since it resembles the scenario step so much. When we need this flexibility, we&rsquo;ll perform a refactoring. So for now, let&rsquo;s create an empty function with that name in a new file <code>spec/FeatureSteps.js</code> and load this file from our <code>SpecRunner.html</code>.</p>

<p>This empty function, on its own, doesn&rsquo;t do us much good because all our tests will pass. If we continue replacing our steps in comments with such functions, we will end up with one big failure at the Assert section, and we will have to write a lot of code at once to fix that. To drive ourselves to implement the function <code>givenUserExists</code> properly right now, we should write an assertion right after the call. This assertion is not part of Assert section - it is a part of test-driving the functionality of our feature steps. A good assertion here will be to ask our user storage mechanism if such user exists right after we created that user. Also, it would be a good idea to check that user does not exist, before we created it. Also, we will extract variables <code>email</code> and <code>password</code> because we have to repeat them all over the place already. Let&rsquo;s see how it will look like:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="c1">// spec/LoginFeatureSpec.js</span>
</span><span class='line'>
</span><span class='line'><span class="nx">describe</span><span class="p">(</span><span class="s2">&quot;Login Feature&quot;</span><span class="p">,</span> <span class="kd">function</span> <span class="p">()</span> <span class="p">{</span>
</span><span class='line'>
</span><span class='line'>  <span class="nx">it</span><span class="p">(</span><span class="s2">&quot;allows to login with correct credentials&quot;</span><span class="p">,</span> <span class="kd">function</span> <span class="p">()</span> <span class="p">{</span>
</span><span class='line'>    <span class="c1">// ARRANGE</span>
</span><span class='line'>
</span><span class='line'>    <span class="c1">// Given User with email ‘john@example.org’ and password ‘welcome’ exists</span>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">email</span> <span class="o">=</span> <span class="s2">&quot;john@example.org&quot;</span><span class="p">;</span>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">password</span> <span class="o">=</span> <span class="s2">&quot;welcome&quot;</span><span class="p">;</span>
</span><span class='line'>    <span class="nx">expect</span><span class="p">(</span><span class="nx">Users</span><span class="p">.</span><span class="nx">exists</span><span class="p">(</span><span class="nx">email</span><span class="p">,</span> <span class="nx">password</span><span class="p">)).</span><span class="nx">toEqual</span><span class="p">(</span><span class="kc">false</span><span class="p">);</span>
</span><span class='line'>    <span class="nx">givenUserExists</span><span class="p">(</span><span class="nx">email</span><span class="p">,</span> <span class="nx">password</span><span class="p">);</span>
</span><span class='line'>    <span class="nx">expect</span><span class="p">(</span><span class="nx">Users</span><span class="p">.</span><span class="nx">exists</span><span class="p">(</span><span class="nx">email</span><span class="p">,</span> <span class="nx">password</span><span class="p">)).</span><span class="nx">toEqual</span><span class="p">(</span><span class="kc">true</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>    <span class="c1">// ...</span>
</span><span class='line'>  <span class="p">});</span>
</span><span class='line'>
</span><span class='line'><span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>


<p>When we run our tests, the breadcrumbs of test failures will drive us to create this basic functionality. First, we will create <code>Users.js</code> with empty <code>Users</code> module and import it from <code>SpecRunner.html</code>. Then, next failure will drive us to add method <code>exists(email, password)</code> on <code>Users</code> module, that will always return <code>false</code>. Next, make function <code>givenUserExists(email, password)</code> call <code>Users.add(email, password)</code>, which in turn will make us create a function <code>Users.add(email, password)</code>, that will store email-password pair to the list of users in the memory. And, finally, make <code>Users.exists</code> to search for the email-password pair in that in-memory list. And finally, our test will pass. Let&rsquo;s take a look at how these steps will look in our code:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
<span class='line-number'>37</span>
<span class='line-number'>38</span>
<span class='line-number'>39</span>
<span class='line-number'>40</span>
<span class='line-number'>41</span>
<span class='line-number'>42</span>
<span class='line-number'>43</span>
<span class='line-number'>44</span>
<span class='line-number'>45</span>
<span class='line-number'>46</span>
<span class='line-number'>47</span>
<span class='line-number'>48</span>
<span class='line-number'>49</span>
<span class='line-number'>50</span>
<span class='line-number'>51</span>
<span class='line-number'>52</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="c1">// =&gt; Error: Users is undefined</span>
</span><span class='line'><span class="c1">// in src/Users.js:</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">Users</span> <span class="o">=</span> <span class="p">{};</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// =&gt; Error: Users.exists is not a function</span>
</span><span class='line'><span class="c1">// in src/Users.js:</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">Users</span> <span class="o">=</span> <span class="p">{</span>
</span><span class='line'>  <span class="nx">exists</span><span class="o">:</span> <span class="kd">function</span> <span class="p">(</span><span class="nx">email</span><span class="p">,</span> <span class="nx">password</span><span class="p">)</span> <span class="p">{}</span>
</span><span class='line'><span class="p">};</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// =&gt; Error: expected undefined to equal false</span>
</span><span class='line'><span class="c1">// in src/Users.js:</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">Users</span> <span class="o">=</span> <span class="p">{</span>
</span><span class='line'>  <span class="nx">exists</span><span class="o">:</span> <span class="kd">function</span> <span class="p">(</span><span class="nx">email</span><span class="p">,</span> <span class="nx">password</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">return</span> <span class="kc">false</span><span class="p">;</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'><span class="p">};</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// =&gt; Error: expected false to equal true</span>
</span><span class='line'><span class="c1">// in the (second assertion)</span>
</span><span class='line'><span class="c1">// in spec/FeatureSteps.js:</span>
</span><span class='line'><span class="kd">function</span> <span class="nx">givenUserExists</span><span class="p">(</span><span class="nx">email</span><span class="p">,</span> <span class="nx">password</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>  <span class="nx">Users</span><span class="p">.</span><span class="nx">add</span><span class="p">(</span><span class="nx">email</span><span class="p">,</span> <span class="nx">password</span><span class="p">);</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// =&gt; Error: Users.add is not a function</span>
</span><span class='line'><span class="c1">// in src/Users.js:</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">Users</span> <span class="o">=</span> <span class="p">{</span>
</span><span class='line'>  <span class="nx">users</span><span class="o">:</span> <span class="p">[],</span>
</span><span class='line'>
</span><span class='line'>  <span class="nx">exists</span><span class="o">:</span> <span class="kd">function</span> <span class="p">(</span><span class="nx">email</span><span class="p">,</span> <span class="nx">password</span><span class="p">)</span> <span class="p">{</span> <span class="p">...</span> <span class="p">},</span>
</span><span class='line'>
</span><span class='line'>  <span class="nx">add</span><span class="o">:</span> <span class="kd">function</span> <span class="p">(</span><span class="nx">email</span><span class="p">,</span> <span class="nx">password</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">this</span><span class="p">.</span><span class="nx">users</span><span class="p">.</span><span class="nx">push</span><span class="p">({</span><span class="nx">email</span><span class="o">:</span> <span class="nx">email</span><span class="p">,</span> <span class="nx">password</span><span class="o">:</span> <span class="nx">password</span><span class="p">});</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// this still fails with:</span>
</span><span class='line'><span class="c1">// =&gt; Error: expected false to equal true</span>
</span><span class='line'><span class="c1">// because we need to implement Users.exists &quot;properly&quot;</span>
</span><span class='line'><span class="c1">// in src/Users.js:</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">Users</span> <span class="o">=</span> <span class="p">{</span>
</span><span class='line'>  <span class="nx">users</span><span class="o">:</span> <span class="p">[],</span>
</span><span class='line'>
</span><span class='line'>  <span class="nx">exists</span><span class="o">:</span> <span class="kd">function</span> <span class="p">(</span><span class="nx">email</span><span class="p">,</span> <span class="nx">password</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">return</span> <span class="k">this</span><span class="p">.</span><span class="nx">users</span><span class="p">.</span><span class="nx">length</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">;</span>
</span><span class='line'>  <span class="p">},</span>
</span><span class='line'>
</span><span class='line'>  <span class="nx">add</span><span class="o">:</span> <span class="kd">function</span> <span class="p">(</span><span class="nx">email</span><span class="p">,</span> <span class="nx">password</span><span class="p">)</span> <span class="p">{</span> <span class="p">...</span> <span class="p">}</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// =&gt; All tests PASS</span>
</span></code></pre></td></tr></table></div></figure>


<p>It is funny, how simple <code>Users.exists(email, password)</code> function is. It verifies that we have at least one user. While this is not a correct code, this is good enough for our current test. As we know that this code is not entirely correct, we need to remember to write the test(s) to prove it incorrect, so that we can make it proper with confidence. Since we want first to finish the current test, we should add a to-do list item to write such test. We have two edge cases here that will not work with our implementation: when we have only one user in the system and the credentials we provided do not match and when we have multiple users in the system, and we provide correct credentials for the second one:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="nx">xdescribe</span><span class="p">(</span><span class="s2">&quot;when user has different credentials&quot;</span><span class="p">,</span> <span class="kd">function</span> <span class="p">()</span> <span class="p">{</span>
</span><span class='line'>  <span class="nx">it</span><span class="p">(</span><span class="s2">&quot;does not allow to login with wrong credentials&quot;</span><span class="p">,</span> <span class="kd">function</span> <span class="p">()</span> <span class="p">{</span>
</span><span class='line'>
</span><span class='line'>  <span class="p">});</span>
</span><span class='line'><span class="p">});</span>
</span><span class='line'>
</span><span class='line'><span class="nx">xdescribe</span><span class="p">(</span><span class="s2">&quot;when there are more than one user&quot;</span><span class="p">,</span> <span class="kd">function</span> <span class="p">()</span> <span class="p">{</span>
</span><span class='line'>  <span class="nx">it</span><span class="p">(</span><span class="s2">&quot;allows to login with correct credentials&quot;</span><span class="p">,</span> <span class="kd">function</span> <span class="p">()</span> <span class="p">{</span>
</span><span class='line'>
</span><span class='line'>  <span class="p">});</span>
</span><span class='line'><span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>


<p>Have you noticed <code>xdescribe</code>? It is a different form of the <code>describe</code>, that allows us to mark the whole context as pending. It won&rsquo;t run the tests inside, and it will mark them as pending in the test run report. That is the ultimate way to maintain a Test-Driven TODO List. As we test-drive our code, we will find more of these. In the report they look like this:</p>

<p><img src="http://www.tddfellow.com/images/learning-tdd-with-js/jasmine-e2e-pending-tests.png" alt="pending jasmine tests" /></p>

<p>Let&rsquo;s finish continue implementing our steps. The comment <code>And I am at the login page</code> transparently becomes a function <code>givenIAmAtTheLoginPage()</code>. As we already have seen, it doesn&rsquo;t do us any good just to replace the comment with a function call that does nothing - so we should surround it with proper assertions. We know that login page should have some text input for email and another password field for password, and we will need a button to confirm user&rsquo;s intent to log in. Also, because we are developing a single page application, we would need some container for the currently active page. Let&rsquo;s say we need these things:</p>

<ul>
<li>Initially, we will have only one container with <code>id="page"</code> and no content. We probably ought to define it in our HTML file.</li>
<li>When we render our login page, we should have:

<ul>
<li>email text input field with <code>id="email"</code>,</li>
<li>password input field with <code>id="password"</code>,</li>
<li>and button with <code>id="do_login"</code>.</li>
</ul>
</li>
</ul>


<p>Now that we have spelt this out, it is fairly straightforward to write assertions surrounding the <code>givenIAmAtTheLoginPage()</code> call:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="c1">// Initially, we will have only one container with `id=&quot;page&quot;`</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">container</span> <span class="o">=</span> <span class="nb">document</span><span class="p">.</span><span class="nx">querySelector</span><span class="p">(</span><span class="s2">&quot;#page&quot;</span><span class="p">);</span>
</span><span class='line'><span class="nx">expect</span><span class="p">(</span><span class="nx">container</span><span class="p">).</span><span class="nx">not</span><span class="p">.</span><span class="nx">toEqual</span><span class="p">(</span><span class="kc">null</span><span class="p">);</span>
</span><span class='line'><span class="c1">// and no content</span>
</span><span class='line'><span class="nx">expect</span><span class="p">(</span><span class="nx">container</span><span class="p">.</span><span class="nx">innerHTML</span><span class="p">).</span><span class="nx">toEqual</span><span class="p">(</span><span class="s2">&quot;&quot;</span><span class="p">);</span>
</span></code></pre></td></tr></table></div></figure>


<p>That fails because we don&rsquo;t have such element in our HTML. We need to create it both in our <code>SpecRunner.html</code>. Also, now it will be important to move all our <code>&lt;script&gt;</code> tags from the <code>&lt;head&gt;</code> to the <code>&lt;body&gt;</code> below the container that we have just created. <code>SpecRunner.html</code> should look this way after that:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
</pre></td><td class='code'><pre><code class='html'><span class='line'><span class="cp">&lt;!DOCTYPE html&gt;</span>
</span><span class='line'><span class="nt">&lt;html&gt;</span>
</span><span class='line'><span class="nt">&lt;head&gt;</span>
</span><span class='line'>    <span class="nt">&lt;meta</span> <span class="na">charset=</span><span class="s">&quot;utf-8&quot;</span><span class="nt">&gt;</span>
</span><span class='line'>    <span class="nt">&lt;title&gt;</span>Jasmine Spec Runner v2.5.2<span class="nt">&lt;/title&gt;</span>
</span><span class='line'>
</span><span class='line'>    <span class="nt">&lt;link</span> <span class="na">rel=</span><span class="s">&quot;shortcut icon&quot;</span> <span class="na">type=</span><span class="s">&quot;image/png&quot;</span> <span class="na">href=</span><span class="s">&quot;lib/jasmine-2.5.2/jasmine_favicon.png&quot;</span><span class="nt">&gt;</span>
</span><span class='line'>    <span class="nt">&lt;link</span> <span class="na">rel=</span><span class="s">&quot;stylesheet&quot;</span> <span class="na">href=</span><span class="s">&quot;lib/jasmine-2.5.2/jasmine.css&quot;</span><span class="nt">&gt;</span>
</span><span class='line'><span class="nt">&lt;/head&gt;</span>
</span><span class='line'>
</span><span class='line'><span class="nt">&lt;body&gt;</span>
</span><span class='line'>
</span><span class='line'>    <span class="nt">&lt;div</span> <span class="na">id=</span><span class="s">&quot;page&quot;</span><span class="nt">&gt;&lt;/div&gt;</span>
</span><span class='line'>
</span><span class='line'>    <span class="nt">&lt;script </span><span class="na">src=</span><span class="s">&quot;lib/jasmine-2.5.2/jasmine.js&quot;</span><span class="nt">&gt;&lt;/script&gt;</span>
</span><span class='line'>    <span class="nt">&lt;script </span><span class="na">src=</span><span class="s">&quot;lib/jasmine-2.5.2/jasmine-html.js&quot;</span><span class="nt">&gt;&lt;/script&gt;</span>
</span><span class='line'>    <span class="nt">&lt;script </span><span class="na">src=</span><span class="s">&quot;lib/jasmine-2.5.2/boot.js&quot;</span><span class="nt">&gt;&lt;/script&gt;</span>
</span><span class='line'>
</span><span class='line'>    <span class="c">&lt;!-- include source files here... --&gt;</span>
</span><span class='line'>    <span class="nt">&lt;script </span><span class="na">src=</span><span class="s">&quot;src/Arithmetics.js&quot;</span><span class="nt">&gt;&lt;/script&gt;</span>
</span><span class='line'>    <span class="nt">&lt;script </span><span class="na">src=</span><span class="s">&quot;src/Users.js&quot;</span><span class="nt">&gt;&lt;/script&gt;</span>
</span><span class='line'>
</span><span class='line'>    <span class="c">&lt;!-- include spec files here... --&gt;</span>
</span><span class='line'>    <span class="nt">&lt;script </span><span class="na">src=</span><span class="s">&quot;spec/JasmineWorksSpec.js&quot;</span><span class="nt">&gt;&lt;/script&gt;</span>
</span><span class='line'>    <span class="nt">&lt;script </span><span class="na">src=</span><span class="s">&quot;spec/ArithmeticsSpec.js&quot;</span><span class="nt">&gt;&lt;/script&gt;</span>
</span><span class='line'>    <span class="nt">&lt;script </span><span class="na">src=</span><span class="s">&quot;spec/FeatureSteps.js&quot;</span><span class="nt">&gt;&lt;/script&gt;</span>
</span><span class='line'>    <span class="nt">&lt;script </span><span class="na">src=</span><span class="s">&quot;spec/LoginFeatureSpec.js&quot;</span><span class="nt">&gt;&lt;/script&gt;</span>
</span><span class='line'>
</span><span class='line'><span class="nt">&lt;/body&gt;</span>
</span><span class='line'><span class="nt">&lt;/html&gt;</span>
</span></code></pre></td></tr></table></div></figure>


<p>Now, our next failure is that <code>givenIAmAtTheLoginPage()</code> function is not defined. We can define it as empty function in our <code>spec/FeatureSteps.js</code> file for now. This will turn our tests green again. We still haven&rsquo;t made our assertions about the state of the UI after the call to <code>givenIAmAtTheLoginPage</code> - let&rsquo;s do this now:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="kd">var</span> <span class="nx">emailInput</span> <span class="o">=</span> <span class="nx">container</span><span class="p">.</span><span class="nx">querySelector</span><span class="p">(</span><span class="s2">&quot;#email&quot;</span><span class="p">);</span>
</span><span class='line'><span class="nx">expect</span><span class="p">(</span><span class="nx">emailInput</span><span class="p">.</span><span class="nx">tagName</span><span class="p">).</span><span class="nx">toEqual</span><span class="p">(</span><span class="s2">&quot;input&quot;</span><span class="p">);</span>
</span><span class='line'><span class="nx">expect</span><span class="p">(</span><span class="nx">emailInput</span><span class="p">.</span><span class="nx">type</span><span class="p">).</span><span class="nx">toEqual</span><span class="p">(</span><span class="s2">&quot;email&quot;</span><span class="p">);</span>
</span></code></pre></td></tr></table></div></figure>


<p>That fails with the error <code>Cannot read property tagName of null</code>, which means that we don&rsquo;t have <code>#email</code> element inside of the <code>#page</code> container. Simplest thing to do would be to add that element to the <code>#page</code> container in our <code>SpecRunner.html</code>. And it won&rsquo;t work! Because we have an assertion that verifies, that before calling to the <code>givenIAmAtTheLoginPage</code> we do not have anything in the <code>#page</code> container. Now we have to do something useful in the function <code>givenIAmAtTheLoginPage</code>. For example, we can call <code>LoginPage.render()</code>. Which does not exist yet and we will need to create it in the file <code>src/LoginPage.js</code> and load it from our <code>SpecRunner.html</code>. To fix current failure we will need to create a <code>#email</code> element there and append it to our <code>#page</code> container:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="c1">// spec/FeatureSteps.js</span>
</span><span class='line'><span class="kd">function</span> <span class="nx">givenIAmAtTheLoginPage</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>  <span class="nx">LoginPage</span><span class="p">.</span><span class="nx">render</span><span class="p">();</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// src/LoginPage.js</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">LoginPage</span> <span class="o">=</span> <span class="p">{</span>
</span><span class='line'>  <span class="nx">render</span><span class="o">:</span> <span class="kd">function</span> <span class="p">()</span> <span class="p">{</span>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">emailInput</span> <span class="o">=</span> <span class="nb">document</span><span class="p">.</span><span class="nx">createElement</span><span class="p">(</span><span class="s2">&quot;div&quot;</span><span class="p">);</span>
</span><span class='line'>    <span class="nx">emailInput</span><span class="p">.</span><span class="nx">id</span> <span class="o">=</span> <span class="s2">&quot;email&quot;</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">container</span> <span class="o">=</span> <span class="nb">document</span><span class="p">.</span><span class="nx">querySelector</span><span class="p">(</span><span class="s2">&quot;#page&quot;</span><span class="p">);</span>
</span><span class='line'>    <span class="nx">container</span><span class="p">.</span><span class="nx">appendChild</span><span class="p">(</span><span class="nx">emailInput</span><span class="p">);</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'><span class="p">};</span>
</span></code></pre></td></tr></table></div></figure>


<p>That makes the current test failure go away, but we have two more: <code>Expected 'DIV' to equal 'input'.</code> and <code>Expected undefined to equal 'email'.</code>. To make these pass, we would need to change <code>document.createElement(...)</code> call to use <code>input</code> tag name and also we will need to set the input type to <code>email</code>. And as we see, the tag name stored in <code>emailInput.tagName</code> is all-caps, so we will have to fix our assertion also to expect that:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="c1">// first we&#39;ll fix the assertion:</span>
</span><span class='line'><span class="c1">// in spec/LoginFeatureSpec.js</span>
</span><span class='line'><span class="nx">expect</span><span class="p">(</span><span class="nx">emailInput</span><span class="p">.</span><span class="nx">tagName</span><span class="p">).</span><span class="nx">toEqual</span><span class="p">(</span><span class="s2">&quot;INPUT&quot;</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// and then we will fix the emailInput creation:</span>
</span><span class='line'><span class="c1">// in src/LoginPage.js</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">emailInput</span> <span class="o">=</span> <span class="nb">document</span><span class="p">.</span><span class="nx">createElement</span><span class="p">(</span><span class="s2">&quot;input&quot;</span><span class="p">);</span>
</span><span class='line'><span class="nx">emailInput</span><span class="p">.</span><span class="nx">id</span> <span class="o">=</span> <span class="s2">&quot;email&quot;</span><span class="p">;</span>
</span><span class='line'><span class="nx">emailInput</span><span class="p">.</span><span class="nx">type</span> <span class="o">=</span> <span class="s2">&quot;email&quot;</span><span class="p">;</span>
</span></code></pre></td></tr></table></div></figure>


<p>And if we run our tests, they all pass. Great! We should now do the same for our password input field and the login button:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="c1">// in spec/LoginFeatureSpec.js</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">passwordInput</span> <span class="o">=</span> <span class="nx">container</span><span class="p">.</span><span class="nx">querySelector</span><span class="p">(</span><span class="s2">&quot;#password&quot;</span><span class="p">);</span>
</span><span class='line'><span class="nx">expect</span><span class="p">(</span><span class="nx">passwordInput</span><span class="p">.</span><span class="nx">tagName</span><span class="p">).</span><span class="nx">toEqual</span><span class="p">(</span><span class="s2">&quot;INPUT&quot;</span><span class="p">);</span>
</span><span class='line'><span class="nx">expect</span><span class="p">(</span><span class="nx">passwordInput</span><span class="p">.</span><span class="nx">type</span><span class="p">).</span><span class="nx">toEqual</span><span class="p">(</span><span class="s2">&quot;password&quot;</span><span class="p">);</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">loginButton</span> <span class="o">=</span> <span class="nx">container</span><span class="p">.</span><span class="nx">querySelector</span><span class="p">(</span><span class="s2">&quot;#do_login&quot;</span><span class="p">);</span>
</span><span class='line'><span class="nx">expect</span><span class="p">(</span><span class="nx">loginButton</span><span class="p">.</span><span class="nx">tagName</span><span class="p">).</span><span class="nx">toEqual</span><span class="p">(</span><span class="s2">&quot;BUTTON&quot;</span><span class="p">);</span>
</span><span class='line'><span class="nx">expect</span><span class="p">(</span><span class="nx">loginButton</span><span class="p">.</span><span class="nx">textContent</span><span class="p">).</span><span class="nx">toEqual</span><span class="p">(</span><span class="s2">&quot;Login&quot;</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// in src/LoginPage.js</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">passwordInput</span> <span class="o">=</span> <span class="nb">document</span><span class="p">.</span><span class="nx">createElement</span><span class="p">(</span><span class="s2">&quot;input&quot;</span><span class="p">);</span>
</span><span class='line'><span class="nx">passwordInput</span><span class="p">.</span><span class="nx">id</span> <span class="o">=</span> <span class="s2">&quot;password&quot;</span><span class="p">;</span>
</span><span class='line'><span class="nx">passwordInput</span><span class="p">.</span><span class="nx">type</span> <span class="o">=</span> <span class="s2">&quot;password&quot;</span><span class="p">;</span>
</span><span class='line'><span class="nx">container</span><span class="p">.</span><span class="nx">appendChild</span><span class="p">(</span><span class="nx">passwordInput</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'><span class="kd">var</span> <span class="nx">loginButton</span> <span class="o">=</span> <span class="nb">document</span><span class="p">.</span><span class="nx">createElement</span><span class="p">(</span><span class="s2">&quot;button&quot;</span><span class="p">);</span>
</span><span class='line'><span class="nx">loginButton</span><span class="p">.</span><span class="nx">id</span> <span class="o">=</span> <span class="s2">&quot;do_login&quot;</span><span class="p">;</span>
</span><span class='line'><span class="nx">loginButton</span><span class="p">.</span><span class="nx">textContent</span> <span class="o">=</span> <span class="s2">&quot;Login&quot;</span><span class="p">;</span>
</span><span class='line'><span class="nx">container</span><span class="p">.</span><span class="nx">appendChild</span><span class="p">(</span><span class="nx">loginButton</span><span class="p">);</span>
</span></code></pre></td></tr></table></div></figure>


<p>And all tests pass again. Let&rsquo;s take another look at how our test looks like. It is quite complicated, and it has so much stuff, that is hugely detailed and precise, that it is not possible to see a user story scenario there anymore. One possible solution to that problem is to push the assertions that are related to the feature scenario step to the respective step functions. Now it looks much better. We should use the same concept for all our further steps. After refactoring test code looks like this:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
<span class='line-number'>37</span>
<span class='line-number'>38</span>
<span class='line-number'>39</span>
<span class='line-number'>40</span>
<span class='line-number'>41</span>
<span class='line-number'>42</span>
<span class='line-number'>43</span>
<span class='line-number'>44</span>
<span class='line-number'>45</span>
<span class='line-number'>46</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="c1">// in spec/LoginFeatureSpec.js</span>
</span><span class='line'><span class="nx">it</span><span class="p">(</span><span class="s2">&quot;allows to login with correct credentials&quot;</span><span class="p">,</span> <span class="kd">function</span> <span class="p">()</span> <span class="p">{</span>
</span><span class='line'>  <span class="c1">// ARRANGE</span>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">email</span> <span class="o">=</span> <span class="s2">&quot;john@example.org&quot;</span><span class="p">;</span>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">password</span> <span class="o">=</span> <span class="s2">&quot;welcome&quot;</span><span class="p">;</span>
</span><span class='line'>  <span class="nx">givenUserExists</span><span class="p">(</span><span class="nx">email</span><span class="p">,</span> <span class="nx">password</span><span class="p">);</span>
</span><span class='line'>  <span class="nx">givenIAmAtTheLoginPage</span><span class="p">();</span>
</span><span class='line'>
</span><span class='line'>  <span class="c1">// ACT</span>
</span><span class='line'>  <span class="c1">// When I enter ‘john@example.org’ in the email field</span>
</span><span class='line'>  <span class="c1">// And I enter ‘welcome’ in the password field</span>
</span><span class='line'>  <span class="c1">// And I click on the submit button</span>
</span><span class='line'>
</span><span class='line'>  <span class="c1">// ASSERT</span>
</span><span class='line'>  <span class="c1">// Then I see the profile page</span>
</span><span class='line'>  <span class="c1">// And I see my name as the title of the profile page</span>
</span><span class='line'><span class="p">});</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// in spec/FeatureSteps.js</span>
</span><span class='line'><span class="kd">function</span> <span class="nx">givenUserExists</span><span class="p">(</span><span class="nx">email</span><span class="p">,</span> <span class="nx">password</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="nx">expect</span><span class="p">(</span><span class="nx">Users</span><span class="p">.</span><span class="nx">exists</span><span class="p">(</span><span class="nx">email</span><span class="p">,</span> <span class="nx">password</span><span class="p">)).</span><span class="nx">toEqual</span><span class="p">(</span><span class="kc">false</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>    <span class="nx">Users</span><span class="p">.</span><span class="nx">add</span><span class="p">(</span><span class="nx">email</span><span class="p">,</span> <span class="nx">password</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>    <span class="nx">expect</span><span class="p">(</span><span class="nx">Users</span><span class="p">.</span><span class="nx">exists</span><span class="p">(</span><span class="nx">email</span><span class="p">,</span> <span class="nx">password</span><span class="p">)).</span><span class="nx">toEqual</span><span class="p">(</span><span class="kc">true</span><span class="p">);</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="kd">function</span> <span class="nx">givenIAmAtTheLoginPage</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">container</span> <span class="o">=</span> <span class="nb">document</span><span class="p">.</span><span class="nx">querySelector</span><span class="p">(</span><span class="s2">&quot;#page&quot;</span><span class="p">);</span>
</span><span class='line'>    <span class="nx">expect</span><span class="p">(</span><span class="nx">container</span><span class="p">).</span><span class="nx">not</span><span class="p">.</span><span class="nx">toEqual</span><span class="p">(</span><span class="kc">null</span><span class="p">);</span>
</span><span class='line'>    <span class="nx">expect</span><span class="p">(</span><span class="nx">container</span><span class="p">.</span><span class="nx">innerHTML</span><span class="p">).</span><span class="nx">toEqual</span><span class="p">(</span><span class="s2">&quot;&quot;</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>    <span class="nx">LoginPage</span><span class="p">.</span><span class="nx">render</span><span class="p">();</span>
</span><span class='line'>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">emailInput</span> <span class="o">=</span> <span class="nx">container</span><span class="p">.</span><span class="nx">querySelector</span><span class="p">(</span><span class="s2">&quot;#email&quot;</span><span class="p">);</span>
</span><span class='line'>    <span class="nx">expect</span><span class="p">(</span><span class="nx">emailInput</span><span class="p">.</span><span class="nx">tagName</span><span class="p">).</span><span class="nx">toEqual</span><span class="p">(</span><span class="s2">&quot;INPUT&quot;</span><span class="p">);</span>
</span><span class='line'>    <span class="nx">expect</span><span class="p">(</span><span class="nx">emailInput</span><span class="p">.</span><span class="nx">type</span><span class="p">).</span><span class="nx">toEqual</span><span class="p">(</span><span class="s2">&quot;email&quot;</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">passwordInput</span> <span class="o">=</span> <span class="nx">container</span><span class="p">.</span><span class="nx">querySelector</span><span class="p">(</span><span class="s2">&quot;#password&quot;</span><span class="p">);</span>
</span><span class='line'>    <span class="nx">expect</span><span class="p">(</span><span class="nx">passwordInput</span><span class="p">.</span><span class="nx">tagName</span><span class="p">).</span><span class="nx">toEqual</span><span class="p">(</span><span class="s2">&quot;INPUT&quot;</span><span class="p">);</span>
</span><span class='line'>    <span class="nx">expect</span><span class="p">(</span><span class="nx">passwordInput</span><span class="p">.</span><span class="nx">type</span><span class="p">).</span><span class="nx">toEqual</span><span class="p">(</span><span class="s2">&quot;password&quot;</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">loginButton</span> <span class="o">=</span> <span class="nx">container</span><span class="p">.</span><span class="nx">querySelector</span><span class="p">(</span><span class="s2">&quot;#do_login&quot;</span><span class="p">);</span>
</span><span class='line'>    <span class="nx">expect</span><span class="p">(</span><span class="nx">loginButton</span><span class="p">.</span><span class="nx">tagName</span><span class="p">).</span><span class="nx">toEqual</span><span class="p">(</span><span class="s2">&quot;BUTTON&quot;</span><span class="p">);</span>
</span><span class='line'>    <span class="nx">expect</span><span class="p">(</span><span class="nx">loginButton</span><span class="p">.</span><span class="nx">textContent</span><span class="p">).</span><span class="nx">toEqual</span><span class="p">(</span><span class="s2">&quot;Login&quot;</span><span class="p">);</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>Now, let&rsquo;s follow the same pattern for our Act section. First, we will deal with <code>When I enter ‘john@example.org’ in the email field</code>. This seems to be a call to a function <code>whenIEnterInTheField("#email", email)</code> - we will implement it using Javascript&rsquo;s APIs. We will do the same for the <code>And I enter ‘welcome’ in the password field</code>, which will use the same function <code>whenIEnterInTheField("#password", password).</code> Finally, we will implement <code>whenIClickOn("#do_login")</code> as a replacement for the comment <code>And I click on the submit button</code>. We will also sprinkle assertions inside of the steps to make sure that we are using the Javascript APIs correctly. The code will look like this:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="c1">// in spec/LoginFeatureSpec.js</span>
</span><span class='line'><span class="nx">it</span><span class="p">(</span><span class="s2">&quot;allows to login with correct credentials&quot;</span><span class="p">,</span> <span class="kd">function</span> <span class="p">()</span> <span class="p">{</span>
</span><span class='line'>    <span class="c1">// ARRANGE</span>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">email</span> <span class="o">=</span> <span class="s2">&quot;john@example.org&quot;</span><span class="p">;</span>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">password</span> <span class="o">=</span> <span class="s2">&quot;welcome&quot;</span><span class="p">;</span>
</span><span class='line'>    <span class="nx">givenUserExists</span><span class="p">(</span><span class="nx">email</span><span class="p">,</span> <span class="nx">password</span><span class="p">);</span>
</span><span class='line'>    <span class="nx">givenIAmAtTheLoginPage</span><span class="p">();</span>
</span><span class='line'>
</span><span class='line'>    <span class="c1">// ACT</span>
</span><span class='line'>    <span class="nx">whenIEnterInTheField</span><span class="p">(</span><span class="s2">&quot;#email&quot;</span><span class="p">,</span> <span class="nx">email</span><span class="p">);</span>
</span><span class='line'>    <span class="nx">whenIEnterInTheField</span><span class="p">(</span><span class="s2">&quot;#password&quot;</span><span class="p">,</span> <span class="nx">password</span><span class="p">);</span>
</span><span class='line'>    <span class="nx">whenIClickOn</span><span class="p">(</span><span class="s2">&quot;#do_login&quot;</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>    <span class="c1">// ASSERT</span>
</span><span class='line'>    <span class="c1">// Then I see the profile page</span>
</span><span class='line'>    <span class="c1">// And I see my name as the title of the profile page</span>
</span><span class='line'><span class="p">});</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// in spec/FeatureSteps.js</span>
</span><span class='line'><span class="kd">function</span> <span class="nx">whenIEnterInTheField</span><span class="p">(</span><span class="nx">selector</span><span class="p">,</span> <span class="nx">value</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">element</span> <span class="o">=</span> <span class="nb">document</span><span class="p">.</span><span class="nx">querySelector</span><span class="p">(</span><span class="nx">selector</span><span class="p">);</span>
</span><span class='line'>    <span class="nx">expect</span><span class="p">(</span><span class="nx">element</span><span class="p">).</span><span class="nx">not</span><span class="p">.</span><span class="nx">toEqual</span><span class="p">(</span><span class="kc">null</span><span class="p">);</span>
</span><span class='line'>    <span class="nx">expect</span><span class="p">(</span><span class="nx">element</span><span class="p">.</span><span class="nx">value</span><span class="p">).</span><span class="nx">toEqual</span><span class="p">(</span><span class="s2">&quot;&quot;</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>    <span class="nx">element</span><span class="p">.</span><span class="nx">value</span> <span class="o">=</span> <span class="nx">value</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">elementAfterChange</span> <span class="o">=</span> <span class="nb">document</span><span class="p">.</span><span class="nx">querySelector</span><span class="p">(</span><span class="nx">selector</span><span class="p">);</span>
</span><span class='line'>    <span class="nx">expect</span><span class="p">(</span><span class="nx">element</span><span class="p">.</span><span class="nx">value</span><span class="p">).</span><span class="nx">toEqual</span><span class="p">(</span><span class="nx">value</span><span class="p">);</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="kd">function</span> <span class="nx">whenIClickOn</span><span class="p">(</span><span class="nx">selector</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">element</span> <span class="o">=</span> <span class="nb">document</span><span class="p">.</span><span class="nx">querySelector</span><span class="p">(</span><span class="nx">selector</span><span class="p">);</span>
</span><span class='line'>    <span class="nx">expect</span><span class="p">(</span><span class="nx">element</span><span class="p">).</span><span class="nx">not</span><span class="p">.</span><span class="nx">toEqual</span><span class="p">(</span><span class="kc">null</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>    <span class="nx">element</span><span class="p">.</span><span class="nx">click</span><span class="p">();</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>Now comes the most interesting part of writing this feature test - Assert section. So far, Arrange and Act sections were driving us to create an infrastructure-like code of our application. Now, with Assert section we will have to implement more of our domain logic. Let&rsquo;s start with the <code>Then I see the profile page</code>. Let&rsquo;s try to figure our what that could mean:</p>

<ul>
<li>We no longer have a login page in our <code>#page</code> container.</li>
<li><code>#page</code> container should somehow indicate that we are on the <code>Profile</code> page:

<ul>
<li>could be achieved by adding a sub-container with <code>id="profile_page"</code> to it.</li>
</ul>
</li>
<li>We don&rsquo;t know much more about what the profile page is. What we do know is:

<ul>
<li>the profile page has a name of the user as the title of the page.</li>
</ul>
</li>
</ul>


<p>Interesting, so far, we didn&rsquo;t have a concept of the Name of the User. I guess it is time to create one in our arrange block, with all the changes and additional assertions in our feature steps that we have to do:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="c1">// in spec/LoginFeatureSpec.js</span>
</span><span class='line'><span class="c1">// ARRANGE</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">email</span> <span class="o">=</span> <span class="s2">&quot;john@example.org&quot;</span><span class="p">;</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">password</span> <span class="o">=</span> <span class="s2">&quot;welcome&quot;</span><span class="p">;</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">name</span> <span class="o">=</span> <span class="s2">&quot;John Smith&quot;</span><span class="p">;</span>
</span><span class='line'><span class="nx">givenUserExists</span><span class="p">(</span><span class="nx">email</span><span class="p">,</span> <span class="nx">password</span><span class="p">,</span> <span class="nx">name</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// in spec/FeatureSteps.js</span>
</span><span class='line'><span class="kd">function</span> <span class="nx">givenUserExists</span><span class="p">(</span><span class="nx">email</span><span class="p">,</span> <span class="nx">password</span><span class="p">,</span> <span class="nx">name</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>  <span class="nx">expect</span><span class="p">(</span><span class="nx">Users</span><span class="p">.</span><span class="nx">exists</span><span class="p">(</span><span class="nx">email</span><span class="p">,</span> <span class="nx">password</span><span class="p">)).</span><span class="nx">toEqual</span><span class="p">(</span><span class="kc">false</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>  <span class="nx">Users</span><span class="p">.</span><span class="nx">add</span><span class="p">(</span><span class="nx">email</span><span class="p">,</span> <span class="nx">password</span><span class="p">,</span> <span class="nx">name</span><span class="p">);</span>            <span class="c1">// &lt;=</span>
</span><span class='line'>
</span><span class='line'>  <span class="nx">expect</span><span class="p">(</span><span class="nx">Users</span><span class="p">.</span><span class="nx">exists</span><span class="p">(</span><span class="nx">email</span><span class="p">,</span> <span class="nx">password</span><span class="p">)).</span><span class="nx">toEqual</span><span class="p">(</span><span class="kc">true</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>  <span class="nx">expect</span><span class="p">(</span><span class="nx">Users</span><span class="p">.</span><span class="nx">nameOf</span><span class="p">(</span><span class="nx">email</span><span class="p">)).</span><span class="nx">toEqual</span><span class="p">(</span><span class="nx">name</span><span class="p">);</span>   <span class="c1">// &lt;=</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// also we need to add name field to the user data</span>
</span><span class='line'><span class="c1">// and implement nameOf(email) function</span>
</span><span class='line'><span class="c1">// in src/Users.js</span>
</span><span class='line'><span class="nx">add</span><span class="o">:</span> <span class="kd">function</span> <span class="p">(</span><span class="nx">email</span><span class="p">,</span> <span class="nx">password</span><span class="p">,</span> <span class="nx">name</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>  <span class="k">this</span><span class="p">.</span><span class="nx">users</span><span class="p">.</span><span class="nx">push</span><span class="p">({</span>
</span><span class='line'>    <span class="nx">email</span><span class="o">:</span> <span class="nx">email</span><span class="p">,</span>
</span><span class='line'>    <span class="nx">password</span><span class="o">:</span> <span class="nx">password</span><span class="p">,</span>
</span><span class='line'>    <span class="nx">name</span><span class="o">:</span> <span class="nx">name</span>
</span><span class='line'>  <span class="p">});</span>
</span><span class='line'><span class="p">},</span>
</span><span class='line'>
</span><span class='line'><span class="nx">nameOf</span><span class="o">:</span> <span class="kd">function</span> <span class="p">(</span><span class="nx">email</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>  <span class="k">return</span> <span class="k">this</span><span class="p">.</span><span class="nx">users</span><span class="p">[</span><span class="mi">0</span><span class="p">].</span><span class="nx">name</span><span class="p">;</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>And the tests will pass again. And now we have a tested concept of the name in our code. Tested - to the extent required for this test, where we have only one user in the system. Now we can replace the comment <code>Then I see the profile page</code> with the scenario step function call <code>thenISeeTheProfilePage()</code>. The implementation of it will verify that <code>#email</code>, <code>#password</code> and <code>#do_login</code> are no longer present on the page and it will verify that container <code>#page-profile</code> is present and it has <code>#title</code> element in it. Making it pass will require us to add a <code>click</code> event listener to the <code>loginButton</code> in the <code>LoginPage</code>, that will remove contents of the <code>#page</code> container and will call to <code>ProfilePage.render()</code> following the analogy of <code>LoginPage</code>. That drives us to create this module and its <code>render()</code> function. According to our next test failure, this function should create <code>#profile_page</code> sub-container in <code>#page</code> container, so we do that. Finally, we have one last failure, that drives us to create <code>#title</code> element in <code>ProfilePage.render()</code> function. And all tests are green again. Let&rsquo;s take a look at these changes:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
<span class='line-number'>37</span>
<span class='line-number'>38</span>
<span class='line-number'>39</span>
<span class='line-number'>40</span>
<span class='line-number'>41</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="c1">// in spec/LoginFeatureSpec.js</span>
</span><span class='line'><span class="c1">// ASSERT</span>
</span><span class='line'><span class="c1">// Then I see the profile page</span>
</span><span class='line'><span class="nx">thenISeeTheProfilePage</span><span class="p">();</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// in spec/FeatureSteps.js</span>
</span><span class='line'><span class="kd">function</span> <span class="nx">thenISeeTheProfilePage</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>  <span class="c1">// assert login page is gone</span>
</span><span class='line'>  <span class="nx">expect</span><span class="p">(</span><span class="nb">document</span><span class="p">.</span><span class="nx">querySelector</span><span class="p">(</span><span class="s2">&quot;#email&quot;</span><span class="p">)).</span><span class="nx">toEqual</span><span class="p">(</span><span class="kc">null</span><span class="p">);</span>
</span><span class='line'>  <span class="nx">expect</span><span class="p">(</span><span class="nb">document</span><span class="p">.</span><span class="nx">querySelector</span><span class="p">(</span><span class="s2">&quot;#password&quot;</span><span class="p">)).</span><span class="nx">toEqual</span><span class="p">(</span><span class="kc">null</span><span class="p">);</span>
</span><span class='line'>  <span class="nx">expect</span><span class="p">(</span><span class="nb">document</span><span class="p">.</span><span class="nx">querySelector</span><span class="p">(</span><span class="s2">&quot;#do_login&quot;</span><span class="p">)).</span><span class="nx">toEqual</span><span class="p">(</span><span class="kc">null</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>  <span class="c1">// assert profile page is present</span>
</span><span class='line'>  <span class="nx">expect</span><span class="p">(</span><span class="nb">document</span><span class="p">.</span><span class="nx">querySelector</span><span class="p">(</span><span class="s2">&quot;#page #profile_page&quot;</span><span class="p">)).</span><span class="nx">not</span><span class="p">.</span><span class="nx">toEqual</span><span class="p">(</span><span class="kc">null</span><span class="p">);</span>
</span><span class='line'>  <span class="nx">expect</span><span class="p">(</span><span class="nb">document</span><span class="p">.</span><span class="nx">querySelector</span><span class="p">(</span><span class="s2">&quot;#profile_page #title&quot;</span><span class="p">)).</span><span class="nx">not</span><span class="p">.</span><span class="nx">toEqual</span><span class="p">(</span><span class="kc">null</span><span class="p">);</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// in src/LoginPage.js at the end of render() function:</span>
</span><span class='line'><span class="nx">render</span><span class="o">:</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>  <span class="c1">// ...</span>
</span><span class='line'>
</span><span class='line'>  <span class="nx">loginButton</span><span class="p">.</span><span class="nx">addEventListener</span><span class="p">(</span><span class="s2">&quot;click&quot;</span><span class="p">,</span> <span class="nx">LoginPage</span><span class="p">.</span><span class="nx">onLogin</span><span class="p">);</span>
</span><span class='line'><span class="p">},</span>
</span><span class='line'>
</span><span class='line'><span class="nx">onLogin</span><span class="o">:</span> <span class="kd">function</span> <span class="p">()</span> <span class="p">{</span>
</span><span class='line'>  <span class="nx">container</span><span class="p">.</span><span class="nx">innerHTML</span> <span class="o">=</span> <span class="s2">&quot;&quot;</span><span class="p">;</span>
</span><span class='line'>  <span class="nx">ProfilePage</span><span class="p">.</span><span class="nx">render</span><span class="p">();</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// in src/ProfilePage.js</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">ProfilePage</span> <span class="o">=</span> <span class="p">{</span>
</span><span class='line'>  <span class="nx">render</span><span class="o">:</span> <span class="kd">function</span> <span class="p">()</span> <span class="p">{</span>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">profileContainer</span> <span class="o">=</span> <span class="nb">document</span><span class="p">.</span><span class="nx">createElement</span><span class="p">(</span><span class="s2">&quot;div&quot;</span><span class="p">);</span>
</span><span class='line'>    <span class="nx">profileContainer</span><span class="p">.</span><span class="nx">id</span> <span class="o">=</span> <span class="s2">&quot;profile_page&quot;</span><span class="p">;</span>
</span><span class='line'>    <span class="nx">container</span><span class="p">.</span><span class="nx">appendChild</span><span class="p">(</span><span class="nx">profileContainer</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">title</span> <span class="o">=</span> <span class="nb">document</span><span class="p">.</span><span class="nx">createElement</span><span class="p">(</span><span class="s2">&quot;h1&quot;</span><span class="p">);</span>
</span><span class='line'>    <span class="nx">title</span><span class="p">.</span><span class="nx">id</span> <span class="o">=</span> <span class="s2">&quot;title&quot;</span><span class="p">;</span>
</span><span class='line'>    <span class="nx">profileContainer</span><span class="p">.</span><span class="nx">appendChild</span><span class="p">(</span><span class="nx">title</span><span class="p">);</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'><span class="p">};</span>
</span></code></pre></td></tr></table></div></figure>


<p>At last, we can implement the last step - <code>And I see my name as the title of the profile page</code>. A good guess for the step name would be <code>thenISeeTextAt("#title", name)</code>. The function will simply select element <code>#title</code> and verify its <code>element.textContent</code>. As expected, it fails with the error <code>Expected '' to equal 'John Smith'</code> and we should fix that within the <code>ProfilePage.render()</code> function by assigning <code>title.textContent</code> to the <code>Users.currentUser().name</code>. This fails because we didn&rsquo;t define <code>Users.currentUser()</code> function and this is simple to do for our current test - just return the first user. After that all our tests pass. The code will look like this:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="c1">// in spec/LoginFeatureSpec.js</span>
</span><span class='line'><span class="nx">thenISeeTextAt</span><span class="p">(</span><span class="s2">&quot;#title&quot;</span><span class="p">,</span> <span class="nx">name</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// in spec/FeatureSteps.js</span>
</span><span class='line'><span class="kd">function</span> <span class="nx">thenISeeTextAt</span><span class="p">(</span><span class="nx">selector</span><span class="p">,</span> <span class="nx">text</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">element</span> <span class="o">=</span> <span class="nb">document</span><span class="p">.</span><span class="nx">querySelector</span><span class="p">(</span><span class="nx">selector</span><span class="p">);</span>
</span><span class='line'>  <span class="nx">expect</span><span class="p">(</span><span class="nx">element</span><span class="p">.</span><span class="nx">textContent</span><span class="p">).</span><span class="nx">toEqual</span><span class="p">(</span><span class="nx">text</span><span class="p">);</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// in src/ProfilePage.js</span>
</span><span class='line'><span class="nx">title</span><span class="p">.</span><span class="nx">textContent</span> <span class="o">=</span> <span class="nx">Users</span><span class="p">.</span><span class="nx">currentUser</span><span class="p">().</span><span class="nx">name</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// in src/Users.js</span>
</span><span class='line'><span class="nx">currentUser</span><span class="o">:</span> <span class="kd">function</span> <span class="p">()</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">return</span> <span class="k">this</span><span class="p">.</span><span class="nx">users</span><span class="p">[</span><span class="mi">0</span><span class="p">];</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>We have finally, implemented our first feature test. That was quite some work. Also, the functionality of <code>Users</code> module is way incomplete - we need to write more tests to cover different cases. That is how our test code and production code looks like:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="c1">// spec/LoginFeatureSpec.js</span>
</span><span class='line'><span class="nx">describe</span><span class="p">(</span><span class="s2">&quot;Login Feature&quot;</span><span class="p">,</span> <span class="kd">function</span> <span class="p">()</span> <span class="p">{</span>
</span><span class='line'>
</span><span class='line'>    <span class="nx">it</span><span class="p">(</span><span class="s2">&quot;allows to login with correct credentials&quot;</span><span class="p">,</span> <span class="kd">function</span> <span class="p">()</span> <span class="p">{</span>
</span><span class='line'>        <span class="c1">// ARRANGE</span>
</span><span class='line'>        <span class="kd">var</span> <span class="nx">email</span> <span class="o">=</span> <span class="s2">&quot;john@example.org&quot;</span><span class="p">;</span>
</span><span class='line'>        <span class="kd">var</span> <span class="nx">password</span> <span class="o">=</span> <span class="s2">&quot;welcome&quot;</span><span class="p">;</span>
</span><span class='line'>        <span class="kd">var</span> <span class="nx">name</span> <span class="o">=</span> <span class="s2">&quot;John Smith&quot;</span><span class="p">;</span>
</span><span class='line'>        <span class="nx">givenUserExists</span><span class="p">(</span><span class="nx">email</span><span class="p">,</span> <span class="nx">password</span><span class="p">,</span> <span class="nx">name</span><span class="p">);</span>
</span><span class='line'>        <span class="nx">givenIAmAtTheLoginPage</span><span class="p">();</span>
</span><span class='line'>
</span><span class='line'>        <span class="c1">// ACT</span>
</span><span class='line'>        <span class="nx">whenIEnterInTheField</span><span class="p">(</span><span class="s2">&quot;#email&quot;</span><span class="p">,</span> <span class="nx">email</span><span class="p">);</span>
</span><span class='line'>        <span class="nx">whenIEnterInTheField</span><span class="p">(</span><span class="s2">&quot;#password&quot;</span><span class="p">,</span> <span class="nx">password</span><span class="p">);</span>
</span><span class='line'>        <span class="nx">whenIClickOn</span><span class="p">(</span><span class="s2">&quot;#do_login&quot;</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>        <span class="c1">// ASSERT</span>
</span><span class='line'>        <span class="nx">thenISeeTheProfilePage</span><span class="p">();</span>
</span><span class='line'>        <span class="nx">thenISeeTextAt</span><span class="p">(</span><span class="s2">&quot;#title&quot;</span><span class="p">,</span> <span class="nx">name</span><span class="p">);</span>
</span><span class='line'>    <span class="p">});</span>
</span><span class='line'>
</span><span class='line'>    <span class="nx">xdescribe</span><span class="p">(</span><span class="s2">&quot;when user has different credentials&quot;</span><span class="p">,</span> <span class="kd">function</span> <span class="p">()</span> <span class="p">{</span>
</span><span class='line'>        <span class="nx">it</span><span class="p">(</span><span class="s2">&quot;does not allow to login with wrong credentials&quot;</span><span class="p">,</span> <span class="kd">function</span> <span class="p">()</span> <span class="p">{</span>
</span><span class='line'>
</span><span class='line'>        <span class="p">});</span>
</span><span class='line'>    <span class="p">});</span>
</span><span class='line'>
</span><span class='line'>    <span class="nx">xdescribe</span><span class="p">(</span><span class="s2">&quot;when there are more than one user&quot;</span><span class="p">,</span> <span class="kd">function</span> <span class="p">()</span> <span class="p">{</span>
</span><span class='line'>        <span class="nx">it</span><span class="p">(</span><span class="s2">&quot;allows to login with correct credentials&quot;</span><span class="p">,</span> <span class="kd">function</span> <span class="p">()</span> <span class="p">{</span>
</span><span class='line'>
</span><span class='line'>        <span class="p">});</span>
</span><span class='line'>    <span class="p">});</span>
</span><span class='line'>
</span><span class='line'><span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>




<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
<span class='line-number'>37</span>
<span class='line-number'>38</span>
<span class='line-number'>39</span>
<span class='line-number'>40</span>
<span class='line-number'>41</span>
<span class='line-number'>42</span>
<span class='line-number'>43</span>
<span class='line-number'>44</span>
<span class='line-number'>45</span>
<span class='line-number'>46</span>
<span class='line-number'>47</span>
<span class='line-number'>48</span>
<span class='line-number'>49</span>
<span class='line-number'>50</span>
<span class='line-number'>51</span>
<span class='line-number'>52</span>
<span class='line-number'>53</span>
<span class='line-number'>54</span>
<span class='line-number'>55</span>
<span class='line-number'>56</span>
<span class='line-number'>57</span>
<span class='line-number'>58</span>
<span class='line-number'>59</span>
<span class='line-number'>60</span>
<span class='line-number'>61</span>
<span class='line-number'>62</span>
<span class='line-number'>63</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="c1">// spec/FeatureSteps.js</span>
</span><span class='line'><span class="kd">function</span> <span class="nx">givenUserExists</span><span class="p">(</span><span class="nx">email</span><span class="p">,</span> <span class="nx">password</span><span class="p">,</span> <span class="nx">name</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="nx">expect</span><span class="p">(</span><span class="nx">Users</span><span class="p">.</span><span class="nx">exists</span><span class="p">(</span><span class="nx">email</span><span class="p">,</span> <span class="nx">password</span><span class="p">)).</span><span class="nx">toEqual</span><span class="p">(</span><span class="kc">false</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>    <span class="nx">Users</span><span class="p">.</span><span class="nx">add</span><span class="p">(</span><span class="nx">email</span><span class="p">,</span> <span class="nx">password</span><span class="p">,</span> <span class="nx">name</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>    <span class="nx">expect</span><span class="p">(</span><span class="nx">Users</span><span class="p">.</span><span class="nx">exists</span><span class="p">(</span><span class="nx">email</span><span class="p">,</span> <span class="nx">password</span><span class="p">)).</span><span class="nx">toEqual</span><span class="p">(</span><span class="kc">true</span><span class="p">);</span>
</span><span class='line'>    <span class="nx">expect</span><span class="p">(</span><span class="nx">Users</span><span class="p">.</span><span class="nx">nameOf</span><span class="p">(</span><span class="nx">email</span><span class="p">)).</span><span class="nx">toEqual</span><span class="p">(</span><span class="nx">name</span><span class="p">);</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="kd">function</span> <span class="nx">givenIAmAtTheLoginPage</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">container</span> <span class="o">=</span> <span class="nb">document</span><span class="p">.</span><span class="nx">querySelector</span><span class="p">(</span><span class="s2">&quot;#page&quot;</span><span class="p">);</span>
</span><span class='line'>    <span class="nx">expect</span><span class="p">(</span><span class="nx">container</span><span class="p">).</span><span class="nx">not</span><span class="p">.</span><span class="nx">toEqual</span><span class="p">(</span><span class="kc">null</span><span class="p">);</span>
</span><span class='line'>    <span class="nx">expect</span><span class="p">(</span><span class="nx">container</span><span class="p">.</span><span class="nx">innerHTML</span><span class="p">).</span><span class="nx">toEqual</span><span class="p">(</span><span class="s2">&quot;&quot;</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>    <span class="nx">LoginPage</span><span class="p">.</span><span class="nx">render</span><span class="p">();</span>
</span><span class='line'>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">emailInput</span> <span class="o">=</span> <span class="nx">container</span><span class="p">.</span><span class="nx">querySelector</span><span class="p">(</span><span class="s2">&quot;#email&quot;</span><span class="p">);</span>
</span><span class='line'>    <span class="nx">expect</span><span class="p">(</span><span class="nx">emailInput</span><span class="p">.</span><span class="nx">tagName</span><span class="p">).</span><span class="nx">toEqual</span><span class="p">(</span><span class="s2">&quot;INPUT&quot;</span><span class="p">);</span>
</span><span class='line'>    <span class="nx">expect</span><span class="p">(</span><span class="nx">emailInput</span><span class="p">.</span><span class="nx">type</span><span class="p">).</span><span class="nx">toEqual</span><span class="p">(</span><span class="s2">&quot;email&quot;</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">passwordInput</span> <span class="o">=</span> <span class="nx">container</span><span class="p">.</span><span class="nx">querySelector</span><span class="p">(</span><span class="s2">&quot;#password&quot;</span><span class="p">);</span>
</span><span class='line'>    <span class="nx">expect</span><span class="p">(</span><span class="nx">passwordInput</span><span class="p">.</span><span class="nx">tagName</span><span class="p">).</span><span class="nx">toEqual</span><span class="p">(</span><span class="s2">&quot;INPUT&quot;</span><span class="p">);</span>
</span><span class='line'>    <span class="nx">expect</span><span class="p">(</span><span class="nx">passwordInput</span><span class="p">.</span><span class="nx">type</span><span class="p">).</span><span class="nx">toEqual</span><span class="p">(</span><span class="s2">&quot;password&quot;</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">loginButton</span> <span class="o">=</span> <span class="nx">container</span><span class="p">.</span><span class="nx">querySelector</span><span class="p">(</span><span class="s2">&quot;#do_login&quot;</span><span class="p">);</span>
</span><span class='line'>    <span class="nx">expect</span><span class="p">(</span><span class="nx">loginButton</span><span class="p">.</span><span class="nx">tagName</span><span class="p">).</span><span class="nx">toEqual</span><span class="p">(</span><span class="s2">&quot;BUTTON&quot;</span><span class="p">);</span>
</span><span class='line'>    <span class="nx">expect</span><span class="p">(</span><span class="nx">loginButton</span><span class="p">.</span><span class="nx">textContent</span><span class="p">).</span><span class="nx">toEqual</span><span class="p">(</span><span class="s2">&quot;Login&quot;</span><span class="p">);</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="kd">function</span> <span class="nx">whenIEnterInTheField</span><span class="p">(</span><span class="nx">selector</span><span class="p">,</span> <span class="nx">value</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">element</span> <span class="o">=</span> <span class="nb">document</span><span class="p">.</span><span class="nx">querySelector</span><span class="p">(</span><span class="nx">selector</span><span class="p">);</span>
</span><span class='line'>    <span class="nx">expect</span><span class="p">(</span><span class="nx">element</span><span class="p">).</span><span class="nx">not</span><span class="p">.</span><span class="nx">toEqual</span><span class="p">(</span><span class="kc">null</span><span class="p">);</span>
</span><span class='line'>    <span class="nx">expect</span><span class="p">(</span><span class="nx">element</span><span class="p">.</span><span class="nx">value</span><span class="p">).</span><span class="nx">toEqual</span><span class="p">(</span><span class="s2">&quot;&quot;</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>    <span class="nx">element</span><span class="p">.</span><span class="nx">value</span> <span class="o">=</span> <span class="nx">value</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">elementAfterChange</span> <span class="o">=</span> <span class="nb">document</span><span class="p">.</span><span class="nx">querySelector</span><span class="p">(</span><span class="nx">selector</span><span class="p">);</span>
</span><span class='line'>    <span class="nx">expect</span><span class="p">(</span><span class="nx">element</span><span class="p">.</span><span class="nx">value</span><span class="p">).</span><span class="nx">toEqual</span><span class="p">(</span><span class="nx">value</span><span class="p">);</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="kd">function</span> <span class="nx">whenIClickOn</span><span class="p">(</span><span class="nx">selector</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">element</span> <span class="o">=</span> <span class="nb">document</span><span class="p">.</span><span class="nx">querySelector</span><span class="p">(</span><span class="nx">selector</span><span class="p">);</span>
</span><span class='line'>    <span class="nx">expect</span><span class="p">(</span><span class="nx">element</span><span class="p">).</span><span class="nx">not</span><span class="p">.</span><span class="nx">toEqual</span><span class="p">(</span><span class="kc">null</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>    <span class="nx">element</span><span class="p">.</span><span class="nx">click</span><span class="p">();</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="kd">function</span> <span class="nx">thenISeeTheProfilePage</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>    <span class="c1">// assert login page is gone</span>
</span><span class='line'>    <span class="nx">expect</span><span class="p">(</span><span class="nb">document</span><span class="p">.</span><span class="nx">querySelector</span><span class="p">(</span><span class="s2">&quot;#email&quot;</span><span class="p">)).</span><span class="nx">toEqual</span><span class="p">(</span><span class="kc">null</span><span class="p">);</span>
</span><span class='line'>    <span class="nx">expect</span><span class="p">(</span><span class="nb">document</span><span class="p">.</span><span class="nx">querySelector</span><span class="p">(</span><span class="s2">&quot;#password&quot;</span><span class="p">)).</span><span class="nx">toEqual</span><span class="p">(</span><span class="kc">null</span><span class="p">);</span>
</span><span class='line'>    <span class="nx">expect</span><span class="p">(</span><span class="nb">document</span><span class="p">.</span><span class="nx">querySelector</span><span class="p">(</span><span class="s2">&quot;#do_login&quot;</span><span class="p">)).</span><span class="nx">toEqual</span><span class="p">(</span><span class="kc">null</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>    <span class="c1">// assert profile page is present</span>
</span><span class='line'>    <span class="nx">expect</span><span class="p">(</span><span class="nb">document</span><span class="p">.</span><span class="nx">querySelector</span><span class="p">(</span><span class="s2">&quot;#page #profile_page&quot;</span><span class="p">)).</span><span class="nx">not</span><span class="p">.</span><span class="nx">toEqual</span><span class="p">(</span><span class="kc">null</span><span class="p">);</span>
</span><span class='line'>    <span class="nx">expect</span><span class="p">(</span><span class="nb">document</span><span class="p">.</span><span class="nx">querySelector</span><span class="p">(</span><span class="s2">&quot;#profile_page #title&quot;</span><span class="p">)).</span><span class="nx">not</span><span class="p">.</span><span class="nx">toEqual</span><span class="p">(</span><span class="kc">null</span><span class="p">);</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="kd">function</span> <span class="nx">thenISeeTextAt</span><span class="p">(</span><span class="nx">selector</span><span class="p">,</span> <span class="nx">text</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">element</span> <span class="o">=</span> <span class="nb">document</span><span class="p">.</span><span class="nx">querySelector</span><span class="p">(</span><span class="nx">selector</span><span class="p">);</span>
</span><span class='line'>    <span class="nx">expect</span><span class="p">(</span><span class="nx">element</span><span class="p">.</span><span class="nx">textContent</span><span class="p">).</span><span class="nx">toEqual</span><span class="p">(</span><span class="nx">text</span><span class="p">);</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>




<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="c1">// src/Users.js</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">Users</span> <span class="o">=</span> <span class="p">{</span>
</span><span class='line'>    <span class="nx">users</span><span class="o">:</span> <span class="p">[],</span>
</span><span class='line'>
</span><span class='line'>    <span class="nx">exists</span><span class="o">:</span> <span class="kd">function</span> <span class="p">(</span><span class="nx">email</span><span class="p">,</span> <span class="nx">password</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>        <span class="k">return</span> <span class="k">this</span><span class="p">.</span><span class="nx">users</span><span class="p">.</span><span class="nx">length</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">;</span>
</span><span class='line'>    <span class="p">},</span>
</span><span class='line'>
</span><span class='line'>    <span class="nx">add</span><span class="o">:</span> <span class="kd">function</span> <span class="p">(</span><span class="nx">email</span><span class="p">,</span> <span class="nx">password</span><span class="p">,</span> <span class="nx">name</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>        <span class="k">this</span><span class="p">.</span><span class="nx">users</span><span class="p">.</span><span class="nx">push</span><span class="p">({</span>
</span><span class='line'>            <span class="nx">email</span><span class="o">:</span> <span class="nx">email</span><span class="p">,</span>
</span><span class='line'>            <span class="nx">password</span><span class="o">:</span> <span class="nx">password</span><span class="p">,</span>
</span><span class='line'>            <span class="nx">name</span><span class="o">:</span> <span class="nx">name</span>
</span><span class='line'>        <span class="p">});</span>
</span><span class='line'>    <span class="p">},</span>
</span><span class='line'>
</span><span class='line'>    <span class="nx">nameOf</span><span class="o">:</span> <span class="kd">function</span> <span class="p">(</span><span class="nx">email</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>        <span class="k">return</span> <span class="k">this</span><span class="p">.</span><span class="nx">users</span><span class="p">[</span><span class="mi">0</span><span class="p">].</span><span class="nx">name</span><span class="p">;</span>
</span><span class='line'>    <span class="p">},</span>
</span><span class='line'>
</span><span class='line'>    <span class="nx">currentUser</span><span class="o">:</span> <span class="kd">function</span> <span class="p">()</span> <span class="p">{</span>
</span><span class='line'>        <span class="k">return</span> <span class="k">this</span><span class="p">.</span><span class="nx">users</span><span class="p">[</span><span class="mi">0</span><span class="p">];</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'><span class="p">};</span>
</span></code></pre></td></tr></table></div></figure>




<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="c1">// src/LoginPage.js</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">container</span> <span class="o">=</span> <span class="nb">document</span><span class="p">.</span><span class="nx">querySelector</span><span class="p">(</span><span class="s2">&quot;#page&quot;</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'><span class="kd">var</span> <span class="nx">LoginPage</span> <span class="o">=</span> <span class="p">{</span>
</span><span class='line'>    <span class="nx">render</span><span class="o">:</span> <span class="kd">function</span> <span class="p">()</span> <span class="p">{</span>
</span><span class='line'>        <span class="kd">var</span> <span class="nx">emailInput</span> <span class="o">=</span> <span class="nb">document</span><span class="p">.</span><span class="nx">createElement</span><span class="p">(</span><span class="s2">&quot;input&quot;</span><span class="p">);</span>
</span><span class='line'>        <span class="nx">emailInput</span><span class="p">.</span><span class="nx">id</span> <span class="o">=</span> <span class="s2">&quot;email&quot;</span><span class="p">;</span>
</span><span class='line'>        <span class="nx">emailInput</span><span class="p">.</span><span class="nx">type</span> <span class="o">=</span> <span class="s2">&quot;email&quot;</span><span class="p">;</span>
</span><span class='line'>        <span class="nx">container</span><span class="p">.</span><span class="nx">appendChild</span><span class="p">(</span><span class="nx">emailInput</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>        <span class="kd">var</span> <span class="nx">passwordInput</span> <span class="o">=</span> <span class="nb">document</span><span class="p">.</span><span class="nx">createElement</span><span class="p">(</span><span class="s2">&quot;input&quot;</span><span class="p">);</span>
</span><span class='line'>        <span class="nx">passwordInput</span><span class="p">.</span><span class="nx">id</span> <span class="o">=</span> <span class="s2">&quot;password&quot;</span><span class="p">;</span>
</span><span class='line'>        <span class="nx">passwordInput</span><span class="p">.</span><span class="nx">type</span> <span class="o">=</span> <span class="s2">&quot;password&quot;</span><span class="p">;</span>
</span><span class='line'>        <span class="nx">container</span><span class="p">.</span><span class="nx">appendChild</span><span class="p">(</span><span class="nx">passwordInput</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>        <span class="kd">var</span> <span class="nx">loginButton</span> <span class="o">=</span> <span class="nb">document</span><span class="p">.</span><span class="nx">createElement</span><span class="p">(</span><span class="s2">&quot;button&quot;</span><span class="p">);</span>
</span><span class='line'>        <span class="nx">loginButton</span><span class="p">.</span><span class="nx">id</span> <span class="o">=</span> <span class="s2">&quot;do_login&quot;</span><span class="p">;</span>
</span><span class='line'>        <span class="nx">loginButton</span><span class="p">.</span><span class="nx">textContent</span> <span class="o">=</span> <span class="s2">&quot;Login&quot;</span><span class="p">;</span>
</span><span class='line'>        <span class="nx">container</span><span class="p">.</span><span class="nx">appendChild</span><span class="p">(</span><span class="nx">loginButton</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>        <span class="nx">loginButton</span><span class="p">.</span><span class="nx">addEventListener</span><span class="p">(</span><span class="s2">&quot;click&quot;</span><span class="p">,</span> <span class="nx">LoginPage</span><span class="p">.</span><span class="nx">onLogin</span><span class="p">);</span>
</span><span class='line'>    <span class="p">},</span>
</span><span class='line'>
</span><span class='line'>    <span class="nx">onLogin</span><span class="o">:</span> <span class="kd">function</span> <span class="p">()</span> <span class="p">{</span>
</span><span class='line'>        <span class="nx">container</span><span class="p">.</span><span class="nx">innerHTML</span> <span class="o">=</span> <span class="s2">&quot;&quot;</span><span class="p">;</span>
</span><span class='line'>        <span class="nx">ProfilePage</span><span class="p">.</span><span class="nx">render</span><span class="p">();</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'><span class="p">};</span>
</span></code></pre></td></tr></table></div></figure>




<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="c1">// src/ProfilePage.js</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">ProfilePage</span> <span class="o">=</span> <span class="p">{</span>
</span><span class='line'>    <span class="nx">render</span><span class="o">:</span> <span class="kd">function</span> <span class="p">()</span> <span class="p">{</span>
</span><span class='line'>        <span class="kd">var</span> <span class="nx">profileContainer</span> <span class="o">=</span> <span class="nb">document</span><span class="p">.</span><span class="nx">createElement</span><span class="p">(</span><span class="s2">&quot;div&quot;</span><span class="p">);</span>
</span><span class='line'>        <span class="nx">profileContainer</span><span class="p">.</span><span class="nx">id</span> <span class="o">=</span> <span class="s2">&quot;profile_page&quot;</span><span class="p">;</span>
</span><span class='line'>        <span class="nx">container</span><span class="p">.</span><span class="nx">appendChild</span><span class="p">(</span><span class="nx">profileContainer</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>        <span class="kd">var</span> <span class="nx">title</span> <span class="o">=</span> <span class="nb">document</span><span class="p">.</span><span class="nx">createElement</span><span class="p">(</span><span class="s2">&quot;h1&quot;</span><span class="p">);</span>
</span><span class='line'>        <span class="nx">title</span><span class="p">.</span><span class="nx">id</span> <span class="o">=</span> <span class="s2">&quot;title&quot;</span><span class="p">;</span>
</span><span class='line'>        <span class="nx">title</span><span class="p">.</span><span class="nx">textContent</span> <span class="o">=</span> <span class="nx">Users</span><span class="p">.</span><span class="nx">currentUser</span><span class="p">().</span><span class="nx">name</span><span class="p">;</span>
</span><span class='line'>        <span class="nx">profileContainer</span><span class="p">.</span><span class="nx">appendChild</span><span class="p">(</span><span class="nx">title</span><span class="p">);</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'><span class="p">};</span>
</span></code></pre></td></tr></table></div></figure>


<p>Now we could add <code>&lt;div id="page"&gt;</code> to our <code>index.html</code>, and load our <code>src/*</code> scripts after it, and add <code>&lt;script&gt;Users.add("john@example.org", "welcome", "John Smith"); LoginPage.render();&lt;/script&gt;</code> at the end to start our application. Enjoy the application that implements one happy path of our feature (we still have quite a few different paths to cover). Also, it might be a good idea to style the application slightly better, than plain inputs and buttons, but we are not going to cover that in these series. This single feature test takes a lot of time to write because it is the first feature test in the empty application. Essentially, it has driven a lot of different architectural decisions, which don&rsquo;t necessary need to be done the way they were done in this article. Writing a second test for the same feature is much easier and third one, and all consecutive are also easier.</p>

<h3>Exercises</h3>

<ol>
<li>Remove <code>x</code> prefix from the <code>xdescribe</code> tests and implement them using techniques described in this article - write a user story scenario, translate it to the test code and make sure to fix all the test failures one feature step at a time.</li>
<li>Discover more interesting edge cases. Make the tests for them and make them all pass.</li>
<li>Write sign-up feature&rsquo;s user story and implement it with feature tests.</li>
</ol>


<h2>Bottom Line</h2>

<p>Today we have learned how to write tests for the whole application that imitate real user interaction. We have seen how, test-driving the functionality can help discovering new user story scenarios. Essentially, every time we write simple, but not so correct code that makes our test pass, we need to think what would be the scenario to prove that code wrong and add that scenario on our to-do list, which is represented by pending tests, which have only their descriptions.</p>

<p>In the next article of the series, we will dig deeper on what exactly we did today, what it means to Test-Drive the code, what are the laws, rules, tips and tricks of Test-Driven Development. Next article of the series assumes, that login and sign-up features are fully test-driven and implemented. We will be implementing a brand new feature of our application.</p>

<h2>Thanks</h2>

<p>Thank you for reading, my dear reader. If you liked it, please share this article on social networks and follow me on twitter: <a href="https://twitter.com/tdd_fellow">@tdd_fellow</a>.</p>

<p>If you have any questions or feedback for me, don’t hesitate to reach me out on Twitter: <a href="https://twitter.com/tdd_fellow">@tdd_fellow</a>.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Mobile Waterfall. Being Agile Again]]></title>
    <link href="http://www.tddfellow.com/blog/2016/12/07/mobile-waterfall-being-agile-again/"/>
    <updated>2016-12-07T19:54:07+01:00</updated>
    <id>http://www.tddfellow.com/blog/2016/12/07/mobile-waterfall-being-agile-again</id>
    <content type="html"><![CDATA[<p>Have you ever worked with mobile platforms, such as Apple Store or Google Play? How much time it takes to release a new version of the application? They have ~2-4 days manual review of your mobile application. What do you think that means? - You can release your application to production no often than two times a week. It became much better around this year - before it was 1-1.5 weeks.</p>

<p><img src="http://www.tddfellow.com/images/waterfall.jpg" alt="waterfall" /></p>

<!-- more -->


<p>Would you like to deploy a bug fix? - Half a week. Unless it makes your application crash all the time. Then you can get it going in half a day or one day. Which is still pretty slow.</p>

<p>Would you like to make a canary release to 1% of your users and test an assumption quickly using your analytics tools? - Forget it. Waiting for three days to get results on your assumption negates the benefits of the Canary release. You should be getting your feedback in minutes, not days!</p>

<p>At such disadvantage deploy takes half a week and makes software development teams switch to much more defensive mode:</p>

<ul>
<li>more extensive end-to-end testing (slow), and</li>
<li>more extensive manual QA before the release.</li>
</ul>


<p>That is Waterfall. Right there.</p>

<h2>Being Agile Again</h2>

<p>In that environment, how could we get our quick feedback back? - What if we had the ability to send logic in the form of Domain-Specific Language (DSL) from our server, that we can deploy to whenever we wish to? What if our mobile application could have interpreted this DSL and could have updated itself every time user starts the application while connected to the Internet?</p>

<p>We would be able to get a quick feedback! It would make fast deploys possible and also it would allow us to do canary releases, which can enable us to be LEAN again - To be Agile again.</p>

<p>This approach has a few problems:</p>

<ul>
<li>Reviewer can reject the application release. In this case, the developer has to negotiate with reviewers and explain that their business process requires such capabilities for their application to be quickly deployable. Exchange of few email and you can be Agile again.</li>
<li>You would have to implement that DSL. Both: design the DSL and write the interpreter on the mobile application side. That is quite a significant investment of time. It is reasonable to implement only tiny part of such DSL and apply it only in places that need to be often changed, such as UI and business logic that everyone tries to fiddle with to optimize the KPIs of the mobile application.</li>
<li>The approach does not guarantee quick deployability of 100% of the changes you need to make. Some changes will require an extension of DSL, and its interpreter, and native bindings. Surely, such change will have to be deployed via regular submit -> review -> wait four days -> release cycle. The tricky challenge is to balance what gets implemented in a DSL and what gets implemented in the native bindings for that DSL to achieve high enough portion of changes to be quickly deployable: about 90-95%; and keeping
the DSL and interpreter complexity as low as you can.</li>
</ul>


<p>If you take the idea of such DSl and the interpreter to the extreme, you will wound up with the programming language. There is already such programming language and platform that has the same characteristics - Javascript + React Native. Nowadays, application stores allow to download javascript code updates from your server, but you have to deploy all native bindings via application store with a manual review; also, one can not change the essence of their application.</p>

<p>Why would you want to go with your DSL instead of React Native?:</p>

<ul>
<li>You already have a native mobile application, and you have identified places that change just too often.</li>
<li>The performance of the application is critical.</li>
</ul>


<h2>Example of the DSL</h2>

<p>DSL might be as simple as Abstract Syntax Tree represented in JSON. Let&rsquo;s imagine that we have an application, where users can buy some items and now we want to contact the recommendation service and present them a NEW view with the list of recommendations. Normally, you would have to do a full development and full deployment via application store. With DSL you might end up just writing some JSON:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="c1">// chunk of logic A</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>  <span class="s2">&quot;subscribe&quot;</span><span class="o">:</span> <span class="p">{</span>
</span><span class='line'>    <span class="s2">&quot;event&quot;</span><span class="o">:</span> <span class="s2">&quot;user_has_liked_item&quot;</span><span class="p">,</span>
</span><span class='line'>    <span class="s2">&quot;actions&quot;</span><span class="o">:</span> <span class="p">[</span>
</span><span class='line'>      <span class="p">{</span>
</span><span class='line'>        <span class="s2">&quot;request&quot;</span><span class="o">:</span> <span class="s2">&quot;/api/v1/recommendations/${event.item_id}&quot;</span><span class="p">,</span>
</span><span class='line'>        <span class="s2">&quot;publish&quot;</span><span class="o">:</span> <span class="s2">&quot;received_recommendations&quot;</span>
</span><span class='line'>      <span class="p">}</span>
</span><span class='line'>    <span class="p">]</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// chunk of logic B</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>  <span class="s2">&quot;subscribe&quot;</span><span class="o">:</span> <span class="p">{</span>
</span><span class='line'>    <span class="s2">&quot;event&quot;</span><span class="o">:</span> <span class="s2">&quot;received_recommendations&quot;</span><span class="p">,</span>
</span><span class='line'>    <span class="s2">&quot;actions&quot;</span><span class="o">:</span> <span class="p">[</span>
</span><span class='line'>      <span class="p">{</span>
</span><span class='line'>        <span class="s2">&quot;render&quot;</span><span class="o">:</span> <span class="p">{</span>
</span><span class='line'>          <span class="s2">&quot;view&quot;</span><span class="o">:</span> <span class="s2">&quot;item_list&quot;</span><span class="p">,</span>
</span><span class='line'>          <span class="s2">&quot;data&quot;</span><span class="o">:</span> <span class="s2">&quot;${event.response.items}&quot;</span>
</span><span class='line'>        <span class="p">}</span>
</span><span class='line'>      <span class="p">}</span>
</span><span class='line'>    <span class="p">]</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>Of course, parser and interpreter for this JSON, and actions (such as: <code>request</code> and <code>render</code>) are written in the native code and, therefore, have to be deployed via application store every time you change them or add a new capability. One can implement views in the native code, or represent them in DSL (aka simplified HTML + CSS).</p>

<h2>Bottom Line</h2>

<p>As an industry, we understand why different application store vendors want to review every release of every application:</p>

<ul>
<li>To maintain quality of the applications and avoid possible malware, and</li>
<li>To preserve their revenue streams intact (paid application payments have to go through vendors, so they will be able to take a commission).</li>
</ul>


<p>Nevertheless, we need to reject manual review as a bad practice and aim for fully automated deployments; that deliver our new application releases to users in minutes. As an industry, we need to push companies running application stores to improve their process to enable us to do that.</p>

<h2>Thanks</h2>

<p>Thank you for reading, my dear reader. If you liked it, please share this article on social networks and follow me on twitter: <a href="https://twitter.com/tdd_fellow">@tdd_fellow</a>.</p>

<p>If you have any questions or feedback for me, don’t hesitate to reach me out on Twitter: <a href="https://twitter.com/tdd_fellow">@tdd_fellow</a>.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Understanding Legacy Code Using Explorative Test-Driven Development Technique]]></title>
    <link href="http://www.tddfellow.com/blog/2016/12/05/understanding-legacy-code-using-explorative-test-driven-development-technique/"/>
    <updated>2016-12-05T23:23:36+01:00</updated>
    <id>http://www.tddfellow.com/blog/2016/12/05/understanding-legacy-code-using-explorative-test-driven-development-technique</id>
    <content type="html"><![CDATA[<p>Today we are going to learn how to eliminate the fear of changing legacy code. We will learn how to confidently and in small iterations understand the legacy code better while increasing the test coverage in the process. While code examples are in Ruby programming language, the technique applied is language-agnostic.</p>

<!-- more -->


<p>For this article, we will need to define what Legacy Code means.</p>

<h2>Legacy Code</h2>

<p>Legacy code is challenging to understand when reading. Such code has no or close to no tests. Also, any legacy code brings the value to the business and customers.</p>

<p>Let&rsquo;s give an outline of what we will be going through today:</p>

<ul>
<li>We will define &ldquo;Knowledge&rdquo; and &ldquo;Mutation&rdquo; concepts in the context of the production code.</li>
<li>We will take a look into the relation between the production system and its test suite. While the connection from test suite to the production system is simple, the reverse connection is subtle and have some unusual and unexpected properties.</li>
<li>We will dismantle different test coverage metrics and outline the most valuable and useful one.</li>
<li>We will explore existing technique called Mutational Testing, that is simple to apply to the untested code to increase its test coverage.</li>
<li>We will introduce the technique called Explorative Test-Driven Development, that is an improvement of Mutational Testing method, which allows us to increase understanding of the legacy code in small steps - confidently and incrementally.</li>
<li>We will look at the example legacy code and apply Explorative TDD to it.</li>
<li>We will see the opportunities to use Explorative TDD technique outside the context of the Legacy Code.</li>
</ul>


<p>Shall we get the ball rolling?</p>

<h2>Knowledge in Production Code</h2>

<p>&ldquo;Knowledge in Production Code&rdquo; is any small bit of functionality that represents any part of the business rule or underlying infrastructure rule. Example bits of knowledge in production code:</p>

<ul>
<li>a variable assignment (or binding): <code>a_variable = ...</code>,</li>
<li>the presence of the <code>if</code> statement: <code>if ... end</code>,</li>
<li>an <code>if</code> condition: <code>if has_certain_property()</code>,</li>
<li>an <code>if</code> body: <code>if ...  do_something_interesting  end</code>,</li>
<li>the presence of the <code>else</code> clause: <code>if ... else ... end</code>,</li>
<li>an <code>else</code> body: <code>if ... else  do_something_different  end</code>,</li>
<li>function (or method) call: <code>a_function(arguments)</code>, <code>receiver.a_method(arguments)</code>,</li>
<li>every argument of the function (or method) call (including receiver),</li>
<li>a constant: <code>42</code>,</li>
<li>the fact that function (or method) returns early: <code>if ...  return 42  end</code>,</li>
<li>what the function (or method) returns,</li>
<li>the presence of the iteration: <code>...each do |x| ... end</code>,</li>
<li>what we iterate through: <code>list.each do ...</code>,</li>
<li>and how we are iterating: <code>...each do |x|  do_something_with(x)  end</code>,</li>
<li>and so on.</li>
</ul>


<p>I think the idea &ldquo;Knowledge in Production Code&rdquo; should be more or less precise. More interesting is what we can do with knowledge in our system: we can re-organize knowledge differently keeping all the behaviors of the system - everyone calls this Refactoring nowadays; or do the opposite: change bits of knowledge without modifying the structure of the code - we will call one such change a Mutation:</p>

<h2>Mutation</h2>

<p>Mutation - granular change of the knowledge in the system that changes the behavior of the application. Let&rsquo;s take a look at the simple example:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="k">if</span> <span class="n">cell_is_alive</span>
</span><span class='line'>  <span class="n">do_this</span>
</span><span class='line'><span class="k">else</span>
</span><span class='line'>  <span class="n">do_some_other_thing</span>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>


<p>This code is maybe a part of some cell organism simulation (like Game Of Life or similar). Let&rsquo;s see which different mutations can be applied here:</p>

<ul>
<li>change the <code>if</code> condition always to be <code>true</code>: <code>if true ...</code>,</li>
<li>change the <code>if</code> condition always to be <code>false</code>: <code>if false ...</code>,</li>
<li>invert the <code>if</code> condition: <code>if !cell_is_alive</code>,</li>
<li>commenting out the <code>if</code> body: <code># do_this</code>,</li>
<li>commenting out the <code>else</code> body: <code># do_some_other_thing</code>.</li>
</ul>


<p>With that done, let&rsquo;s take a look at how production code and its test suite relate to each other.</p>

<h2>Code and Test Suite Relationship</h2>

<p>So, how does the test suite affect production code? First, it makes sure the production code is correct. Also, good test suite enables quick and ruthless refactoring by eliminating (or minimizing) the risks of breaking it. Well-crafted test suite gives us the power and courage to introduce changes. Also, test code always couples to the production code it is testing in one way or another.</p>

<p>Okay, how does the production system affect its test suite? As tests couple to the production code they test, the changes in production system may cause ripple effects on its test suite. Practically speaking, a mutation should always lead to a test failure if the test suite is good enough because its test suite should verify every tiny bit of knowledge in the production code (except, maybe, some configuration).</p>

<p>Such knowledge change is an act of assertion about the presence of the test. When information is covered by test suite well, there should be a test failure. If, after the introduction of the mutation, there is no test failure, this is a failed assertion about test presence or correctness. So one might say:</p>

<blockquote><p>Knowledge Change is a Test for the Test</p></blockquote>

<p>That is a fascinating idea since it implies we can use production code can as a test suite for its test suite, which may enable TDD-like iterative development of the test suite that does not exist.</p>

<p>So far, we have covered the idea of knowledge in the production code, explored ways of modifying this information in a way that changes the behavior - we call it a mutation, and also we explored the mirror-like relation between production code and its test suite. We have still much ground to cover, let&rsquo;s dive in:</p>

<h2>Most Useful Coverage Metric</h2>

<p>There is a few well-known test coverage metrics that are being used quite often by software engineering teams, such as:</p>

<ul>
<li>Line coverage, and</li>
<li>Branch coverage.</li>
</ul>


<p>There is another one, called Path coverage - it is about coverage of all possible code paths in the system, which quickly becomes impractical as the application size grows because of the exponential growth of the amount of these different code paths.</p>

<p>Line coverage and Branch coverage (also, path coverage) all share one major problem - covered line/branch/path does not mean test suite verifies it - only executes it. Great example: remove all the assertions from your tests and the coverage metric will stay the same.</p>

<p>So, what if we could introduce all possible and sane mutations to our code and count how much of them cause test failure? - We will get the knowledge coverage metric. Another name for it is Test Semantic Stability, and it can range from 0% to 100%. Even 100% line/path coverage can easily yield 0% Test Semantic Stability. This metric proves that code is, indeed well-tested and verified (although, it does not say anything about tests&#8217; design and cleanliness): make one assertion incorrect, or not precise enough and the metric will go down by a few mutations.</p>

<p>That makes Test Semantic Stability the most useful coverage metric.</p>

<p>So, how do we check if our test(s) cover well some bit of knowledge in the system? We break it! - Introduce a tiny granular breaking change to that bit of knowledge. The test suite should fail. If it does not - information is not covered well enough. That leads us to the technique that allows us to keep Semantic Test Stability up high:</p>

<h2>Mutational Testing</h2>

<ol>
<li>Narrow the scope of work to a single granular piece of knowledge.</li>
<li>Break this knowledge (introduce simple granular breaking change - mutation).</li>
<li>Make sure there is a test suite failure.</li>
<li>Restore the knowledge to its original state (CTRL+Z, ideally).</li>
</ol>


<p>Let&rsquo;s see it in action:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="k">if</span> <span class="n">cell_is_alive</span>
</span><span class='line'>  <span class="n">do_this</span>
</span><span class='line'><span class="k">else</span>
</span><span class='line'>  <span class="n">do_some_other_thing</span>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>


<p>First, we need to narrow our scope to a single bit of knowledge. For example, the <code>if</code> condition: <code>if cell_is_alive</code>. Then we need to introduce the mutation <code>if true,</code> and we need to make sure that there is a test failure. Let&rsquo;s run the test suite:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="err">$</span> <span class="n">rake</span> <span class="nb">test</span>
</span><span class='line'><span class="o">.</span><span class="n">.</span><span class="o">.</span><span class="n">.</span>
</span><span class='line'>
</span><span class='line'><span class="no">Finished</span> <span class="k">in</span> <span class="mi">0</span><span class="o">.</span><span class="mo">02343</span> <span class="n">seconds</span> <span class="p">(</span><span class="n">files</span> <span class="n">took</span> <span class="mi">0</span><span class="o">.</span><span class="mi">11584</span> <span class="n">seconds</span> <span class="n">to</span> <span class="nb">load</span><span class="p">)</span>
</span><span class='line'><span class="mi">4</span> <span class="n">examples</span><span class="p">,</span> <span class="mi">0</span> <span class="n">failures</span>
</span></code></pre></td></tr></table></div></figure>


<p>Oh no! It did not fail anywhere! That means that we have a &ldquo;failing test&rdquo; for our test suite. In this case, we need to add the test for the negative case:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="n">cell_is_alive</span> <span class="o">=</span> <span class="kp">false</span>
</span><span class='line'><span class="n">expect</span><span class="p">(</span><span class="n">did_some_other_thing</span><span class="p">)</span><span class="o">.</span><span class="n">to</span> <span class="n">eq</span><span class="p">(</span><span class="kp">true</span><span class="p">)</span>
</span></code></pre></td></tr></table></div></figure>


<p>When we run the test suite:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="err">$</span> <span class="n">rake</span> <span class="nb">test</span>
</span><span class='line'><span class="o">.</span><span class="n">.</span><span class="o">.</span><span class="n">.F</span>
</span><span class='line'>
</span><span class='line'><span class="no">Finished</span> <span class="k">in</span> <span class="mi">0</span><span class="o">.</span><span class="mo">02343</span> <span class="n">seconds</span> <span class="p">(</span><span class="n">files</span> <span class="n">took</span> <span class="mi">0</span><span class="o">.</span><span class="mi">11584</span> <span class="n">seconds</span> <span class="n">to</span> <span class="nb">load</span><span class="p">)</span>
</span><span class='line'><span class="mi">5</span> <span class="n">examples</span><span class="p">,</span> <span class="mi">1</span> <span class="n">failure</span>
</span></code></pre></td></tr></table></div></figure>


<p>It fails! Great - that means that our test for the test suite is passing now. As the last step of this mutational testing iteration we have to return the code to its original state:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="k">if</span> <span class="n">cell_is_alive</span>
</span><span class='line'>  <span class="n">do_this</span>
</span><span class='line'><span class="k">else</span>
</span><span class='line'>  <span class="n">do_some_other_thing</span>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>


<p>After doing this, our tests should pass!:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="err">$</span> <span class="n">rake</span> <span class="nb">test</span>
</span><span class='line'><span class="o">.</span><span class="n">.</span><span class="o">.</span><span class="n">.</span><span class="o">.</span>
</span><span class='line'>
</span><span class='line'><span class="no">Finished</span> <span class="k">in</span> <span class="mi">0</span><span class="o">.</span><span class="mo">02343</span> <span class="n">seconds</span> <span class="p">(</span><span class="n">files</span> <span class="n">took</span> <span class="mi">0</span><span class="o">.</span><span class="mi">11584</span> <span class="n">seconds</span> <span class="n">to</span> <span class="nb">load</span><span class="p">)</span>
</span><span class='line'><span class="mi">5</span> <span class="n">examples</span><span class="p">,</span> <span class="mi">0</span> <span class="n">failures</span>
</span></code></pre></td></tr></table></div></figure>


<p>They do. That concludes one iteration of the mutational testing. Usually, to accomplish any useful behavior we would like to combine many bits of knowledge. If we want to understand better how the system works, we need to focus on groups of bits of knowledge. This is what Explorative TDD technique is about:</p>

<h2>Explorative Test-Driven Development</h2>

<p>The technique used to increase our understanding of the Legacy Code while enhancing its Test Semantic Stability (the most useful coverage metric). The process roughly looks like that:</p>

<ol>
<li>Narrow scope to some manageable knowledge and isolate it (manageable knowledge = method/function/class/module).</li>
<li>Read, try to understand, pick a granular piece of knowledge, and make an assumption to which behavior it contributes and how.</li>
<li>Write a test to verify this assumption.</li>
<li>Make sure test passes (by altering the assumption or fixing production code (bugs)). PS: be careful with bugs, since they might be weird behaviors that are bringing someone tremendous value. When finding one of these, consult with stakeholders if that is a bug or a feature.</li>
<li>Apply Mutational Testing to each related granular piece of knowledge to verify that the understanding (and the test) is correct (this may introduce more tests).</li>
<li>Go back to 2</li>
</ol>


<p>At this point, a nice example would help understand that technique:</p>

<h2>Step-by-Step Example</h2>

<p>Let&rsquo;s imagine that we have some legacy system, that is a social network and allows for users to receive notifications on things that happened. You need to change slightly what &ldquo;Followed&rdquo; notification means. The code looks like this, and it does not have any tests:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
<span class='line-number'>37</span>
<span class='line-number'>38</span>
<span class='line-number'>39</span>
<span class='line-number'>40</span>
<span class='line-number'>41</span>
<span class='line-number'>42</span>
<span class='line-number'>43</span>
<span class='line-number'>44</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="k">class</span> <span class="nc">User</span>
</span><span class='line'>  <span class="k">def</span> <span class="nf">notifications</span>
</span><span class='line'>    <span class="n">notifications</span> <span class="o">=</span> <span class="no">Database</span>
</span><span class='line'>      <span class="o">.</span><span class="n">where</span><span class="p">(</span><span class="s2">&quot;notifications&quot;</span><span class="p">)</span> <span class="k">do</span> <span class="o">|</span><span class="n">x</span><span class="o">|</span>
</span><span class='line'>        <span class="p">(</span><span class="n">x</span><span class="o">[</span><span class="mi">1</span><span class="o">][</span><span class="mi">0</span><span class="o">]</span> <span class="o">==</span> <span class="s2">&quot;followed_notification&quot;</span> <span class="o">&amp;&amp;</span> <span class="n">x</span><span class="o">[</span><span class="mi">1</span><span class="o">][</span><span class="mi">2</span><span class="o">]</span> <span class="o">==</span> <span class="nb">id</span><span class="o">.</span><span class="n">to_s</span><span class="p">)</span> <span class="o">||</span>
</span><span class='line'>        <span class="p">(</span><span class="n">x</span><span class="o">[</span><span class="mi">1</span><span class="o">][</span><span class="mi">0</span><span class="o">]</span> <span class="o">==</span> <span class="s2">&quot;favorited_notification&quot;</span> <span class="o">&amp;&amp;</span> <span class="no">StatusUpdate</span><span class="o">.</span><span class="n">find</span><span class="p">(</span><span class="n">x</span><span class="o">[</span><span class="mi">1</span><span class="o">][</span><span class="mi">2</span><span class="o">].</span><span class="n">to_i</span><span class="p">)</span><span class="o">.</span><span class="n">owner_id</span> <span class="o">==</span> <span class="nb">id</span><span class="p">)</span> <span class="o">||</span>
</span><span class='line'>        <span class="p">(</span><span class="n">x</span><span class="o">[</span><span class="mi">1</span><span class="o">][</span><span class="mi">0</span><span class="o">]</span> <span class="o">==</span> <span class="s2">&quot;replied_notification&quot;</span> <span class="o">&amp;&amp;</span> <span class="no">StatusUpdate</span><span class="o">.</span><span class="n">find</span><span class="p">(</span><span class="n">x</span><span class="o">[</span><span class="mi">1</span><span class="o">][</span><span class="mi">2</span><span class="o">].</span><span class="n">to_i</span><span class="p">)</span><span class="o">.</span><span class="n">owner_id</span> <span class="o">==</span> <span class="nb">id</span><span class="p">)</span> <span class="o">||</span>
</span><span class='line'>        <span class="p">(</span><span class="n">x</span><span class="o">[</span><span class="mi">1</span><span class="o">][</span><span class="mi">0</span><span class="o">]</span> <span class="o">==</span> <span class="s2">&quot;reposted_notification&quot;</span> <span class="o">&amp;&amp;</span> <span class="no">StatusUpdate</span><span class="o">.</span><span class="n">find</span><span class="p">(</span><span class="n">x</span><span class="o">[</span><span class="mi">1</span><span class="o">][</span><span class="mi">2</span><span class="o">].</span><span class="n">to_i</span><span class="p">)</span><span class="o">.</span><span class="n">owner_id</span> <span class="o">==</span> <span class="nb">id</span><span class="p">)</span>
</span><span class='line'>      <span class="k">end</span><span class="o">.</span><span class="n">map</span> <span class="k">do</span> <span class="o">|</span><span class="n">row</span><span class="o">|</span>
</span><span class='line'>        <span class="nb">id</span><span class="p">,</span> <span class="n">values</span> <span class="o">=</span> <span class="n">row</span>
</span><span class='line'>        <span class="n">kind</span> <span class="o">=</span> <span class="n">values</span><span class="o">[</span><span class="mi">0</span><span class="o">]</span>
</span><span class='line'>
</span><span class='line'>        <span class="k">if</span> <span class="n">kind</span> <span class="o">==</span> <span class="s2">&quot;followed_notification&quot;</span>
</span><span class='line'>          <span class="p">{</span>
</span><span class='line'>            <span class="ss">kind</span><span class="p">:</span> <span class="n">kind</span><span class="p">,</span>
</span><span class='line'>            <span class="ss">follower</span><span class="p">:</span> <span class="no">User</span><span class="o">.</span><span class="n">find</span><span class="p">(</span><span class="n">values</span><span class="o">[</span><span class="mi">1</span><span class="o">].</span><span class="n">to_i</span><span class="p">),</span>
</span><span class='line'>            <span class="ss">user</span><span class="p">:</span> <span class="no">User</span><span class="o">.</span><span class="n">find</span><span class="p">(</span><span class="n">values</span><span class="o">[</span><span class="mi">2</span><span class="o">].</span><span class="n">to_i</span><span class="p">),</span>
</span><span class='line'>          <span class="p">}</span>
</span><span class='line'>        <span class="k">elsif</span> <span class="n">kind</span> <span class="o">==</span> <span class="s2">&quot;favorited_notification&quot;</span>
</span><span class='line'>          <span class="p">{</span>
</span><span class='line'>            <span class="ss">kind</span><span class="p">:</span> <span class="n">kind</span><span class="p">,</span>
</span><span class='line'>            <span class="ss">favoriter</span><span class="p">:</span> <span class="no">User</span><span class="o">.</span><span class="n">find</span><span class="p">(</span><span class="n">values</span><span class="o">[</span><span class="mi">1</span><span class="o">].</span><span class="n">to_i</span><span class="p">),</span>
</span><span class='line'>            <span class="ss">status_update</span><span class="p">:</span> <span class="no">StatusUpdate</span><span class="o">.</span><span class="n">find</span><span class="p">(</span><span class="n">values</span><span class="o">[</span><span class="mi">2</span><span class="o">].</span><span class="n">to_i</span><span class="p">),</span>
</span><span class='line'>          <span class="p">}</span>
</span><span class='line'>        <span class="k">elsif</span> <span class="n">kind</span> <span class="o">==</span> <span class="s2">&quot;replied_notification&quot;</span>
</span><span class='line'>          <span class="p">{</span>
</span><span class='line'>            <span class="ss">kind</span><span class="p">:</span> <span class="n">kind</span><span class="p">,</span>
</span><span class='line'>            <span class="ss">sender</span><span class="p">:</span> <span class="no">User</span><span class="o">.</span><span class="n">find</span><span class="p">(</span><span class="n">values</span><span class="o">[</span><span class="mi">1</span><span class="o">].</span><span class="n">to_i</span><span class="p">),</span>
</span><span class='line'>            <span class="ss">status_update</span><span class="p">:</span> <span class="no">StatusUpdate</span><span class="o">.</span><span class="n">find</span><span class="p">(</span><span class="n">values</span><span class="o">[</span><span class="mi">2</span><span class="o">].</span><span class="n">to_i</span><span class="p">),</span>
</span><span class='line'>            <span class="ss">reply</span><span class="p">:</span> <span class="no">StatusUpdate</span><span class="o">.</span><span class="n">find</span><span class="p">(</span><span class="n">values</span><span class="o">[</span><span class="mi">3</span><span class="o">].</span><span class="n">to_i</span><span class="p">),</span>
</span><span class='line'>          <span class="p">}</span>
</span><span class='line'>        <span class="k">elsif</span> <span class="n">kind</span> <span class="o">==</span> <span class="s2">&quot;reposted_notification&quot;</span>
</span><span class='line'>          <span class="p">{</span>
</span><span class='line'>            <span class="ss">kind</span><span class="p">:</span> <span class="n">kind</span><span class="p">,</span>
</span><span class='line'>            <span class="ss">reposter</span><span class="p">:</span> <span class="no">User</span><span class="o">.</span><span class="n">find</span><span class="p">(</span><span class="n">values</span><span class="o">[</span><span class="mi">1</span><span class="o">].</span><span class="n">to_i</span><span class="p">),</span>
</span><span class='line'>            <span class="ss">status_update</span><span class="p">:</span> <span class="no">StatusUpdate</span><span class="o">.</span><span class="n">find</span><span class="p">(</span><span class="n">values</span><span class="o">[</span><span class="mi">2</span><span class="o">].</span><span class="n">to_i</span><span class="p">),</span>
</span><span class='line'>          <span class="p">}</span>
</span><span class='line'>        <span class="k">end</span>
</span><span class='line'>      <span class="k">end</span>
</span><span class='line'>
</span><span class='line'>    <span class="no">Analytics</span><span class="o">.</span><span class="n">tag</span><span class="p">({</span><span class="nb">name</span><span class="p">:</span> <span class="s2">&quot;fetch_notifications&quot;</span><span class="p">,</span> <span class="ss">count</span><span class="p">:</span> <span class="n">notifications</span><span class="o">.</span><span class="n">count</span><span class="p">})</span>
</span><span class='line'>    <span class="n">notifications</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>


<h3>Narrow &amp; Isolate</h3>

<p>The first step is to isolate this code and make it testable. For this we need to find a low-risk way to refactor all dependencies that this code has:</p>

<ul>
<li><code>Database.where</code>,</li>
<li><code>StatusUpdate.find</code>,</li>
<li><code>User.find</code>, and</li>
<li><code>Analytics.tag</code>.</li>
</ul>


<p>We can promote these things to the following roles:</p>

<ul>
<li><code>Database.where</code> => <code>@table_reader.where</code>,</li>
<li><code>StatusUpdate.find</code> => <code>@status_update_finder.where</code>,</li>
<li><code>User.find</code> => <code>@user_finder.find</code>, and</li>
<li><code>Analytics.tag</code> => <code>@event_tagger.tag</code>.</li>
</ul>


<p>We should be able to have these default to their original values and also allow to substitute different implementation from the test. Also, it is helpful to pull out this method into the clean environment, where accessing a dependency, without us substituting it - is not possible, for example in a separate code-base, so that we can write a test &ldquo;it works&rdquo; and see what fails. The first failure is, of course, all our referenced classes are missing. Let&rsquo;s define all of them without any implementation and make them fail at runtime if we ever call them from our testing environment:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="k">class</span> <span class="nc">Database</span>
</span><span class='line'>  <span class="k">def</span> <span class="nc">self</span><span class="o">.</span><span class="nf">where</span><span class="p">(</span><span class="n">table_name</span><span class="p">)</span>
</span><span class='line'>    <span class="nb">fail</span> <span class="s2">&quot;Database:nope&quot;</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'><span class="k">end</span>
</span><span class='line'>
</span><span class='line'><span class="k">class</span> <span class="nc">Analytics</span>
</span><span class='line'>  <span class="k">def</span> <span class="nc">self</span><span class="o">.</span><span class="nf">tag</span><span class="p">(</span><span class="n">event</span><span class="p">)</span>
</span><span class='line'>    <span class="nb">fail</span> <span class="s2">&quot;Analytics:nope&quot;</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'><span class="k">end</span>
</span><span class='line'>
</span><span class='line'><span class="k">class</span> <span class="nc">StatusUpdate</span>
</span><span class='line'>  <span class="k">def</span> <span class="nc">self</span><span class="o">.</span><span class="nf">find</span><span class="p">(</span><span class="nb">id</span><span class="p">)</span>
</span><span class='line'>    <span class="nb">fail</span> <span class="s2">&quot;StatusUpdate:nope&quot;</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'><span class="k">end</span>
</span><span class='line'>
</span><span class='line'><span class="k">class</span> <span class="nc">User</span>
</span><span class='line'>  <span class="c1"># .. def notifications ..</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">def</span> <span class="nc">self</span><span class="o">.</span><span class="nf">find</span><span class="p">(</span><span class="nb">id</span><span class="p">)</span>
</span><span class='line'>    <span class="nb">fail</span> <span class="s2">&quot;User:nope&quot;</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>


<p>In our tests, we need to implement our substitutes. For now, they all should be just simple double/stubs:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="k">class</span> <span class="nc">FakeTableReader</span>
</span><span class='line'>  <span class="k">def</span> <span class="nf">where</span><span class="p">(</span><span class="n">table_name</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">filter</span><span class="p">)</span>
</span><span class='line'>    <span class="o">[[</span><span class="kp">nil</span><span class="p">,</span> <span class="o">[</span><span class="s2">&quot;favorited_notification&quot;</span><span class="o">]]]</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'><span class="k">end</span>
</span><span class='line'>
</span><span class='line'><span class="k">class</span> <span class="nc">FakeEventTagger</span>
</span><span class='line'>  <span class="k">def</span> <span class="nf">tag</span><span class="p">(</span><span class="n">event</span><span class="p">)</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'><span class="k">end</span>
</span><span class='line'>
</span><span class='line'><span class="k">class</span> <span class="nc">FakeUserFinder</span>
</span><span class='line'>  <span class="k">def</span> <span class="nf">find</span><span class="p">(</span><span class="nb">id</span><span class="p">)</span>
</span><span class='line'>    <span class="no">User</span><span class="o">.</span><span class="n">new</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'><span class="k">end</span>
</span><span class='line'>
</span><span class='line'><span class="k">class</span> <span class="nc">FakeStatusUpdateFinder</span>
</span><span class='line'>  <span class="k">def</span> <span class="nf">find</span><span class="p">(</span><span class="nb">id</span><span class="p">)</span>
</span><span class='line'>    <span class="no">StatusUpdate</span><span class="o">.</span><span class="n">new</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>


<p>Then, we should write the simplest test, that sets up the stage and substitutes all the collaborators and runs the function under the test (no assertion, we are just verifying that we indeed replaced everything right):</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="n">it</span> <span class="s2">&quot;works&quot;</span> <span class="k">do</span>
</span><span class='line'>  <span class="n">fake_table_reader</span> <span class="o">=</span> <span class="no">FakeTableReader</span><span class="o">.</span><span class="n">new</span>
</span><span class='line'>  <span class="n">fake_event_tagger</span> <span class="o">=</span> <span class="no">FakeEventTagger</span><span class="o">.</span><span class="n">new</span>
</span><span class='line'>  <span class="n">fake_user_finder</span> <span class="o">=</span> <span class="no">FakeUserFinder</span><span class="o">.</span><span class="n">new</span>
</span><span class='line'>  <span class="n">fake_status_update_finder</span> <span class="o">=</span> <span class="no">FakeStatusUpdateFinder</span><span class="o">.</span><span class="n">new</span>
</span><span class='line'>
</span><span class='line'>  <span class="n">user</span> <span class="o">=</span> <span class="no">User</span><span class="o">.</span><span class="n">new</span>
</span><span class='line'>             <span class="o">.</span><span class="n">with_table_reader</span><span class="p">(</span><span class="n">fake_table_reader</span><span class="p">)</span>
</span><span class='line'>             <span class="o">.</span><span class="n">with_event_tagger</span><span class="p">(</span><span class="n">fake_event_tagger</span><span class="p">)</span>
</span><span class='line'>             <span class="o">.</span><span class="n">with_user_finder</span><span class="p">(</span><span class="n">fake_user_finder</span><span class="p">)</span>
</span><span class='line'>             <span class="o">.</span><span class="n">with_status_update_finder</span><span class="p">(</span><span class="n">fake_status_update_finder</span><span class="p">)</span>
</span><span class='line'>
</span><span class='line'>  <span class="n">user</span><span class="o">.</span><span class="n">notifications</span>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>


<p>Since we have not defined all the <code>with_*</code> methods yet, let&rsquo;s define them now and also define getters for particular instance variables (properties):</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
<span class='line-number'>37</span>
<span class='line-number'>38</span>
<span class='line-number'>39</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="k">class</span> <span class="nc">User</span>
</span><span class='line'>  <span class="c1"># ...</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">def</span> <span class="nf">table_reader</span>
</span><span class='line'>    <span class="vi">@table_reader</span> <span class="o">||=</span> <span class="no">Database</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">def</span> <span class="nf">event_tagger</span>
</span><span class='line'>    <span class="vi">@event_tagger</span> <span class="o">||=</span> <span class="no">Analytics</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">def</span> <span class="nf">user_finder</span>
</span><span class='line'>    <span class="vi">@user_finder</span> <span class="o">||</span> <span class="no">User</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">def</span> <span class="nf">status_update_finder</span>
</span><span class='line'>    <span class="vi">@status_update_finder</span> <span class="o">||</span> <span class="no">StatusUpdate</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">def</span> <span class="nf">with_table_reader</span><span class="p">(</span><span class="n">table_reader</span><span class="p">)</span>
</span><span class='line'>    <span class="vi">@table_reader</span> <span class="o">=</span> <span class="n">table_reader</span>
</span><span class='line'>    <span class="nb">self</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">def</span> <span class="nf">with_event_tagger</span><span class="p">(</span><span class="n">event_tagger</span><span class="p">)</span>
</span><span class='line'>    <span class="vi">@event_tagger</span> <span class="o">=</span> <span class="n">event_tagger</span>
</span><span class='line'>    <span class="nb">self</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">def</span> <span class="nf">with_user_finder</span><span class="p">(</span><span class="n">user_finder</span><span class="p">)</span>
</span><span class='line'>    <span class="vi">@user_finder</span> <span class="o">=</span> <span class="n">user_finder</span>
</span><span class='line'>    <span class="nb">self</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">def</span> <span class="nf">with_status_update_finder</span><span class="p">(</span><span class="n">status_update_finder</span><span class="p">)</span>
</span><span class='line'>    <span class="vi">@status_update_finder</span> <span class="o">=</span> <span class="n">status_update_finder</span>
</span><span class='line'>    <span class="nb">self</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>


<p>If we run our test, it should fail with <code>RuntimeError: Database:nope</code> in here:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="k">def</span> <span class="nf">notifications</span>
</span><span class='line'>  <span class="n">notifications</span> <span class="o">=</span> <span class="no">Database</span>            <span class="c1"># &lt;&lt;&lt;&lt;&lt;&lt;</span>
</span><span class='line'>    <span class="o">.</span><span class="n">where</span><span class="p">(</span><span class="s2">&quot;notifications&quot;</span><span class="p">)</span> <span class="k">do</span> <span class="o">|</span><span class="n">x</span><span class="o">|</span>
</span></code></pre></td></tr></table></div></figure>


<p>To fix that, we will need to replace <code>Database</code> with <code>table_reader</code> getter. That will correct the current error, and we will get the next one: <code>RuntimeError User:nope</code>. Following all these failures and replacing direct dependencies with getters we will finally get a Green Bar (passing the test). Our function under the test will look like that:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
<span class='line-number'>37</span>
<span class='line-number'>38</span>
<span class='line-number'>39</span>
<span class='line-number'>40</span>
<span class='line-number'>41</span>
<span class='line-number'>42</span>
<span class='line-number'>43</span>
<span class='line-number'>44</span>
<span class='line-number'>45</span>
<span class='line-number'>46</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="k">class</span> <span class="nc">User</span>
</span><span class='line'>  <span class="k">def</span> <span class="nf">notifications</span>
</span><span class='line'>    <span class="n">notifications</span> <span class="o">=</span> <span class="n">table_reader</span>
</span><span class='line'>      <span class="o">.</span><span class="n">where</span><span class="p">(</span><span class="s2">&quot;notifications&quot;</span><span class="p">)</span> <span class="k">do</span> <span class="o">|</span><span class="n">x</span><span class="o">|</span>
</span><span class='line'>        <span class="p">(</span><span class="n">x</span><span class="o">[</span><span class="mi">1</span><span class="o">][</span><span class="mi">0</span><span class="o">]</span> <span class="o">==</span> <span class="s2">&quot;followed_notification&quot;</span> <span class="o">&amp;&amp;</span> <span class="n">x</span><span class="o">[</span><span class="mi">1</span><span class="o">][</span><span class="mi">2</span><span class="o">]</span> <span class="o">==</span> <span class="nb">id</span><span class="o">.</span><span class="n">to_s</span><span class="p">)</span> <span class="o">||</span>
</span><span class='line'>            <span class="p">(</span><span class="n">x</span><span class="o">[</span><span class="mi">1</span><span class="o">][</span><span class="mi">0</span><span class="o">]</span> <span class="o">==</span> <span class="s2">&quot;favorited_notification&quot;</span> <span class="o">&amp;&amp;</span> <span class="n">status_update_finder</span><span class="o">.</span><span class="n">find</span><span class="p">(</span><span class="n">x</span><span class="o">[</span><span class="mi">1</span><span class="o">][</span><span class="mi">2</span><span class="o">].</span><span class="n">to_i</span><span class="p">)</span><span class="o">.</span><span class="n">owner_id</span> <span class="o">==</span> <span class="nb">id</span><span class="p">)</span> <span class="o">||</span>
</span><span class='line'>            <span class="p">(</span><span class="n">x</span><span class="o">[</span><span class="mi">1</span><span class="o">][</span><span class="mi">0</span><span class="o">]</span> <span class="o">==</span> <span class="s2">&quot;replied_notification&quot;</span> <span class="o">&amp;&amp;</span> <span class="n">status_update_finder</span><span class="o">.</span><span class="n">find</span><span class="p">(</span><span class="n">x</span><span class="o">[</span><span class="mi">1</span><span class="o">][</span><span class="mi">2</span><span class="o">].</span><span class="n">to_i</span><span class="p">)</span><span class="o">.</span><span class="n">owner_id</span> <span class="o">==</span> <span class="nb">id</span><span class="p">)</span> <span class="o">||</span>
</span><span class='line'>            <span class="p">(</span><span class="n">x</span><span class="o">[</span><span class="mi">1</span><span class="o">][</span><span class="mi">0</span><span class="o">]</span> <span class="o">==</span> <span class="s2">&quot;reposted_notification&quot;</span> <span class="o">&amp;&amp;</span> <span class="n">status_update_finder</span><span class="o">.</span><span class="n">find</span><span class="p">(</span><span class="n">x</span><span class="o">[</span><span class="mi">1</span><span class="o">][</span><span class="mi">2</span><span class="o">].</span><span class="n">to_i</span><span class="p">)</span><span class="o">.</span><span class="n">owner_id</span> <span class="o">==</span> <span class="nb">id</span><span class="p">)</span>
</span><span class='line'>      <span class="k">end</span><span class="o">.</span><span class="n">map</span> <span class="k">do</span> <span class="o">|</span><span class="n">row</span><span class="o">|</span>
</span><span class='line'>        <span class="nb">id</span><span class="p">,</span> <span class="n">values</span> <span class="o">=</span> <span class="n">row</span>
</span><span class='line'>        <span class="n">kind</span> <span class="o">=</span> <span class="n">values</span><span class="o">[</span><span class="mi">0</span><span class="o">]</span>
</span><span class='line'>
</span><span class='line'>        <span class="k">if</span> <span class="n">kind</span> <span class="o">==</span> <span class="s2">&quot;followed_notification&quot;</span>
</span><span class='line'>          <span class="p">{</span>
</span><span class='line'>              <span class="ss">kind</span><span class="p">:</span> <span class="n">kind</span><span class="p">,</span>
</span><span class='line'>              <span class="ss">follower</span><span class="p">:</span> <span class="n">user_finder</span><span class="o">.</span><span class="n">find</span><span class="p">(</span><span class="n">values</span><span class="o">[</span><span class="mi">1</span><span class="o">].</span><span class="n">to_i</span><span class="p">),</span>
</span><span class='line'>              <span class="ss">user</span><span class="p">:</span> <span class="n">user_finder</span><span class="o">.</span><span class="n">find</span><span class="p">(</span><span class="n">values</span><span class="o">[</span><span class="mi">2</span><span class="o">].</span><span class="n">to_i</span><span class="p">),</span>
</span><span class='line'>          <span class="p">}</span>
</span><span class='line'>        <span class="k">elsif</span> <span class="n">kind</span> <span class="o">==</span> <span class="s2">&quot;favorited_notification&quot;</span>
</span><span class='line'>          <span class="p">{</span>
</span><span class='line'>              <span class="ss">kind</span><span class="p">:</span> <span class="n">kind</span><span class="p">,</span>
</span><span class='line'>              <span class="ss">favoriter</span><span class="p">:</span> <span class="n">user_finder</span><span class="o">.</span><span class="n">find</span><span class="p">(</span><span class="n">values</span><span class="o">[</span><span class="mi">1</span><span class="o">].</span><span class="n">to_i</span><span class="p">),</span>
</span><span class='line'>              <span class="ss">status_update</span><span class="p">:</span> <span class="n">status_update_finder</span><span class="o">.</span><span class="n">find</span><span class="p">(</span><span class="n">values</span><span class="o">[</span><span class="mi">2</span><span class="o">].</span><span class="n">to_i</span><span class="p">),</span>
</span><span class='line'>          <span class="p">}</span>
</span><span class='line'>        <span class="k">elsif</span> <span class="n">kind</span> <span class="o">==</span> <span class="s2">&quot;replied_notification&quot;</span>
</span><span class='line'>          <span class="p">{</span>
</span><span class='line'>              <span class="ss">kind</span><span class="p">:</span> <span class="n">kind</span><span class="p">,</span>
</span><span class='line'>              <span class="ss">sender</span><span class="p">:</span> <span class="n">user_finder</span><span class="o">.</span><span class="n">find</span><span class="p">(</span><span class="n">values</span><span class="o">[</span><span class="mi">1</span><span class="o">].</span><span class="n">to_i</span><span class="p">),</span>
</span><span class='line'>              <span class="ss">status_update</span><span class="p">:</span> <span class="n">status_update_finder</span><span class="o">.</span><span class="n">find</span><span class="p">(</span><span class="n">values</span><span class="o">[</span><span class="mi">2</span><span class="o">].</span><span class="n">to_i</span><span class="p">),</span>
</span><span class='line'>              <span class="ss">reply</span><span class="p">:</span> <span class="n">status_update_finder</span><span class="o">.</span><span class="n">find</span><span class="p">(</span><span class="n">values</span><span class="o">[</span><span class="mi">3</span><span class="o">].</span><span class="n">to_i</span><span class="p">),</span>
</span><span class='line'>          <span class="p">}</span>
</span><span class='line'>        <span class="k">elsif</span> <span class="n">kind</span> <span class="o">==</span> <span class="s2">&quot;reposted_notification&quot;</span>
</span><span class='line'>          <span class="p">{</span>
</span><span class='line'>              <span class="ss">kind</span><span class="p">:</span> <span class="n">kind</span><span class="p">,</span>
</span><span class='line'>              <span class="ss">reposter</span><span class="p">:</span> <span class="n">user_finder</span><span class="o">.</span><span class="n">find</span><span class="p">(</span><span class="n">values</span><span class="o">[</span><span class="mi">1</span><span class="o">].</span><span class="n">to_i</span><span class="p">),</span>
</span><span class='line'>              <span class="ss">status_update</span><span class="p">:</span> <span class="n">status_update_finder</span><span class="o">.</span><span class="n">find</span><span class="p">(</span><span class="n">values</span><span class="o">[</span><span class="mi">2</span><span class="o">].</span><span class="n">to_i</span><span class="p">),</span>
</span><span class='line'>          <span class="p">}</span>
</span><span class='line'>        <span class="k">end</span>
</span><span class='line'>      <span class="k">end</span>
</span><span class='line'>
</span><span class='line'>    <span class="n">event_tagger</span><span class="o">.</span><span class="n">tag</span><span class="p">({</span><span class="nb">name</span><span class="p">:</span> <span class="s2">&quot;fetch_notifications&quot;</span><span class="p">,</span> <span class="ss">count</span><span class="p">:</span> <span class="n">notifications</span><span class="o">.</span><span class="n">count</span><span class="p">})</span>
</span><span class='line'>    <span class="n">notifications</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'>
</span><span class='line'>  <span class="c1"># ...</span>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>


<p>Structure and logic of the function did not change at all, but now all the dependencies are injectable and can be used to test it nicely. That concludes the first step - narrow &amp; isolate. Now it is time to select a group of knowledge bits that we would like to cover with tests. Since we want to change how <code>followed_notification</code> is behaving, we might as well start checking there.</p>

<div class="v2-subscribe--inline">
  




  


<div class="mc_embed_signup">
  <form action="//tddfellow.us14.list-manage.com/subscribe/post?u=535a10a8c0274c9a7ebac4f34&amp;id=7f9f94015a" method="post" class="mc-embedded-subscribe-form" name="mc-embedded-subscribe-form" class="validate" target="_blank" novalidate>
    <div class="mc_embed_signup_scroll">
      <h3>Want more articles like this delivered to your inbox?</h3>
      <div class="mc-field-group">
        <!-- real people should not fill this in and expect good things - do not remove this or risk form bot signups-->
        <div style="position: absolute; left: -5000px;" aria-hidden="true"><input type="text" name="b_535a10a8c0274c9a7ebac4f34_7f9f94015a" tabindex="-1" value=""></div>
        <input type="email" value="" name="EMAIL" class="required email mce-EMAIL" placeholder="Enter your email">
        <input type="submit" value="Subscribe" name="subscribe" class="button mc-embedded-subscribe">
      </div>
      <div class="">
        <em>(we respect your privacy, unsubscribe at any time)</em>
      </div>
    </div>
  </form>
</div>


</div>


<h3>Trying to Understand &amp; Writing 1st Test</h3>

<p>The group of knowledge bits that are related to <code>followed_notification</code> looks like this:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="n">notifications</span> <span class="o">=</span> <span class="n">table_reader</span>
</span><span class='line'>  <span class="o">.</span><span class="n">where</span><span class="p">(</span><span class="s2">&quot;notifications&quot;</span><span class="p">)</span> <span class="k">do</span> <span class="o">|</span><span class="n">x</span><span class="o">|</span>
</span><span class='line'>    <span class="p">(</span><span class="n">x</span><span class="o">[</span><span class="mi">1</span><span class="o">][</span><span class="mi">0</span><span class="o">]</span> <span class="o">==</span> <span class="s2">&quot;followed_notification&quot;</span> <span class="o">&amp;&amp;</span> <span class="n">x</span><span class="o">[</span><span class="mi">1</span><span class="o">][</span><span class="mi">2</span><span class="o">]</span> <span class="o">==</span> <span class="nb">id</span><span class="o">.</span><span class="n">to_s</span><span class="p">)</span> <span class="o">||</span>
</span><span class='line'>    <span class="c1"># ...</span>
</span><span class='line'>  <span class="k">end</span><span class="o">.</span><span class="n">map</span> <span class="k">do</span> <span class="o">|</span><span class="n">row</span><span class="o">|</span>
</span><span class='line'>    <span class="nb">id</span><span class="p">,</span> <span class="n">values</span> <span class="o">=</span> <span class="n">row</span>
</span><span class='line'>    <span class="n">kind</span> <span class="o">=</span> <span class="n">values</span><span class="o">[</span><span class="mi">0</span><span class="o">]</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">if</span> <span class="n">kind</span> <span class="o">==</span> <span class="s2">&quot;followed_notification&quot;</span>
</span><span class='line'>      <span class="p">{</span>
</span><span class='line'>          <span class="ss">kind</span><span class="p">:</span> <span class="n">kind</span><span class="p">,</span>
</span><span class='line'>          <span class="ss">follower</span><span class="p">:</span> <span class="n">user_finder</span><span class="o">.</span><span class="n">find</span><span class="p">(</span><span class="n">values</span><span class="o">[</span><span class="mi">1</span><span class="o">].</span><span class="n">to_i</span><span class="p">),</span>
</span><span class='line'>          <span class="ss">user</span><span class="p">:</span> <span class="n">user_finder</span><span class="o">.</span><span class="n">find</span><span class="p">(</span><span class="n">values</span><span class="o">[</span><span class="mi">2</span><span class="o">].</span><span class="n">to_i</span><span class="p">),</span>
</span><span class='line'>      <span class="p">}</span>
</span><span class='line'>    <span class="k">elsif</span> <span class="c1">#...</span>
</span><span class='line'>      <span class="c1"># ...</span>
</span><span class='line'>    <span class="k">end</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'>
</span><span class='line'><span class="c1"># ...</span>
</span><span class='line'><span class="n">notifications</span>
</span></code></pre></td></tr></table></div></figure>


<p>Now we want to write a test. At the first thought, something like:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="n">it</span> <span class="s2">&quot;obtains followed notifications for the user&quot;</span> <span class="k">do</span>
</span><span class='line'>  <span class="c1"># first create a user with all fakes (extracted to a helper method)</span>
</span><span class='line'>  <span class="n">user</span> <span class="o">=</span> <span class="n">create_user_with_fakes</span>
</span><span class='line'>
</span><span class='line'>  <span class="c1"># then instruct our table reader fake to return prepared data</span>
</span><span class='line'>  <span class="n">fake_table_reader</span>
</span><span class='line'>      <span class="o">.</span><span class="n">insert</span><span class="p">(</span><span class="s2">&quot;notifications&quot;</span><span class="p">,</span>
</span><span class='line'>              <span class="o">[</span><span class="mi">1001</span><span class="p">,</span> <span class="o">[</span><span class="s2">&quot;followed_notification&quot;</span><span class="p">,</span> <span class="mi">2001</span><span class="p">,</span> <span class="mi">3001</span><span class="o">]]</span><span class="p">)</span>
</span><span class='line'>
</span><span class='line'>  <span class="c1"># and expect that we have exactly one notification</span>
</span><span class='line'>  <span class="n">expect</span><span class="p">(</span><span class="n">user</span><span class="o">.</span><span class="n">notifications</span><span class="o">.</span><span class="n">count</span><span class="p">)</span><span class="o">.</span><span class="n">to</span> <span class="n">eq</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span>
</span><span class='line'><span class="k">end</span>
</span><span class='line'>
</span><span class='line'><span class="k">def</span> <span class="nf">create_user_with_fakes</span>
</span><span class='line'>  <span class="no">User</span><span class="o">.</span><span class="n">new</span><span class="p">(</span><span class="mi">567</span><span class="p">)</span>
</span><span class='line'>      <span class="o">.</span><span class="n">with_table_reader</span><span class="p">(</span><span class="n">fake_table_reader</span><span class="p">)</span>
</span><span class='line'>      <span class="o">.</span><span class="n">with_event_tagger</span><span class="p">(</span><span class="n">fake_event_tagger</span><span class="p">)</span>
</span><span class='line'>      <span class="o">.</span><span class="n">with_user_finder</span><span class="p">(</span><span class="n">fake_user_finder</span><span class="p">)</span>
</span><span class='line'>      <span class="o">.</span><span class="n">with_status_update_finder</span><span class="p">(</span><span class="n">fake_status_update_finder</span><span class="p">)</span>
</span><span class='line'><span class="k">end</span>
</span><span class='line'>
</span><span class='line'><span class="k">class</span> <span class="nc">FakeTableReader</span>
</span><span class='line'>  <span class="k">def</span> <span class="nf">insert</span><span class="p">(</span><span class="n">table_name</span><span class="p">,</span> <span class="n">row</span><span class="p">)</span>
</span><span class='line'>    <span class="n">tables</span><span class="p">(</span><span class="n">table_name</span><span class="p">)</span> <span class="o">&lt;&lt;</span> <span class="n">row</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">def</span> <span class="nf">tables</span><span class="p">(</span><span class="n">table_name</span><span class="p">)</span>
</span><span class='line'>    <span class="vi">@tables</span> <span class="o">||=</span> <span class="p">{}</span>
</span><span class='line'>    <span class="vi">@tables</span><span class="o">[</span><span class="n">table_name</span><span class="o">]</span> <span class="o">||=</span> <span class="o">[]</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">def</span> <span class="nf">where</span><span class="p">(</span><span class="n">table_name</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">filter</span><span class="p">)</span>
</span><span class='line'>    <span class="n">tables</span><span class="p">(</span><span class="n">table_name</span><span class="p">)</span><span class="o">.</span><span class="n">select</span><span class="p">(</span><span class="o">&amp;</span><span class="n">filter</span><span class="p">)</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>


<h3>Making It Pass</h3>

<p>This test fails right away - we don&rsquo;t have any notifications. This is strange. Let&rsquo;s take a closer look on the filtering that we are doing:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="p">(</span><span class="n">x</span><span class="o">[</span><span class="mi">1</span><span class="o">][</span><span class="mi">0</span><span class="o">]</span> <span class="o">==</span> <span class="s2">&quot;followed_notification&quot;</span> <span class="o">&amp;&amp;</span> <span class="n">x</span><span class="o">[</span><span class="mi">1</span><span class="o">][</span><span class="mi">2</span><span class="o">]</span> <span class="o">==</span> <span class="nb">id</span><span class="o">.</span><span class="n">to_s</span><span class="p">)</span> <span class="o">||</span>
</span></code></pre></td></tr></table></div></figure>


<p>I believe, we have satisfied the first part of this condition, but not the second one. The user id is not the same as the 3rd element of this row. Let&rsquo;s make them same:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="n">fake_table_reader</span>
</span><span class='line'>    <span class="o">.</span><span class="n">insert</span><span class="p">(</span><span class="s2">&quot;notifications&quot;</span><span class="p">,</span>
</span><span class='line'>            <span class="o">[</span><span class="mi">1001</span><span class="p">,</span> <span class="o">[</span><span class="s2">&quot;followed_notification&quot;</span><span class="p">,</span> <span class="mi">2001</span><span class="p">,</span> <span class="mi">567</span><span class="o">]]</span><span class="p">)</span>
</span><span class='line'>                                               <span class="c1"># ^ here ^</span>
</span></code></pre></td></tr></table></div></figure>


<p>This fails again! This code just keeps proving our assumptions wrong. I think we need to take a careful look at that <code>it.to_s</code>. <code>.to_s</code> is a conversion to string, so the foreign key is stored as a string (who could have thought?). Let&rsquo;s try to make it work:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="n">fake_table_reader</span>
</span><span class='line'>    <span class="o">.</span><span class="n">insert</span><span class="p">(</span><span class="s2">&quot;notifications&quot;</span><span class="p">,</span>
</span><span class='line'>            <span class="o">[</span><span class="mi">1001</span><span class="p">,</span> <span class="o">[</span><span class="s2">&quot;followed_notification&quot;</span><span class="p">,</span> <span class="mi">2001</span><span class="p">,</span> <span class="s2">&quot;567&quot;</span><span class="o">]]</span><span class="p">)</span>
</span><span class='line'>                                                <span class="c1"># ^ here ^</span>
</span></code></pre></td></tr></table></div></figure>


<h3>Applying Mutational Testing</h3>

<p>If we run our tests, they pass! Great, now we know that this function is capable of obtaining some followed notifications. Of course, our coverage right now is super small. Let&rsquo;s apply mutational testing to it. We should start from the condition:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="p">(</span><span class="n">x</span><span class="o">[</span><span class="mi">1</span><span class="o">][</span><span class="mi">0</span><span class="o">]</span> <span class="o">==</span> <span class="s2">&quot;followed_notification&quot;</span> <span class="o">&amp;&amp;</span> <span class="n">x</span><span class="o">[</span><span class="mi">1</span><span class="o">][</span><span class="mi">2</span><span class="o">]</span> <span class="o">==</span> <span class="nb">id</span><span class="o">.</span><span class="n">to_s</span><span class="p">)</span> <span class="o">||</span>
</span></code></pre></td></tr></table></div></figure>


<p>First, let&rsquo;s replace the whole thing with <code>false</code>:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="kp">false</span> <span class="o">||</span>
</span></code></pre></td></tr></table></div></figure>


<p>The test fails - mutant does not survive - our tests are covering for this mutation. Let&rsquo;s try another one: replace the whole thing with <code>true</code>:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="kp">true</span> <span class="o">||</span>
</span></code></pre></td></tr></table></div></figure>


<p>Our tests pass - mutant survives - this is a failing test for our tests. In this case, it is reasonable to write a new test for a case, when the full filtering expression should yield <code>false</code> - when we have notifications of an invalid kind:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="n">it</span> <span class="s2">&quot;ignores notifications of an invalid kind&quot;</span> <span class="k">do</span>
</span><span class='line'>  <span class="n">user</span> <span class="o">=</span> <span class="n">create_user_with_fakes</span>
</span><span class='line'>
</span><span class='line'>  <span class="n">fake_table_reader</span>
</span><span class='line'>      <span class="o">.</span><span class="n">insert</span><span class="p">(</span><span class="s2">&quot;notifications&quot;</span><span class="p">,</span>
</span><span class='line'>              <span class="o">[</span><span class="mi">1001</span><span class="p">,</span> <span class="o">[</span><span class="s2">&quot;invalid&quot;</span><span class="p">,</span> <span class="mi">2001</span><span class="p">,</span> <span class="s2">&quot;567&quot;</span><span class="o">]]</span><span class="p">)</span>
</span><span class='line'>
</span><span class='line'>  <span class="n">expect</span><span class="p">(</span><span class="n">user</span><span class="o">.</span><span class="n">notifications</span><span class="o">.</span><span class="n">count</span><span class="p">)</span><span class="o">.</span><span class="n">to</span> <span class="n">eq</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>


<p>As a result, we should not get any notifications. After running, we see that our test fail. Great! This mutant no longer survives. Let&rsquo;s see if our tests will pass when we undo the mutation:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="p">(</span><span class="n">x</span><span class="o">[</span><span class="mi">1</span><span class="o">][</span><span class="mi">0</span><span class="o">]</span> <span class="o">==</span> <span class="s2">&quot;followed_notification&quot;</span> <span class="o">&amp;&amp;</span> <span class="n">x</span><span class="o">[</span><span class="mi">1</span><span class="o">][</span><span class="mi">2</span><span class="o">]</span> <span class="o">==</span> <span class="nb">id</span><span class="o">.</span><span class="n">to_s</span><span class="p">)</span> <span class="o">||</span>
</span></code></pre></td></tr></table></div></figure>


<p>And they all pass! Next mutation is inverting the whole condition:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="o">!</span> <span class="p">(</span><span class="n">x</span><span class="o">[</span><span class="mi">1</span><span class="o">][</span><span class="mi">0</span><span class="o">]</span> <span class="o">==</span> <span class="s2">&quot;followed_notification&quot;</span> <span class="o">&amp;&amp;</span> <span class="n">x</span><span class="o">[</span><span class="mi">1</span><span class="o">][</span><span class="mi">2</span><span class="o">]</span> <span class="o">==</span> <span class="nb">id</span><span class="o">.</span><span class="n">to_s</span><span class="p">)</span> <span class="o">||</span>
</span></code></pre></td></tr></table></div></figure>


<p>All our tests are RED. Which means that this mutant does not survive and the test for our test is green. Now, we should dig deeper into the parts of the condition itself:</p>

<ul>
<li><code>x[1][0] == "followed_notification"</code>: replacing with <code>true</code>, <code>false</code>, and inverting it; also, changing numeric and string constants; These all changes did not produce any surviving mutants, so we do not need to introduce new tests.</li>
<li><code>x[1][2] == id.to_s</code>: replacing with <code>true</code>, <code>false</code> and inverting it; also, changing numeric constants.</li>
</ul>


<p>Replacing <code>x[1][2] == id.to_s</code> with <code>true</code>, apparently, leaves all our tests passing - a mutant that survives - a failing test for our test suite. It is time to add this test - when we have notifications of some different user:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="n">it</span> <span class="s2">&quot;ignores notifications of different user&quot;</span> <span class="k">do</span>
</span><span class='line'>  <span class="n">user</span> <span class="o">=</span> <span class="n">create_user_with_fakes</span>
</span><span class='line'>
</span><span class='line'>  <span class="n">fake_table_reader</span>
</span><span class='line'>      <span class="o">.</span><span class="n">insert</span><span class="p">(</span><span class="s2">&quot;notifications&quot;</span><span class="p">,</span>
</span><span class='line'>              <span class="o">[</span><span class="mi">1001</span><span class="p">,</span> <span class="o">[</span><span class="s2">&quot;followed_notification&quot;</span><span class="p">,</span> <span class="mi">2001</span><span class="p">,</span> <span class="s2">&quot;other user&quot;</span><span class="o">]]</span><span class="p">)</span>
</span><span class='line'>                                                   <span class="c1"># ^   here   ^</span>
</span><span class='line'>
</span><span class='line'>  <span class="n">expect</span><span class="p">(</span><span class="n">user</span><span class="o">.</span><span class="n">notifications</span><span class="o">.</span><span class="n">count</span><span class="p">)</span><span class="o">.</span><span class="n">to</span> <span class="n">eq</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>


<p>As you can see, having a record with the different user id (in this case, even nonsensical user id) makes our test fail, which means that this mutant no longer survives. Let&rsquo;s see if undoing the mutation will turn our tests GREEN:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="p">(</span><span class="o">.</span><span class="n">.</span><span class="o">.</span> <span class="o">&amp;&amp;</span> <span class="n">x</span><span class="o">[</span><span class="mi">1</span><span class="o">][</span><span class="mi">2</span><span class="o">]</span> <span class="o">==</span> <span class="nb">id</span><span class="o">.</span><span class="n">to_s</span><span class="p">)</span> <span class="o">||</span>
</span></code></pre></td></tr></table></div></figure>


<p>All our tests pass again. I think we have finished testing the condition in the filter. I would not touch the conditions that are related to different kinds of notifications, as we want to introduce changes only to &ldquo;Followed&rdquo; notifications. So we can dig further into the logic of our group of knowledge bits:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="nb">id</span><span class="p">,</span> <span class="n">values</span> <span class="o">=</span> <span class="n">row</span>
</span><span class='line'><span class="n">kind</span> <span class="o">=</span> <span class="n">values</span><span class="o">[</span><span class="mi">0</span><span class="o">]</span>
</span><span class='line'>
</span><span class='line'><span class="k">if</span> <span class="n">kind</span> <span class="o">==</span> <span class="s2">&quot;followed_notification&quot;</span>
</span><span class='line'>  <span class="p">{</span>
</span><span class='line'>      <span class="ss">kind</span><span class="p">:</span> <span class="n">kind</span><span class="p">,</span>
</span><span class='line'>      <span class="ss">follower</span><span class="p">:</span> <span class="n">user_finder</span><span class="o">.</span><span class="n">find</span><span class="p">(</span><span class="n">values</span><span class="o">[</span><span class="mi">1</span><span class="o">].</span><span class="n">to_i</span><span class="p">),</span>
</span><span class='line'>      <span class="ss">user</span><span class="p">:</span> <span class="n">user_finder</span><span class="o">.</span><span class="n">find</span><span class="p">(</span><span class="n">values</span><span class="o">[</span><span class="mi">2</span><span class="o">].</span><span class="n">to_i</span><span class="p">),</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'><span class="k">elsif</span> <span class="c1">#...</span>
</span><span class='line'>  <span class="c1"># ...</span>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>


<p>So, we can see that we split the row into its <code>id</code> and all the other values of the notification record. Apparently, the first value is responsible for the kind, where we are switching on it to construct correct object (in this case just a lump of data - hash map). So let&rsquo;s try to mutate the numeric constant in <code>kind = values[0]</code>:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="n">kind</span> <span class="o">=</span> <span class="n">values</span><span class="o">[</span><span class="mi">1</span><span class="o">]</span>
</span><span class='line'>          <span class="c1">#  ^^^</span>
</span></code></pre></td></tr></table></div></figure>


<p>All our tests still pass. That is a failing test for our test suite. We ought to write a new test now. Where we should verify that it constructs correct lumps of data:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="n">it</span> <span class="s2">&quot;constructs correct followed notification&quot;</span> <span class="k">do</span>
</span><span class='line'>  <span class="n">user</span> <span class="o">=</span> <span class="n">create_user_with_fakes</span>
</span><span class='line'>
</span><span class='line'>  <span class="n">fake_table_reader</span>
</span><span class='line'>      <span class="o">.</span><span class="n">insert</span><span class="p">(</span><span class="s2">&quot;notifications&quot;</span><span class="p">,</span>
</span><span class='line'>              <span class="o">[</span><span class="mi">1001</span><span class="p">,</span> <span class="o">[</span><span class="s2">&quot;followed_notification&quot;</span><span class="p">,</span> <span class="mi">2001</span><span class="p">,</span> <span class="s2">&quot;567&quot;</span><span class="o">]]</span><span class="p">)</span>
</span><span class='line'>
</span><span class='line'>  <span class="n">expect</span><span class="p">(</span><span class="n">user</span><span class="o">.</span><span class="n">notifications</span><span class="o">[</span><span class="mi">0</span><span class="o">][</span><span class="ss">:kind</span><span class="o">]</span><span class="p">)</span><span class="o">.</span><span class="n">to</span> <span class="n">eq</span><span class="p">(</span><span class="s2">&quot;followed_notification&quot;</span><span class="p">)</span>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>


<p>This test fails, because our <code>user.notifications[0]</code> Is <code>nil</code>, because none of <code>if</code> or <code>elsif</code> matched the <code>kind</code> variable and in Ruby, by default any function returns a <code>nil</code> value. This failing test means that we no longer have surviving mutant and let&rsquo;s see if undoing that mutation will make our tests pass:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="n">kind</span> <span class="o">=</span> <span class="n">values</span><span class="o">[</span><span class="mi">0</span><span class="o">]</span>
</span><span class='line'>          <span class="c1">#  ^^^</span>
</span></code></pre></td></tr></table></div></figure>


<p>It does, all our tests are green now. We should continue like this until we understand code enough and have enough confidence in our tests so that we can make our desired change to the system. When we think we have finished, we should integrate isolated code back to the legacy system, leaving all the fakes and injection capabilities in place. We were separating this code only to make sure, that we are not calling any dependencies on accident (while they just work silently). While integrating it back we, of course, get rid of <code>fail "NAME:nope"</code> implementations of collaborators. With such approach, integrating the code back should be as simple as copy-pasting the test suite code and production code (function under the test, and injecting facilities) without copying always-failing collaborators.</p>

<p>We will have to wrap up the example, and if you, my reader, would like to continue applying Explorative TDD to this code, you can find the code here: <a href="https://github.com/waterlink/explorative-tdd-blog-post">https://github.com/waterlink/explorative-tdd-blog-post</a> (specifically, <code>spec/user_spec.rb</code>). The function originates from this example project: <a href="https://github.com/waterlink/lemon">https://github.com/waterlink/lemon</a></p>

<h2>Can Explorative TDD Help Me Outside of Legacy Code?</h2>

<p>The answer is yes! I use Explorative TDD (as well as mutational testing) in following cases:</p>

<ul>
<li>During big refactorings, such as Extract class/module/package. The technique helps you quickly understand which tests have to be moved as well to the new test suite (only if you want to transfer them).</li>
<li>When refactoring tests. The technique helps you to verify if your tests are still working as they are intended to and if they are still semantically stable (they catch a majority of mutants).</li>
<li>To measure rigidity of test-to-code coupling. If a single mutation leads to half of your test suite failing (even irrelevant tests) - tests need refactoring.</li>
</ul>


<h2>Bottom Line</h2>

<p>Today we have learned about concepts like &ldquo;Knowledge in production code&rdquo; and &ldquo;Mutation.&rdquo; Also, we learned what Test Semantic Stability is the best code coverage metric. We have seen Mutational Testing and Explorative TDD techniques at work. We could start applying these techniques (after some practice) to stop fearing the legacy code and just handle it as some tedious routine operation.</p>

<h2>Thanks</h2>

<p>Thank you for reading, my dear reader. If you liked it, please share this article on social networks and follow me on twitter: <a href="https://twitter.com/tdd_fellow">@tdd_fellow</a>.</p>

<p>If you have any questions or feedback for me, don’t hesitate to reach me out on Twitter: <a href="https://twitter.com/tdd_fellow">@tdd_fellow</a>.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Build Your Own Testing Framework. Part 5]]></title>
    <link href="http://www.tddfellow.com/blog/2016/11/13/build-your-own-testing-framework-part-5/"/>
    <updated>2016-11-13T12:50:51+01:00</updated>
    <id>http://www.tddfellow.com/blog/2016/11/13/build-your-own-testing-framework-part-5</id>
    <content type="html"><![CDATA[<p>Welcome back to the new issue of &ldquo;Build Your Own Testing Framework&rdquo; series! Did you notice, that out testing framework quits on the first failure? It probably should run all tests, collect all failures and present them nicely. This is what we are going to accomplish today:</p>

<ul>
<li>Make sure all tests run even when there is a failure.</li>
<li>Make sure exit code is correct.</li>
</ul>


<!-- more -->


<p>This article is the fifth one of the series “Build Your Own Testing Framework” so make sure to stick around for next parts! Find all posts of these series can <a href="http://www.tddfellow.com/blog/categories/build-your-own-testing-framework/">here</a>.</p>

<p>Shall we get started?</p>

<h2>Catch and report a test failure</h2>

<p>Our test suite should no longer bubble up any exceptions. We can achieve that by making an appropriate assertion. And also we should verify that other tests execute after the failure:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="nx">runTestSuite</span><span class="p">(</span><span class="kd">function</span> <span class="nx">FailureTest</span><span class="p">(</span><span class="nx">t</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">this</span><span class="p">.</span><span class="nx">testItDoesNotBubbleUpExceptions</span> <span class="o">=</span> <span class="kd">function</span> <span class="p">()</span> <span class="p">{</span>
</span><span class='line'>        <span class="kd">var</span> <span class="nx">aSpy</span> <span class="o">=</span> <span class="nx">t</span><span class="p">.</span><span class="nx">spy</span><span class="p">();</span>
</span><span class='line'>
</span><span class='line'>        <span class="nx">t</span><span class="p">.</span><span class="nx">assertNotThrow</span><span class="p">(</span><span class="kd">function</span> <span class="p">()</span> <span class="p">{</span>
</span><span class='line'>            <span class="nx">runTestSuite</span><span class="p">(</span><span class="kd">function</span> <span class="p">(</span><span class="nx">t</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>                <span class="k">this</span><span class="p">.</span><span class="nx">testFailure</span> <span class="o">=</span> <span class="kd">function</span> <span class="p">()</span> <span class="p">{</span>
</span><span class='line'>                    <span class="nx">t</span><span class="p">.</span><span class="nx">assertTrue</span><span class="p">(</span><span class="kc">false</span><span class="p">);</span>
</span><span class='line'>                <span class="p">};</span>
</span><span class='line'>
</span><span class='line'>                <span class="k">this</span><span class="p">.</span><span class="nx">testSomething</span> <span class="o">=</span> <span class="nx">aSpy</span><span class="p">;</span>
</span><span class='line'>            <span class="p">});</span>
</span><span class='line'>        <span class="p">});</span>
</span><span class='line'>
</span><span class='line'>        <span class="nx">aSpy</span><span class="p">.</span><span class="nx">assertCalled</span><span class="p">();</span>
</span><span class='line'>    <span class="p">};</span>
</span><span class='line'><span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>


<p>As expected, this fails with an appropriate error <code>Error: Expected not to throw error, but thrown 'Expected to be true, but got false'</code> indicating that we are bubbling up all errors at the moment. Also, notice how the execution of the whole test suite stops at that point, and it just exits the program with error code <code>1</code>. A simple <code>try .. catch</code> block will fix the issue:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="c1">// in runTestSuite function</span>
</span><span class='line'>    <span class="k">for</span> <span class="p">(</span><span class="kd">var</span> <span class="nx">testName</span> <span class="k">in</span> <span class="nx">testSuitePrototype</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>        <span class="k">if</span> <span class="p">(</span><span class="nx">testName</span><span class="p">.</span><span class="nx">match</span><span class="p">(</span><span class="sr">/^test/</span><span class="p">))</span> <span class="p">{</span>
</span><span class='line'>            <span class="nx">reporter</span><span class="p">.</span><span class="nx">reportTest</span><span class="p">(</span><span class="nx">testName</span><span class="p">);</span>
</span><span class='line'>            <span class="kd">var</span> <span class="nx">testSuite</span> <span class="o">=</span> <span class="nx">createTestSuite</span><span class="p">(</span><span class="nx">testSuiteConstructor</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>            <span class="k">try</span> <span class="p">{</span>
</span><span class='line'>                <span class="nx">testSuite</span><span class="p">[</span><span class="nx">testName</span><span class="p">]();</span>
</span><span class='line'>            <span class="p">}</span> <span class="k">catch</span> <span class="p">(</span><span class="nx">error</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>                <span class="c1">// do nothing, for now</span>
</span><span class='line'>            <span class="p">}</span>
</span><span class='line'>        <span class="p">}</span>
</span><span class='line'>    <span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>All tests now run successfully. This code is starting to become unreadable, so it is a good point to refactor. We will:</p>

<ul>
<li>Extract whole <code>try .. catch</code> as a function <code>runTest</code>. Its current responsibility is only to run the test and ignore any failure;</li>
<li>Extract contents of <code>if</code> statement that matches the test name as a function <code>handleTest</code>. Its responsibility is to report the test, create a fresh testSuite and kick off <code>runTest</code>;</li>
<li>Extract the whole <code>for</code> statement as <code>runAllTests</code>.</li>
</ul>


<p>Here is the final snippet of code:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="kd">function</span> <span class="nx">runTest</span><span class="p">(</span><span class="nx">testSuite</span><span class="p">,</span> <span class="nx">testName</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">try</span> <span class="p">{</span>
</span><span class='line'>        <span class="nx">testSuite</span><span class="p">[</span><span class="nx">testName</span><span class="p">]();</span>
</span><span class='line'>    <span class="p">}</span> <span class="k">catch</span> <span class="p">(</span><span class="nx">error</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>        <span class="c1">// do nothing, for now</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="kd">function</span> <span class="nx">handleTest</span><span class="p">(</span><span class="nx">reporter</span><span class="p">,</span> <span class="nx">testName</span><span class="p">,</span> <span class="nx">testSuiteConstructor</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="nx">reporter</span><span class="p">.</span><span class="nx">reportTest</span><span class="p">(</span><span class="nx">testName</span><span class="p">);</span>
</span><span class='line'>    <span class="nx">runTest</span><span class="p">(</span><span class="nx">createTestSuite</span><span class="p">(</span><span class="nx">testSuiteConstructor</span><span class="p">),</span> <span class="nx">testName</span><span class="p">);</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="kd">function</span> <span class="nx">runAllTests</span><span class="p">(</span><span class="nx">reporter</span><span class="p">,</span> <span class="nx">testSuitePrototype</span><span class="p">,</span> <span class="nx">testSuiteConstructor</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">for</span> <span class="p">(</span><span class="kd">var</span> <span class="nx">testName</span> <span class="k">in</span> <span class="nx">testSuitePrototype</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>        <span class="k">if</span> <span class="p">(</span><span class="nx">testName</span><span class="p">.</span><span class="nx">match</span><span class="p">(</span><span class="sr">/^test/</span><span class="p">))</span> <span class="p">{</span>
</span><span class='line'>            <span class="nx">handleTest</span><span class="p">(</span><span class="nx">reporter</span><span class="p">,</span> <span class="nx">testName</span><span class="p">,</span> <span class="nx">testSuiteConstructor</span><span class="p">);</span>
</span><span class='line'>        <span class="p">}</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="kd">function</span> <span class="nx">runTestSuite</span><span class="p">(</span><span class="nx">testSuiteConstructor</span><span class="p">,</span> <span class="nx">options</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="nx">options</span> <span class="o">=</span> <span class="nx">options</span> <span class="o">||</span> <span class="p">{};</span>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">reporter</span> <span class="o">=</span> <span class="nx">options</span><span class="p">.</span><span class="nx">reporter</span> <span class="o">||</span> <span class="k">new</span> <span class="nx">SimpleReporter</span><span class="p">();</span>
</span><span class='line'>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">testSuitePrototype</span> <span class="o">=</span> <span class="nx">createTestSuite</span><span class="p">(</span><span class="nx">testSuiteConstructor</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>    <span class="nx">reporter</span><span class="p">.</span><span class="nx">reportTestSuite</span><span class="p">(</span>
</span><span class='line'>        <span class="nx">getTestSuiteName</span><span class="p">(</span><span class="nx">testSuiteConstructor</span><span class="p">,</span> <span class="nx">testSuitePrototype</span><span class="p">)</span>
</span><span class='line'>    <span class="p">);</span>
</span><span class='line'>
</span><span class='line'>    <span class="nx">runAllTests</span><span class="p">(</span><span class="nx">reporter</span><span class="p">,</span> <span class="nx">testSuitePrototype</span><span class="p">,</span> <span class="nx">testSuiteConstructor</span><span class="p">);</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<h2>Exit with code 1</h2>

<p>Now, when at least one test fails in a suite of tests, the whole suite should fail (after running the rest of its tests). And the indicator of such failure should be an exit code of the process. Let&rsquo;s write a test:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="nx">runTestSuite</span><span class="p">(</span><span class="kd">function</span> <span class="nx">FailureTest</span><span class="p">(</span><span class="nx">t</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="c1">// ...</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">this</span><span class="p">.</span><span class="nx">testItExitsWithProcessCodeOne</span> <span class="o">=</span> <span class="kd">function</span> <span class="p">()</span> <span class="p">{</span>
</span><span class='line'>        <span class="kd">var</span> <span class="nx">processSpy</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">ProcessSpy</span><span class="p">();</span>
</span><span class='line'>
</span><span class='line'>        <span class="nx">runTestSuite</span><span class="p">(</span><span class="kd">function</span> <span class="p">(</span><span class="nx">t</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>            <span class="k">this</span><span class="p">.</span><span class="nx">testFailure</span> <span class="o">=</span> <span class="kd">function</span> <span class="p">()</span> <span class="p">{</span>
</span><span class='line'>                <span class="nx">t</span><span class="p">.</span><span class="nx">assertTrue</span><span class="p">(</span><span class="kc">false</span><span class="p">);</span>
</span><span class='line'>            <span class="p">};</span>
</span><span class='line'>        <span class="p">},</span> <span class="p">{</span><span class="nx">process</span><span class="o">:</span> <span class="nx">processSpy</span><span class="p">});</span>
</span><span class='line'>
</span><span class='line'>        <span class="nx">t</span><span class="p">.</span><span class="nx">assertEqual</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="nx">processSpy</span><span class="p">.</span><span class="nx">hasExitedWithCode</span><span class="p">);</span>
</span><span class='line'>    <span class="p">};</span>
</span><span class='line'><span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>


<p>As you might guess, we will need another object. It will be responsible for interaction with our process, i.e.: something that we can ask to &ldquo;exit with code 1.&rdquo; Because we can not ask our process to exit within the test run, we will have to create a spy. And we shall test-drive its functionality. There is something interesting that we should worry about before that - our test suite is passing currently.. but it shouldn&rsquo;t be!</p>

<p>Let&rsquo;s step back and think what just happened: clearly, we are writing the test, that can not possibly pass because we do not have <code>ProcessSpy</code> yet. So we are expecting a failure - we are expecting a thrown exception. That expectation is an important part of test-driven development: at all times we expect a very specific failure or we expect our tests to pass; if we do not receive a failure when expected and receive an unexpected failure, we should stop right there and think which part of our thinking and our assumptions is incorrect.</p>

<div class="v2-subscribe--inline">
  
  
  
  
  
  


<div class="mc_embed_signup">
  <form action="//tddfellow.us14.list-manage.com/subscribe/post?u=535a10a8c0274c9a7ebac4f34&amp;id=6b61a409a5" method="post" class="mc-embedded-subscribe-form" name="mc-embedded-subscribe-form" class="validate" target="_blank" novalidate>
    <div class="mc_embed_signup_scroll">
      <h3>Would You Like to Watch a Screencast with Me Implementing This?</h3>
      <div class="mc-field-group">
        <!-- real people should not fill this in and expect good things - do not remove this or risk form bot signups-->
        <div style="position: absolute; left: -5000px;" aria-hidden="true"><input type="text" name="b_535a10a8c0274c9a7ebac4f34_6b61a409a5" tabindex="-1" value=""></div>
        <input type="email" value="" name="EMAIL" class="required email mce-EMAIL" placeholder="Enter your email">
        <input type="submit" value="Claim video" name="subscribe" class="button mc-embedded-subscribe">
      </div>
      <div class="">
        <em>(we respect your privacy, unsubscribe at any time)</em>
      </div>
    </div>
  </form>
</div>

</div>


<p>Right now, tests do not fail, because we are ignoring all exceptions in our <code>try .. catch</code> that we introduced a couple of minutes ago. If we want to see failures again, let&rsquo;s modify <code>catch</code> block to just log all errors it receives:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="kd">function</span> <span class="nx">runTest</span><span class="p">(</span><span class="nx">testSuite</span><span class="p">,</span> <span class="nx">testName</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">try</span> <span class="p">{</span>
</span><span class='line'>        <span class="nx">testSuite</span><span class="p">[</span><span class="nx">testName</span><span class="p">]();</span>
</span><span class='line'>    <span class="p">}</span> <span class="k">catch</span> <span class="p">(</span><span class="nx">error</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>        <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">error</span><span class="p">);</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>Now our test suite outputs an expected error: <code>ReferenceError: ProcessSpy is not defined</code>. Also, it outputs some other failures that happen in our nested <code>runTestSuite</code> calls - we should fix them by providing <code>silenceFailures</code> option for nested <code>runTestSuite</code> call. We can focus now on the <code>ProcessSpy</code> failure and test-drive it:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
<span class='line-number'>37</span>
<span class='line-number'>38</span>
<span class='line-number'>39</span>
<span class='line-number'>40</span>
<span class='line-number'>41</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="nx">runTestSuite</span><span class="p">(</span><span class="kd">function</span> <span class="nx">ProcessSpy_BehaviorTest</span><span class="p">(</span><span class="nx">t</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">processSpy</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">ProcessSpy</span><span class="p">();</span>
</span><span class='line'><span class="p">});</span>
</span><span class='line'><span class="c1">// =&gt; ReferenceError: ProcessSpy is not defined</span>
</span><span class='line'>
</span><span class='line'><span class="kd">function</span> <span class="nx">ProcessSpy</span><span class="p">()</span> <span class="p">{}</span>
</span><span class='line'><span class="c1">// =&gt; PASS</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">this</span><span class="p">.</span><span class="nx">testHasExitedWithCode_initiallyIsNull</span> <span class="o">=</span> <span class="kd">function</span> <span class="p">()</span> <span class="p">{</span>
</span><span class='line'>        <span class="nx">t</span><span class="p">.</span><span class="nx">assertEqual</span><span class="p">(</span><span class="kc">null</span><span class="p">,</span> <span class="nx">processSpy</span><span class="p">.</span><span class="nx">hasExitedWithCode</span><span class="p">);</span>
</span><span class='line'>    <span class="p">};</span>
</span><span class='line'><span class="c1">// =&gt; Error: Expected to equal null, but got: undefined</span>
</span><span class='line'>
</span><span class='line'><span class="kd">function</span> <span class="nx">ProcessSpy</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">this</span><span class="p">.</span><span class="nx">hasExitedWithCode</span> <span class="o">=</span> <span class="kc">null</span><span class="p">;</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'><span class="c1">// =&gt; PASS</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">this</span><span class="p">.</span><span class="nx">testHasExitedWithCode_isZero_afterExitZeroCall</span> <span class="o">=</span> <span class="kd">function</span> <span class="p">()</span> <span class="p">{</span>
</span><span class='line'>        <span class="nx">processSpy</span><span class="p">.</span><span class="nx">exit</span><span class="p">(</span><span class="mi">0</span><span class="p">);</span>
</span><span class='line'>        <span class="nx">t</span><span class="p">.</span><span class="nx">assertEqual</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="nx">processSpy</span><span class="p">.</span><span class="nx">hasExitedWithCode</span><span class="p">);</span>
</span><span class='line'>    <span class="p">};</span>
</span><span class='line'><span class="c1">// =&gt; TypeError: processSpy.exit is not a function</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// in ProcessSpy</span>
</span><span class='line'>    <span class="k">this</span><span class="p">.</span><span class="nx">exit</span> <span class="o">=</span> <span class="kd">function</span> <span class="p">(</span><span class="nx">code</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>        <span class="k">this</span><span class="p">.</span><span class="nx">hasExitedWithCode</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
</span><span class='line'>    <span class="p">};</span>
</span><span class='line'><span class="c1">// =&gt; PASS</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">this</span><span class="p">.</span><span class="nx">testHasExitedWithCode_isOne_afterExitOneCall</span> <span class="o">=</span> <span class="kd">function</span> <span class="p">()</span> <span class="p">{</span>
</span><span class='line'>        <span class="nx">processSpy</span><span class="p">.</span><span class="nx">exit</span><span class="p">(</span><span class="mi">1</span><span class="p">);</span>
</span><span class='line'>        <span class="nx">t</span><span class="p">.</span><span class="nx">assertEqual</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="nx">processSpy</span><span class="p">.</span><span class="nx">hasExitedWithCode</span><span class="p">);</span>
</span><span class='line'>    <span class="p">};</span>
</span><span class='line'><span class="c1">// =&gt; Error: Expected to equal 1, but got: 0</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// in ProcessSpy</span>
</span><span class='line'>    <span class="k">this</span><span class="p">.</span><span class="nx">exit</span> <span class="o">=</span> <span class="kd">function</span> <span class="p">(</span><span class="nx">code</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>        <span class="k">this</span><span class="p">.</span><span class="nx">hasExitedWithCode</span> <span class="o">=</span> <span class="nx">code</span><span class="p">;</span>
</span><span class='line'>        <span class="c1">// changed 0 to code      ^here^</span>
</span><span class='line'>    <span class="p">};</span>
</span></code></pre></td></tr></table></div></figure>


<p>I think we have finished test-driving the functionality of <code>ProcessSpy</code>. It is time to get back to our failing test for a failure resulting in an exit with code 1. When we run this test suite, we are getting the following error message: <code>Error: Expected to equal 1, but got: null</code>.&lsquo; To pass this test, we will need to store the fact that we had a failure somewhere and at the end of the test suite run we can trigger exit with code 1 or 0, respectively. We could pass around a <code>status</code> object with boolean property <code>status.failed</code> and set it to <code>true</code> in our <code>catch</code> block:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="p">}</span> <span class="k">catch</span> <span class="p">(</span><span class="nx">error</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="nx">silenceFailures</span><span class="p">)</span> <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">error</span><span class="p">);</span>
</span><span class='line'>    <span class="nx">status</span><span class="p">.</span><span class="nx">failed</span> <span class="o">=</span> <span class="kc">true</span><span class="p">;</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>And at the end of <code>runTestSuite</code> function we could call <code>process.exit(1)</code> if <code>status.failed</code> was <code>true</code>:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="kd">function</span> <span class="nx">runTestSuite</span><span class="p">(</span><span class="nx">testSuiteConstructor</span><span class="p">,</span> <span class="nx">options</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="c1">// ...</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">if</span> <span class="p">(</span><span class="nx">status</span><span class="p">.</span><span class="nx">failed</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>        <span class="nx">process</span><span class="p">.</span><span class="nx">exit</span><span class="p">(</span><span class="mi">1</span><span class="p">);</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>While this works (as in &ldquo;tests pass after providing <code>fakeProcess</code> where needed for nested failing <code>runTestSuite</code> calls&rdquo;) state changes in this code are starting to be hard to follow and function signatures remind me of some horror movie:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="kd">function</span> <span class="nx">getTestSuiteName</span><span class="p">(</span><span class="nx">testSuiteConstructor</span><span class="p">,</span> <span class="nx">testSuitePrototype</span><span class="p">)</span>
</span><span class='line'><span class="kd">function</span> <span class="nx">runTest</span><span class="p">(</span><span class="nx">testSuite</span><span class="p">,</span> <span class="nx">testName</span><span class="p">,</span> <span class="nx">silenceFailures</span><span class="p">,</span> <span class="nx">status</span><span class="p">)</span>
</span><span class='line'><span class="kd">function</span> <span class="nx">handleTest</span><span class="p">(</span><span class="nx">reporter</span><span class="p">,</span> <span class="nx">testName</span><span class="p">,</span> <span class="nx">testSuiteConstructor</span><span class="p">,</span> <span class="nx">silenceFailures</span><span class="p">,</span> <span class="nx">status</span><span class="p">)</span>
</span><span class='line'><span class="kd">function</span> <span class="nx">runAllTests</span><span class="p">(</span><span class="nx">reporter</span><span class="p">,</span> <span class="nx">testSuitePrototype</span><span class="p">,</span> <span class="nx">testSuiteConstructor</span><span class="p">,</span> <span class="nx">silenceFailures</span><span class="p">,</span> <span class="nx">status</span><span class="p">)</span>
</span></code></pre></td></tr></table></div></figure>


<p>These signatures smell like objects are hiding there in these functions. Let&rsquo;s find them!</p>

<h2>Quest for hidden objects</h2>

<p>First, let&rsquo;s extract the method object from the function <code>runTestSuite</code>. We will give it a name <code>TestSuiteRunContext</code>:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="kd">function</span> <span class="nx">TestSuiteRunContext</span><span class="p">(</span><span class="nx">testSuiteConstructor</span><span class="p">,</span> <span class="nx">options</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="nx">options</span> <span class="o">=</span> <span class="nx">options</span> <span class="o">||</span> <span class="p">{};</span>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">reporter</span> <span class="o">=</span> <span class="nx">options</span><span class="p">.</span><span class="nx">reporter</span> <span class="o">||</span> <span class="k">new</span> <span class="nx">SimpleReporter</span><span class="p">();</span>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">process</span> <span class="o">=</span> <span class="nx">options</span><span class="p">.</span><span class="nx">process</span> <span class="o">||</span> <span class="nx">global</span><span class="p">.</span><span class="nx">process</span><span class="p">;</span>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">silenceFailures</span> <span class="o">=</span> <span class="nx">options</span><span class="p">.</span><span class="nx">silenceFailures</span> <span class="o">||</span> <span class="kc">false</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">status</span> <span class="o">=</span> <span class="p">{</span><span class="nx">failed</span><span class="o">:</span> <span class="kc">false</span><span class="p">};</span>
</span><span class='line'>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">testSuitePrototype</span> <span class="o">=</span> <span class="nx">createTestSuite</span><span class="p">(</span><span class="nx">testSuiteConstructor</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">this</span><span class="p">.</span><span class="nx">invoke</span> <span class="o">=</span> <span class="kd">function</span> <span class="p">()</span> <span class="p">{</span>
</span><span class='line'>        <span class="nx">reporter</span><span class="p">.</span><span class="nx">reportTestSuite</span><span class="p">(</span>
</span><span class='line'>            <span class="nx">getTestSuiteName</span><span class="p">(</span><span class="nx">testSuiteConstructor</span><span class="p">,</span> <span class="nx">testSuitePrototype</span><span class="p">)</span>
</span><span class='line'>        <span class="p">);</span>
</span><span class='line'>
</span><span class='line'>        <span class="nx">runAllTests</span><span class="p">(</span>
</span><span class='line'>            <span class="nx">reporter</span><span class="p">,</span>
</span><span class='line'>            <span class="nx">testSuitePrototype</span><span class="p">,</span>
</span><span class='line'>            <span class="nx">testSuiteConstructor</span><span class="p">,</span>
</span><span class='line'>            <span class="nx">silenceFailures</span><span class="p">,</span>
</span><span class='line'>            <span class="nx">status</span>
</span><span class='line'>        <span class="p">);</span>
</span><span class='line'>
</span><span class='line'>        <span class="k">if</span> <span class="p">(</span><span class="nx">status</span><span class="p">.</span><span class="nx">failed</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>            <span class="nx">process</span><span class="p">.</span><span class="nx">exit</span><span class="p">(</span><span class="mi">1</span><span class="p">);</span>
</span><span class='line'>        <span class="p">}</span>
</span><span class='line'>    <span class="p">};</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="kd">function</span> <span class="nx">runTestSuite</span><span class="p">(</span><span class="nx">testSuiteConstructor</span><span class="p">,</span> <span class="nx">options</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">new</span> <span class="nx">TestSuiteRunContext</span><span class="p">(</span><span class="nx">testSuiteConstructor</span><span class="p">,</span> <span class="nx">options</span><span class="p">).</span><span class="nx">invoke</span><span class="p">();</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>Now, if we were to move function <code>runAllTests</code> inside of this class, we would not need all these arguments (and all other functions we call):</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
<span class='line-number'>37</span>
<span class='line-number'>38</span>
<span class='line-number'>39</span>
<span class='line-number'>40</span>
<span class='line-number'>41</span>
<span class='line-number'>42</span>
<span class='line-number'>43</span>
<span class='line-number'>44</span>
<span class='line-number'>45</span>
<span class='line-number'>46</span>
<span class='line-number'>47</span>
<span class='line-number'>48</span>
<span class='line-number'>49</span>
<span class='line-number'>50</span>
<span class='line-number'>51</span>
<span class='line-number'>52</span>
<span class='line-number'>53</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="k">this</span><span class="p">.</span><span class="nx">invoke</span> <span class="o">=</span> <span class="kd">function</span> <span class="p">()</span> <span class="p">{</span>
</span><span class='line'>    <span class="nx">reportTestSuite</span><span class="p">();</span>
</span><span class='line'>    <span class="nx">runAllTests</span><span class="p">();</span>
</span><span class='line'>    <span class="nx">finishTestRun</span><span class="p">();</span>
</span><span class='line'><span class="p">};</span>
</span><span class='line'>
</span><span class='line'><span class="kd">function</span> <span class="nx">reportTestSuite</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>    <span class="nx">reporter</span><span class="p">.</span><span class="nx">reportTestSuite</span><span class="p">(</span><span class="nx">getTestSuiteName</span><span class="p">());</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="kd">function</span> <span class="nx">getTestSuiteName</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">if</span> <span class="p">(</span><span class="k">typeof</span><span class="p">(</span><span class="nx">createTestSuite</span><span class="p">().</span><span class="nx">getTestSuiteName</span><span class="p">)</span> <span class="o">!==</span> <span class="s2">&quot;function&quot;</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>        <span class="k">return</span> <span class="nx">testSuiteConstructor</span><span class="p">.</span><span class="nx">name</span><span class="p">;</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">return</span> <span class="nx">createTestSuite</span><span class="p">().</span><span class="nx">getTestSuiteName</span><span class="p">();</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="kd">function</span> <span class="nx">createTestSuite</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">return</span> <span class="k">new</span> <span class="nx">testSuiteConstructor</span><span class="p">(</span><span class="nx">assertions</span><span class="p">);</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="kd">function</span> <span class="nx">runAllTests</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">for</span> <span class="p">(</span><span class="kd">var</span> <span class="nx">testName</span> <span class="k">in</span> <span class="nx">createTestSuite</span><span class="p">())</span> <span class="p">{</span>
</span><span class='line'>        <span class="k">if</span> <span class="p">(</span><span class="nx">testName</span><span class="p">.</span><span class="nx">match</span><span class="p">(</span><span class="sr">/^test/</span><span class="p">))</span> <span class="p">{</span>
</span><span class='line'>            <span class="nx">handleTest</span><span class="p">(</span><span class="nx">testName</span><span class="p">);</span>
</span><span class='line'>        <span class="p">}</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="kd">function</span> <span class="nx">handleTest</span><span class="p">(</span><span class="nx">testName</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="nx">reportTest</span><span class="p">(</span><span class="nx">testName</span><span class="p">);</span>
</span><span class='line'>    <span class="nx">runTest</span><span class="p">(</span><span class="nx">createTestSuite</span><span class="p">(),</span> <span class="nx">testName</span><span class="p">);</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="kd">function</span> <span class="nx">reportTest</span><span class="p">(</span><span class="nx">testName</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="nx">reporter</span><span class="p">.</span><span class="nx">reportTest</span><span class="p">(</span><span class="nx">testName</span><span class="p">);</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="kd">function</span> <span class="nx">runTest</span><span class="p">(</span><span class="nx">testSuite</span><span class="p">,</span> <span class="nx">testName</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">try</span> <span class="p">{</span>
</span><span class='line'>        <span class="nx">testSuite</span><span class="p">[</span><span class="nx">testName</span><span class="p">]();</span>
</span><span class='line'>    <span class="p">}</span> <span class="k">catch</span> <span class="p">(</span><span class="nx">error</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>        <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="nx">silenceFailures</span><span class="p">)</span> <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">error</span><span class="p">);</span>
</span><span class='line'>        <span class="nx">status</span><span class="p">.</span><span class="nx">failed</span> <span class="o">=</span> <span class="kc">true</span><span class="p">;</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="kd">function</span> <span class="nx">finishTestRun</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">if</span> <span class="p">(</span><span class="nx">status</span><span class="p">.</span><span class="nx">failed</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>        <span class="nx">process</span><span class="p">.</span><span class="nx">exit</span><span class="p">(</span><span class="mi">1</span><span class="p">);</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>It already looks very nice. The only thing that I do not like about this object yet is that it has stateful properties and stateless properties. I like to have my objects separated by this concern. Let&rsquo;s extract <code>status</code> mutable property as a proper <code>TestSuiteRunStatus</code> object:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="kd">function</span> <span class="nx">TestSuiteRunStatus</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">failed</span> <span class="o">=</span> <span class="kc">false</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">this</span><span class="p">.</span><span class="nx">markAsFailed</span> <span class="o">=</span> <span class="kd">function</span> <span class="p">()</span> <span class="p">{</span>
</span><span class='line'>        <span class="nx">failed</span> <span class="o">=</span> <span class="kc">true</span><span class="p">;</span>
</span><span class='line'>    <span class="p">};</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">this</span><span class="p">.</span><span class="nx">hasFailed</span> <span class="o">=</span> <span class="kd">function</span> <span class="p">()</span> <span class="p">{</span>
</span><span class='line'>        <span class="k">return</span> <span class="nx">failed</span><span class="p">;</span>
</span><span class='line'>    <span class="p">};</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="kd">function</span> <span class="nx">TestSuiteRunContext</span><span class="p">(</span><span class="nx">testSuiteConstructor</span><span class="p">,</span> <span class="nx">options</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>  <span class="c1">// ...</span>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">status</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">TestSuiteRunStatus</span><span class="p">();</span>
</span><span class='line'>
</span><span class='line'>  <span class="c1">// ...</span>
</span><span class='line'>  <span class="kd">function</span> <span class="nx">runTest</span><span class="p">(</span><span class="nx">testSuite</span><span class="p">,</span> <span class="nx">testName</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>        <span class="k">try</span> <span class="p">{</span>
</span><span class='line'>            <span class="nx">testSuite</span><span class="p">[</span><span class="nx">testName</span><span class="p">]();</span>
</span><span class='line'>        <span class="p">}</span> <span class="k">catch</span> <span class="p">(</span><span class="nx">error</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>            <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="nx">silenceFailures</span><span class="p">)</span> <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">error</span><span class="p">);</span>
</span><span class='line'>            <span class="nx">status</span><span class="p">.</span><span class="nx">markAsFailed</span><span class="p">();</span>
</span><span class='line'>        <span class="p">}</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="kd">function</span> <span class="nx">finishTestRun</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>        <span class="k">if</span> <span class="p">(</span><span class="nx">status</span><span class="p">.</span><span class="nx">hasFailed</span><span class="p">())</span> <span class="p">{</span>
</span><span class='line'>            <span class="nx">process</span><span class="p">.</span><span class="nx">exit</span><span class="p">(</span><span class="mi">1</span><span class="p">);</span>
</span><span class='line'>        <span class="p">}</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>I think we have finished the refactoring. Now we should verify that test suite exits with the code 0 when everything passes:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="k">this</span><span class="p">.</span><span class="nx">testItExitsWithProcessCodeZero_onSuccess</span> <span class="o">=</span> <span class="kd">function</span> <span class="p">()</span> <span class="p">{</span>
</span><span class='line'>    <span class="nx">runTestSuite</span><span class="p">(</span><span class="kd">function</span> <span class="p">(</span><span class="nx">t</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>        <span class="k">this</span><span class="p">.</span><span class="nx">testFailure</span> <span class="o">=</span> <span class="kd">function</span> <span class="p">()</span> <span class="p">{</span>
</span><span class='line'>            <span class="nx">t</span><span class="p">.</span><span class="nx">assertTrue</span><span class="p">(</span><span class="kc">true</span><span class="p">);</span>
</span><span class='line'>        <span class="p">};</span>
</span><span class='line'>    <span class="p">},</span> <span class="p">{</span><span class="nx">process</span><span class="o">:</span> <span class="nx">processSpy</span><span class="p">,</span> <span class="nx">silenceFailures</span><span class="o">:</span> <span class="kc">true</span><span class="p">});</span>
</span><span class='line'>
</span><span class='line'>    <span class="nx">t</span><span class="p">.</span><span class="nx">assertEqual</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="nx">processSpy</span><span class="p">.</span><span class="nx">hasExitedWithCode</span><span class="p">);</span>
</span><span class='line'><span class="p">};</span>
</span><span class='line'><span class="c1">// =&gt; Error: Expected to equal 0, but got: null</span>
</span><span class='line'>
</span><span class='line'><span class="kd">function</span> <span class="nx">finishTestRun</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">if</span> <span class="p">(</span><span class="nx">status</span><span class="p">.</span><span class="nx">hasFailed</span><span class="p">())</span> <span class="k">return</span> <span class="nx">process</span><span class="p">.</span><span class="nx">exit</span><span class="p">(</span><span class="mi">1</span><span class="p">);</span>
</span><span class='line'>    <span class="nx">process</span><span class="p">.</span><span class="nx">exit</span><span class="p">(</span><span class="mi">0</span><span class="p">);</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'><span class="c1">// =&gt; PASS</span>
</span></code></pre></td></tr></table></div></figure>


<h2>Bottom Line</h2>

<p>I think we have finished implementing exit code reporting. The code can be found here: <a href="https://github.com/waterlink/BuildYourOwnTestingFrameworkPart5">https://github.com/waterlink/BuildYourOwnTestingFrameworkPart5</a></p>

<p>There is still a lot to go through. In a few next episodes we will:</p>

<ul>
<li>Report OK and FAIL for each test;</li>
<li>Output carefully formatted failures to the STDERR;</li>
<li>Enable our testing framework to run multiple test suite files at once;</li>
<li>Enable our testing framework to run in a browser (it is javascript after all).</li>
</ul>


<p>Stay tuned!</p>

<h2>Thanks</h2>

<p>Thank you for reading, my dear reader. If you liked it, please share this article on social networks and follow me on Twitter: <a href="https://twitter.com/tdd_fellow">@tdd_fellow</a>.</p>

<p>If you have any questions or feedback for me, don’t hesitate to reach me out on Twitter: <a href="https://twitter.com/tdd_fellow">@tdd_fellow</a>.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Do More With Baby-Steps TDD]]></title>
    <link href="http://www.tddfellow.com/blog/2016/10/19/do-more-with-baby-steps-tdd/"/>
    <updated>2016-10-19T23:15:12+02:00</updated>
    <id>http://www.tddfellow.com/blog/2016/10/19/do-more-with-baby-steps-tdd</id>
    <content type="html"><![CDATA[<p>Hello everyone! I&rsquo;m usually advocating for the Baby-Steps Test-Driven Development with Triangulation. On the first encounter, this technique seems very verbose and everybody wonders how can it possibly work and why I am very productive with it. Let me tell you about that. First, let&rsquo;s quickly recap both techniques:</p>

<!--more-->


<h2>Baby-Steps TDD</h2>

<p>In Baby-Steps TDD the basic strategy is to get to the green state ASAP. If you can pass all tests with <code>return 42</code>, you should! While the benefit of the approach is not directly obvious exploring the alternative shows its value. One possible alternative is to write a bunch of tests for the software and then make them all pass. This results in a lot of changes made to the software under the test while tests are failing (are in red state). This provides very slow feedback and high risks because with every decision in the code complexity grows exponentially and problems are hard to find when you only know that software worked 1 hour ago and there is one mistake in a whole 1 hour worth of work. The same effect can be seen if the most complex test is written first so that it forces the engineer to implement the whole solution or big part of it in one go.</p>

<p>Baby-Steps TDD mitigates the issue by ensuring everything worked one or two minutes ago. At least to the extent the software is specified by currently written tests. So if something does not work as expected it is most probably a mistake in these last 2-3 lines of code that we have written. And we can even discard them entirely with &ldquo;undo&rdquo; command and start over from the green state without losing much work and saving a whole lot of time debugging.</p>

<p>Baby-Steps TDD provides faster feedback and fewer risks for the cost of a bit more overall effort. Let&rsquo;s take a look into the triangulation technique:</p>

<div class="v2-subscribe--inline">
  




  


<div class="mc_embed_signup">
  <form action="//tddfellow.us14.list-manage.com/subscribe/post?u=535a10a8c0274c9a7ebac4f34&amp;id=7f9f94015a" method="post" class="mc-embedded-subscribe-form" name="mc-embedded-subscribe-form" class="validate" target="_blank" novalidate>
    <div class="mc_embed_signup_scroll">
      <h3>Want more articles like this delivered to your inbox?</h3>
      <div class="mc-field-group">
        <!-- real people should not fill this in and expect good things - do not remove this or risk form bot signups-->
        <div style="position: absolute; left: -5000px;" aria-hidden="true"><input type="text" name="b_535a10a8c0274c9a7ebac4f34_7f9f94015a" tabindex="-1" value=""></div>
        <input type="email" value="" name="EMAIL" class="required email mce-EMAIL" placeholder="Enter your email">
        <input type="submit" value="Subscribe" name="subscribe" class="button mc-embedded-subscribe">
      </div>
      <div class="">
        <em>(we respect your privacy, unsubscribe at any time)</em>
      </div>
    </div>
  </form>
</div>


</div>


<h2>Triangulation Technique</h2>

<p>In essence, Triangulation Technique takes ideas of Baby-Steps TDD further and reduces step size even further. For example, when usually with Baby-Steps TDD you would need one test to introduce the correct <code>if</code> statement, with Triangulation Technique and Baby-Steps TDD combined you would use multiple tests for this:</p>

<ul>
<li>The first test for the most degenerated case which requires one to write a simple <code>return CONSTANT</code> statement to pass:</li>
</ul>


<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="k">return</span> <span class="mi">1</span>
</span></code></pre></td></tr></table></div></figure>


<ul>
<li>The second test for the same case where the result will be different which requires one to promote <code>CONSTANT</code> to some sort of calculation (variable, formula or function call):</li>
</ul>


<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="k">return</span> <span class="nx">n</span>
</span></code></pre></td></tr></table></div></figure>


<ul>
<li>The third test for the other case which requires one to write a specific <code>if (argument == SPECIFIC_VALUE)</code> with another <code>return ANOTHER_CONSTANT</code>:</li>
</ul>


<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="k">if</span> <span class="p">(</span><span class="nx">n</span> <span class="o">==</span> <span class="mi">7</span><span class="p">)</span>
</span><span class='line'>  <span class="k">return</span> <span class="mi">42</span>
</span><span class='line'>
</span><span class='line'><span class="k">return</span> <span class="nx">n</span>
</span></code></pre></td></tr></table></div></figure>


<ul>
<li>The fourth test for the same case where the result will be different which requires one to promote <code>ANOTHER_CONSTANT</code> to some sort of calculation (variable, formula or function call):</li>
</ul>


<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="k">if</span> <span class="p">(</span><span class="nx">n</span> <span class="o">==</span> <span class="mi">7</span><span class="p">)</span>
</span><span class='line'>  <span class="k">return</span> <span class="nx">m</span> <span class="o">*</span> <span class="mi">6</span>
</span><span class='line'>
</span><span class='line'><span class="k">return</span> <span class="nx">n</span>
</span></code></pre></td></tr></table></div></figure>


<ul>
<li>The fifth test for the same case where the condition has to be different which requires one to promote specific condition to the proper one:</li>
</ul>


<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="k">if</span> <span class="p">(</span><span class="nx">n</span> <span class="o">&gt;=</span> <span class="mi">7</span><span class="p">)</span>
</span><span class='line'>  <span class="k">return</span> <span class="nx">m</span> <span class="o">*</span> <span class="mi">6</span>
</span><span class='line'>
</span><span class='line'><span class="k">return</span> <span class="nx">n</span>
</span></code></pre></td></tr></table></div></figure>


<p>In normal Baby-Steps TDD that would probably have been only 2 or 3 test cases. With Triangulation it is 5 and to make every one of them pass requires a simple transformation of the production code.</p>

<p>Now let&rsquo;s see why these techniques combined make me more productive.</p>

<h2>Willpower Depletion</h2>

<p>Did you know that every decision you make costs you some willpower? For example: choosing what to wear in the morning, refusing to eat this tasty cake or to make a design choice in your code. This phenomenon is known as Ego Depletion (<a href="https://en.wikipedia.org/wiki/Ego_depletion">see in wiki</a>) and it has an experimental evidence. According to this phenomenon self-control and willpower both draw upon a limited pool of mental resources and it can be used up. Usually, these resources are recovered greatly during good night&rsquo;s sleep or slightly after consuming food. Cost per each made decision differs also and even for the same kind of decision can depend on various factors:</p>

<ul>
<li>perceived complexity of the problem,</li>
<li>mood, physical state and perceived fatigue of the person (tired, angry, confused, happy, energized, etc.),</li>
<li>required effort to make and execute the decision,</li>
<li>blood glucose levels.</li>
</ul>


<p>Baby-Steps TDD combined with Triangulation technique optimize for &ldquo;perceived complexity of the problem&rdquo; so that every decision is nearly obvious to make and the effort required to make it and execute on it is stupidly small. While this increases the amount of decisions that I need to make it also decreases the complexity and willpower cost of each decision to the point, where after completing the same amount of work I still have plenty of energy and willpower to make any other decisions at work and outside of it.</p>

<p>It is worth noting that these techniques need to be practiced quite a bit to enable this effect - with such incremental design it is important to <a href="http://www.tddfellow.com/blog/2016/08/30/getting-stuck-while-doing-tdd-part-1-example/">avoid getting stuck</a>. Definitely, try it out and see if it works for you!</p>

<h2>Thanks</h2>

<p>Thank you for reading, my dear reader. If you liked it, please share this article on social networks and follow me on twitter: <a href="https://twitter.com/tdd_fellow">@tdd_fellow</a>.</p>

<p>If you have any questions or feedback for me, don&rsquo;t hesitate to reach me out on Twitter: <a href="https://twitter.com/tdd_fellow">@tdd_fellow</a>.</p>

<h2>Acknowledgements</h2>

<p>Thanks to David Völkel for the great presentation about Baby-Steps TDD. Slides can be found <a href="http://www.slideshare.net/davidvoelkel/baby-steps-tdd-approaches">here</a>.</p>

<p>Thanks to Stephen Guise for the great book &ldquo;Mini Habits&rdquo; that has opened my eyes to the reasons why I like these techniques so much and why I love designing software in tiny increments.</p>

<p><a target="_blank"  href="https://www.amazon.com/gp/product/1494882272/ref=as_li_tl?ie=UTF8&camp=1789&creative=9325&creativeASIN=1494882272&linkCode=as2&tag=tddfellow-20&linkId=acc11b87f4487fb0e318cc49d8d8302d"><img border="0" src="//ws-na.amazon-adsystem.com/widgets/q?_encoding=UTF8&MarketPlace=US&ASIN=1494882272&ServiceVersion=20070822&ID=AsinImage&WS=1&Format=_SL250_&tag=tddfellow-20" ></a></p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[HighScore Kata]]></title>
    <link href="http://www.tddfellow.com/blog/2016/09/30/highscore-kata/"/>
    <updated>2016-09-30T18:23:21+02:00</updated>
    <id>http://www.tddfellow.com/blog/2016/09/30/highscore-kata</id>
    <content type="html"><![CDATA[<p>Hello, everyone. Today we will take a look into a little problem involving high scores in some sort of game. The game has only one high score and when current game&rsquo;s score exceeds that number, it gets updated. Example acceptance test would read like this:</p>

<p><strong>Given</strong> high score is <code>174</code><br/>
<strong>When</strong> player scores <code>191</code><br/>
<strong>Then</strong> high score is <code>191</code></p>

<!--more-->


<p>Current implementation stores high score in the web browser&rsquo;s local storage. This detail does not change the purpose of this Kata very much since any other platform and language can have its own analog of local storage (file system, in-memory or local database, application settings, etc.). <code>HighScore</code> object looks like this:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="kd">function</span> <span class="nx">Highscore</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>    <span class="c1">// initially, load high score value from the local storage</span>
</span><span class='line'>    <span class="k">this</span><span class="p">.</span><span class="nx">load</span><span class="p">();</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="nx">Highscore</span><span class="p">.</span><span class="nx">prototype</span><span class="p">.</span><span class="nx">updateHighscore</span> <span class="o">=</span> <span class="kd">function</span> <span class="p">(</span><span class="nx">score</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="c1">// check if we need to update high score</span>
</span><span class='line'>    <span class="k">if</span> <span class="p">(</span><span class="nx">score</span> <span class="o">&gt;</span> <span class="k">this</span><span class="p">.</span><span class="nx">highscore</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>        <span class="k">this</span><span class="p">.</span><span class="nx">highscore</span> <span class="o">=</span> <span class="nx">score</span><span class="p">;</span>
</span><span class='line'>        <span class="k">this</span><span class="p">.</span><span class="nx">save</span><span class="p">();</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="c1">// render the high score in the</span>
</span><span class='line'>    <span class="c1">// id=&quot;highscore&quot; element in the browser</span>
</span><span class='line'>    <span class="nx">$</span><span class="p">(</span><span class="s2">&quot;#highscore&quot;</span><span class="p">).</span><span class="nx">text</span><span class="p">(</span><span class="s2">&quot;HIGHSCORE: &quot;</span> <span class="o">+</span> <span class="k">this</span><span class="p">.</span><span class="nx">highscore</span><span class="p">);</span>
</span><span class='line'><span class="p">};</span>
</span><span class='line'>
</span><span class='line'><span class="nx">Highscore</span><span class="p">.</span><span class="nx">prototype</span><span class="p">.</span><span class="nx">load</span> <span class="o">=</span> <span class="kd">function</span> <span class="p">()</span> <span class="p">{</span>
</span><span class='line'>    <span class="c1">// localStorage is storing everything as strings,</span>
</span><span class='line'>    <span class="c1">// so we need to convert it to number</span>
</span><span class='line'>    <span class="k">this</span><span class="p">.</span><span class="nx">highscore</span> <span class="o">=</span> <span class="nb">parseFloat</span><span class="p">(</span><span class="nx">localStorage</span><span class="p">.</span><span class="nx">highscore</span><span class="p">);</span>
</span><span class='line'><span class="p">};</span>
</span><span class='line'>
</span><span class='line'><span class="nx">Highscore</span><span class="p">.</span><span class="nx">prototype</span><span class="p">.</span><span class="nx">save</span> <span class="o">=</span> <span class="kd">function</span> <span class="p">()</span> <span class="p">{</span>
</span><span class='line'>    <span class="nx">localStorage</span><span class="p">.</span><span class="nx">highscore</span> <span class="o">=</span> <span class="k">this</span><span class="p">.</span><span class="nx">highscore</span><span class="p">;</span>
</span><span class='line'><span class="p">};</span>
</span></code></pre></td></tr></table></div></figure>


<p>Task for the Kata:</p>

<ul>
<li>Write tests for this class.</li>
<li>Fix the bug: when a game is launched on the new client (without the high score stored), it renders <code>HIGHSCORE: NaN</code>. (<code>NaN</code> is javascript&rsquo;s abbreviation for &ldquo;not a number&rdquo;). <code>parseFloat</code> most probably is a culprit for this.</li>
<li>Extract storing mechanisms, so that class can be re-used with different storage mechanisms (for example local database, or external REST API).</li>
<li>Make all tests runnable outside of the context of the browser (for example, on <code>nodejs</code>).</li>
</ul>


<p>The focus of this Kata is on architectural boundaries, that this little innocent class spans.</p>

<p>Questions to ask yourself:</p>

<ul>
<li>How much distinct responsibilities this class has?</li>
<li>What architectural boundaries should I draw through this class?

<ul>
<li>How do I split this class according to these boundaries?</li>
</ul>
</li>
<li>What is the easiest way and what is the proper way to make tests runnable outside of the context of the browser?</li>
<li>How would this code look like in different kinds of languages? (static, dynamic, object-oriented, functional, strong-typed, etc.).

<ul>
<li>And how the solution for the Kata will look like for these?</li>
</ul>
</li>
</ul>


<p>Next time we will take a look at one possible solution for this Kata. Try to solve it on your own, my dear reader, and please share the code and insights!</p>

<h2>Thanks</h2>

<p>Thank you for reading, my dear reader. If you liked it, please share this article on social networks and follow me on twitter: <a href="https://twitter.com/tdd_fellow">@tdd_fellow</a>.</p>

<p>If you have any questions or feedback for me, don&rsquo;t hesitate to reach me out on Twitter: <a href="https://twitter.com/tdd_fellow">@tdd_fellow</a>.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Meet Duck Type]]></title>
    <link href="http://www.tddfellow.com/blog/2016/09/18/meet-duck-type/"/>
    <updated>2016-09-18T16:37:33+02:00</updated>
    <id>http://www.tddfellow.com/blog/2016/09/18/meet-duck-type</id>
    <content type="html"><![CDATA[<h2>Duck type</h2>

<p>Duck type is the concept in the domain of the type safety that represents objects, that pass a so-called &ldquo;Duck Test&rdquo;:</p>

<blockquote><p>If it looks like a duck, swims like a duck, and quacks like a duck, then it probably is a duck.</p></blockquote>

<p>In terms of programming language, it might look like this:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="kd">function</span> <span class="nx">Duck</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">this</span><span class="p">.</span><span class="nx">swim</span> <span class="o">=</span> <span class="kd">function</span> <span class="p">(</span><span class="nx">coordinates</span><span class="p">)</span> <span class="p">{</span> <span class="p">...</span> <span class="p">};</span>
</span><span class='line'>    <span class="k">this</span><span class="p">.</span><span class="nx">quack</span> <span class="o">=</span> <span class="kd">function</span> <span class="p">(</span><span class="nx">sentence</span><span class="p">)</span> <span class="p">{</span> <span class="p">...</span> <span class="p">};</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="kd">function</span> <span class="nx">RoboDuck</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">this</span><span class="p">.</span><span class="nx">swim</span> <span class="o">=</span> <span class="kd">function</span> <span class="p">(</span><span class="nx">coordinates</span><span class="p">)</span> <span class="p">{</span> <span class="p">...</span> <span class="p">};</span>
</span><span class='line'>    <span class="k">this</span><span class="p">.</span><span class="nx">quack</span> <span class="o">=</span> <span class="kd">function</span> <span class="p">(</span><span class="nx">sentence</span><span class="p">)</span> <span class="p">{</span> <span class="p">...</span> <span class="p">};</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// .. and so on ..</span>
</span></code></pre></td></tr></table></div></figure>




<!--more-->


<p>The point is that the public interface has methods <code>swim()</code> and <code>quack()</code>. This is how you identify the duck in a programming language. This concept is very similar to the concept of the <code>interface</code> in programming languages that have one, but it is not enforced in any way by the programming language.</p>

<p>Duck typing is mostly natural in dynamic languages, where it is possible to send any message to any object and the check if that is something possible will happen at runtime. In static languages, it is still possible to use duck typing via some sort of Reflection.</p>

<h3>Contract test for duck types</h3>

<p>In a dynamic language, it is important to make it obvious, that something is implementing certain duck type by writing one test suite for all implementers and executing it against them. For example:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="p">[</span><span class="nx">Duck</span><span class="p">,</span> <span class="nx">RoboDuck</span><span class="p">].</span><span class="nx">forEach</span><span class="p">(</span><span class="kd">function</span> <span class="p">(</span><span class="nx">duckType</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="nx">runTestSuite</span><span class="p">(</span><span class="kd">function</span> <span class="p">(</span><span class="nx">t</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>        <span class="k">this</span><span class="p">.</span><span class="nx">testItSwimsLikeADuck</span> <span class="o">=</span> <span class="kd">function</span> <span class="p">()</span> <span class="p">{</span>
</span><span class='line'>            <span class="kd">var</span> <span class="nx">duck</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">duckType</span><span class="p">();</span>
</span><span class='line'>            <span class="nx">duck</span><span class="p">.</span><span class="nx">swim</span><span class="p">({</span><span class="nx">x</span><span class="o">:</span> <span class="mi">5</span><span class="p">,</span> <span class="nx">y</span><span class="o">:</span> <span class="mi">7</span><span class="p">});</span>
</span><span class='line'>            <span class="nx">t</span><span class="p">.</span><span class="nx">assertThat</span><span class="p">(</span><span class="nx">duck</span><span class="p">).</span><span class="nx">swamTo</span><span class="p">({</span><span class="nx">x</span><span class="o">:</span> <span class="mi">5</span><span class="p">,</span> <span class="nx">y</span><span class="o">:</span> <span class="mi">7</span><span class="p">});</span>
</span><span class='line'>        <span class="p">};</span>
</span><span class='line'>
</span><span class='line'>        <span class="k">this</span><span class="p">.</span><span class="nx">testItQuacksLikeADuck</span> <span class="o">=</span> <span class="kd">function</span> <span class="p">()</span> <span class="p">{</span>
</span><span class='line'>            <span class="kd">var</span> <span class="nx">duck</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">duckType</span><span class="p">();</span>
</span><span class='line'>            <span class="nx">duck</span><span class="p">.</span><span class="nx">quack</span><span class="p">(</span><span class="s2">&quot;hello world&quot;</span><span class="p">);</span>
</span><span class='line'>            <span class="nx">t</span><span class="p">.</span><span class="nx">assertThat</span><span class="p">(</span><span class="nx">duck</span><span class="p">).</span><span class="nx">quacked</span><span class="p">(</span><span class="s2">&quot;hello world&quot;</span><span class="p">);</span>
</span><span class='line'>        <span class="p">};</span>
</span><span class='line'>    <span class="p">});</span>
</span><span class='line'><span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>


<p>This test suite has to go only through the Duck type public interface. If it is not possible to test behavior through it, one should test at least the function signatures, for example:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="k">this</span><span class="p">.</span><span class="nx">testItSwimsLikeADuck</span> <span class="o">=</span> <span class="kd">function</span> <span class="p">()</span> <span class="p">{</span>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">duck</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">duckType</span><span class="p">();</span>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">swim</span> <span class="o">=</span> <span class="nx">duck</span><span class="p">.</span><span class="nx">swim</span><span class="p">;</span>
</span><span class='line'>    <span class="nx">t</span><span class="p">.</span><span class="nx">assertEqual</span><span class="p">(</span><span class="s2">&quot;function&quot;</span><span class="p">,</span> <span class="k">typeof</span><span class="p">(</span><span class="nx">swim</span><span class="p">));</span>
</span><span class='line'>    <span class="nx">t</span><span class="p">.</span><span class="nx">assertEqual</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="nx">swim</span><span class="p">.</span><span class="nx">length</span><span class="p">);</span>
</span><span class='line'><span class="p">};</span>
</span></code></pre></td></tr></table></div></figure>


<p>Not doing contract tests for your ducks may result in a passing test suite and broken production code. For example, when one duck and its test suite have been updated, but others haven&rsquo;t.</p>

<h2>Thanks</h2>

<p>Thank you for reading, my dear reader. If you liked it, please share this article on social networks and follow me on twitter: <a href="https://twitter.com/tdd_fellow">@tdd_fellow</a>.</p>

<p>If you have any questions or feedback for me, don&rsquo;t hesitate to reach me out on Twitter: <a href="https://twitter.com/tdd_fellow">@tdd_fellow</a>.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Introducing Test Doubles]]></title>
    <link href="http://www.tddfellow.com/blog/2016/09/18/introducing-test-doubles/"/>
    <updated>2016-09-18T16:31:48+02:00</updated>
    <id>http://www.tddfellow.com/blog/2016/09/18/introducing-test-doubles</id>
    <content type="html"><![CDATA[<p>A test double is a test object or a test function, that looks and behaves like its production counterpart, but is actually a simplified version that reduces the complexity and enables simpler testing. One can represent all types of test double as an inheritance tree like this:</p>

<p><img src='//g.gravizo.com/g?
@startuml;
object Double;
object Dummy;
object Stub;
object Spy;
object Mock;
object Fake;
Double <|-- Dummy;
Double <|-- Fake;
Dummy <|-- Stub;
Stub <|-- Spy;
Spy <|-- Mock;
@enduml;
'/></p>

<p>Where <code>Double</code> is an abstract test double, which has no functionality - it is a general concept to talk about test doubles.</p>

<!--more-->


<p><code>Dummy</code> - is a test double, that is used to fill parameter lists, in cases where these parameters are not used by production code. Simplest <code>Dummy</code> would look like this:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="kd">function</span> <span class="nx">ExampleDummyObject</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>  <span class="k">this</span><span class="p">.</span><span class="nx">doSomething</span> <span class="o">=</span> <span class="kd">function</span> <span class="p">()</span> <span class="p">{};</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">this</span><span class="p">.</span><span class="nx">getSomething</span> <span class="o">=</span> <span class="kd">function</span> <span class="p">()</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">return</span> <span class="kc">null</span><span class="p">;</span>
</span><span class='line'>  <span class="p">};</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="kd">function</span> <span class="nx">exampleDummyFunction</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>  <span class="k">return</span> <span class="kc">null</span><span class="p">;</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// Usage example in test</span>
</span><span class='line'><span class="nx">someObject</span><span class="p">.</span><span class="nx">someMethod</span><span class="p">(</span><span class="nx">dummyObject</span><span class="p">);</span>
</span><span class='line'><span class="nx">someFunction</span><span class="p">(</span><span class="nx">exampleDummyFunction</span><span class="p">);</span>
</span></code></pre></td></tr></table></div></figure>


<p><code>Stub</code> - is a test dummy, additionally, providing an indirect input for the production code from the test. &ldquo;Indirect&rdquo; means here via a method call on the stub object or a call of the stub function. For example:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="kd">function</span> <span class="nx">ExampleStubObject</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">something</span> <span class="o">=</span> <span class="kc">null</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">this</span><span class="p">.</span><span class="nx">getSomething</span> <span class="o">=</span> <span class="kd">function</span> <span class="p">()</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">return</span> <span class="nx">something</span><span class="p">;</span>
</span><span class='line'>  <span class="p">};</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">this</span><span class="p">.</span><span class="nx">stubSomething</span> <span class="o">=</span> <span class="kd">function</span><span class="p">(</span><span class="nx">somethingValue</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="nx">something</span> <span class="o">=</span> <span class="nx">somethingValue</span><span class="p">;</span>
</span><span class='line'>  <span class="p">};</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="kd">var</span> <span class="nx">someValue</span> <span class="o">=</span> <span class="kc">null</span><span class="p">;</span>
</span><span class='line'><span class="kd">function</span> <span class="nx">exampleStubFunction</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>  <span class="k">return</span> <span class="nx">someValue</span><span class="p">;</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// Usage example in the test</span>
</span><span class='line'><span class="nx">stubObject</span><span class="p">.</span><span class="nx">stubSomething</span><span class="p">(</span><span class="s2">&quot;a value from the test&quot;</span><span class="p">);</span>
</span><span class='line'><span class="nx">anObject</span><span class="p">.</span><span class="nx">aMethod</span><span class="p">(</span><span class="nx">stubObject</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'><span class="nx">someValue</span> <span class="o">=</span> <span class="s2">&quot;a value from the test&quot;</span><span class="p">;</span>
</span><span class='line'><span class="nx">someFunction</span><span class="p">(</span><span class="nx">exampleStubFunction</span><span class="p">);</span>
</span></code></pre></td></tr></table></div></figure>




<div class="v2-subscribe--inline">
  




  


<div class="mc_embed_signup">
  <form action="//tddfellow.us14.list-manage.com/subscribe/post?u=535a10a8c0274c9a7ebac4f34&amp;id=7f9f94015a" method="post" class="mc-embedded-subscribe-form" name="mc-embedded-subscribe-form" class="validate" target="_blank" novalidate>
    <div class="mc_embed_signup_scroll">
      <h3>Want more articles like this delivered to your inbox?</h3>
      <div class="mc-field-group">
        <!-- real people should not fill this in and expect good things - do not remove this or risk form bot signups-->
        <div style="position: absolute; left: -5000px;" aria-hidden="true"><input type="text" name="b_535a10a8c0274c9a7ebac4f34_7f9f94015a" tabindex="-1" value=""></div>
        <input type="email" value="" name="EMAIL" class="required email mce-EMAIL" placeholder="Enter your email">
        <input type="submit" value="Subscribe" name="subscribe" class="button mc-embedded-subscribe">
      </div>
      <div class="">
        <em>(we respect your privacy, unsubscribe at any time)</em>
      </div>
    </div>
  </form>
</div>


</div>


<p><code>Spy</code> - is a test stub, additionally, verifying an indirect output of the production code, by asserting afterward, without having defined the expectations before the production code is executed. For example:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
<span class='line-number'>37</span>
<span class='line-number'>38</span>
<span class='line-number'>39</span>
<span class='line-number'>40</span>
<span class='line-number'>41</span>
<span class='line-number'>42</span>
<span class='line-number'>43</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="kd">function</span> <span class="nx">ExampleSpyObject</span><span class="p">(</span><span class="nx">assertions</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">didSomethingWithName</span> <span class="o">=</span> <span class="kc">null</span><span class="p">;</span>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">somethingValue</span> <span class="o">=</span> <span class="kc">null</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">this</span><span class="p">.</span><span class="nx">doSomethingWith</span> <span class="o">=</span> <span class="kd">function</span> <span class="p">(</span><span class="nx">name</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="nx">didSomethingWithName</span> <span class="o">=</span> <span class="nx">name</span><span class="p">;</span>
</span><span class='line'>    <span class="k">return</span> <span class="nx">somethingValue</span><span class="p">;</span>
</span><span class='line'>  <span class="p">};</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">this</span><span class="p">.</span><span class="nx">stubSomething</span> <span class="o">=</span> <span class="kd">function</span> <span class="p">(</span><span class="nx">something</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="nx">somethingValue</span> <span class="o">=</span> <span class="nx">something</span><span class="p">;</span>
</span><span class='line'>  <span class="p">};</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">this</span><span class="p">.</span><span class="nx">assertDidSomethingWithName</span> <span class="o">=</span> <span class="kd">function</span><span class="p">(</span><span class="nx">expectedName</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="nx">assertions</span><span class="p">.</span><span class="nx">assertTrue</span><span class="p">(</span>
</span><span class='line'>      <span class="nx">didSomethingWithName</span> <span class="o">===</span> <span class="nx">expectedName</span><span class="p">,</span>
</span><span class='line'>      <span class="s2">&quot;Expected to do something with &#39;&quot;</span> <span class="o">+</span> <span class="nx">expectedName</span> <span class="o">+</span> <span class="s2">&quot;&#39;&quot;</span>
</span><span class='line'>    <span class="p">)</span>
</span><span class='line'>  <span class="p">};</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="kd">var</span> <span class="nx">withName</span> <span class="o">=</span> <span class="kc">null</span><span class="p">;</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">exampleValue</span> <span class="o">=</span> <span class="kc">null</span><span class="p">;</span>
</span><span class='line'><span class="kd">function</span> <span class="nx">exampleSpyFunction</span><span class="p">(</span><span class="nx">name</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>  <span class="nx">withName</span> <span class="o">=</span> <span class="nx">name</span><span class="p">;</span>
</span><span class='line'>  <span class="k">return</span> <span class="nx">exampleValue</span><span class="p">;</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="kd">function</span> <span class="nx">verifyExampleSpyFunction</span><span class="p">(</span><span class="nx">expectedName</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>  <span class="nx">t</span><span class="p">.</span><span class="nx">assertTrue</span><span class="p">(</span>
</span><span class='line'>    <span class="nx">withName</span> <span class="o">===</span> <span class="nx">expectedName</span><span class="p">,</span>
</span><span class='line'>    <span class="s2">&quot;Expected to be called with &#39;&quot;</span> <span class="o">+</span> <span class="nx">expectedName</span> <span class="o">+</span> <span class="s2">&quot;&#39;&quot;</span>
</span><span class='line'>  <span class="p">)</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// Usage in the test</span>
</span><span class='line'><span class="nx">spyObject</span><span class="p">.</span><span class="nx">stubSomething</span><span class="p">(</span><span class="s2">&quot;a value from the test&quot;</span><span class="p">);</span>
</span><span class='line'><span class="nx">anObject</span><span class="p">.</span><span class="nx">aMethod</span><span class="p">(</span><span class="nx">spyObject</span><span class="p">);</span>
</span><span class='line'><span class="nx">spyObject</span><span class="p">.</span><span class="nx">assertDidSomethingWithName</span><span class="p">(</span><span class="s2">&quot;helloWorld&quot;</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'><span class="nx">exampleValue</span> <span class="o">=</span> <span class="s2">&quot;a value from the test&quot;</span><span class="p">;</span>
</span><span class='line'><span class="nx">someFunction</span><span class="p">(</span><span class="nx">exampleSpyFunction</span><span class="p">);</span>
</span><span class='line'><span class="nx">verifyExampleSpyFunction</span><span class="p">(</span><span class="s2">&quot;helloWorld&quot;</span><span class="p">);</span>
</span></code></pre></td></tr></table></div></figure>


<p><code>Mock</code> - is a stub, but the expectations are defined before the execution of the production code and it can verify itself after the execution. A simple example:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
<span class='line-number'>37</span>
<span class='line-number'>38</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="kd">function</span> <span class="nx">ExampleMockObject</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">expectedName</span> <span class="o">=</span> <span class="kc">null</span><span class="p">;</span>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">fulfilled</span> <span class="o">=</span> <span class="kc">false</span><span class="p">;</span>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">somethingValue</span> <span class="o">=</span> <span class="kc">null</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">this</span><span class="p">.</span><span class="nx">expectWillDoSomethingWithName</span> <span class="o">=</span> <span class="kd">function</span> <span class="p">(</span><span class="nx">name</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="nx">expectedName</span> <span class="o">=</span> <span class="nx">name</span><span class="p">;</span>
</span><span class='line'>  <span class="p">};</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">this</span><span class="p">.</span><span class="nx">doSomething</span> <span class="o">=</span> <span class="kd">function</span> <span class="p">(</span><span class="nx">name</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="nx">assertions</span><span class="p">.</span><span class="nx">assertTrue</span><span class="p">(</span>
</span><span class='line'>      <span class="nx">name</span> <span class="o">===</span> <span class="nx">expectedName</span><span class="p">,</span>
</span><span class='line'>      <span class="s2">&quot;Unexpected name &#39;&quot;</span> <span class="o">+</span> <span class="nx">name</span> <span class="o">+</span> <span class="s2">&quot;&#39;,&quot;</span>
</span><span class='line'>        <span class="o">+</span> <span class="s2">&quot; expecting: &#39;&quot;</span> <span class="o">+</span> <span class="nx">expectedName</span> <span class="o">+</span> <span class="s2">&quot;&#39;&quot;</span>
</span><span class='line'>    <span class="p">);</span>
</span><span class='line'>
</span><span class='line'>    <span class="nx">fulfilled</span> <span class="o">=</span> <span class="kc">true</span><span class="p">;</span>
</span><span class='line'>    <span class="k">return</span> <span class="nx">somethingValue</span><span class="p">;</span>
</span><span class='line'>  <span class="p">};</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">this</span><span class="p">.</span><span class="nx">stubSomething</span> <span class="o">=</span> <span class="kd">function</span> <span class="p">(</span><span class="nx">value</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="nx">somethingValue</span> <span class="o">=</span> <span class="nx">value</span><span class="p">;</span>
</span><span class='line'>  <span class="p">};</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">this</span><span class="p">.</span><span class="nx">verify</span> <span class="o">=</span> <span class="kd">function</span> <span class="p">()</span> <span class="p">{</span>
</span><span class='line'>    <span class="nx">assertions</span><span class="p">.</span><span class="nx">assertTrue</span><span class="p">(</span>
</span><span class='line'>      <span class="nx">fulfilled</span><span class="p">,</span>
</span><span class='line'>      <span class="s2">&quot;Expected to receive name &#39;&quot;</span> <span class="o">+</span> <span class="nx">expectedName</span> <span class="o">+</span> <span class="s2">&quot;&#39;, &quot;</span>
</span><span class='line'>        <span class="o">+</span> <span class="s2">&quot;but got nothing&quot;</span>
</span><span class='line'>    <span class="p">);</span>
</span><span class='line'>  <span class="p">};</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// And the usage from the test:</span>
</span><span class='line'><span class="nx">mockObject</span><span class="p">.</span><span class="nx">stubSomething</span><span class="p">(</span><span class="s2">&quot;a value from the test&quot;</span><span class="p">);</span>
</span><span class='line'><span class="nx">mockObject</span><span class="p">.</span><span class="nx">expectWillDoSomethingWithName</span><span class="p">(</span><span class="s2">&quot;helloWorld&quot;</span><span class="p">);</span>
</span><span class='line'><span class="nx">anObject</span><span class="p">.</span><span class="nx">aMethod</span><span class="p">(</span><span class="nx">mockObject</span><span class="p">);</span>
</span><span class='line'><span class="nx">mockObject</span><span class="p">.</span><span class="nx">verify</span><span class="p">();</span>
</span></code></pre></td></tr></table></div></figure>


<p>Mocks can be much more complex (verifying order of messages, allowing multiple messages to be sent, etc.). So it is recommended to either:</p>

<ul>
<li>avoid them and use simpler test doubles, or</li>
<li>use a full-blown well-tested mocking framework.</li>
</ul>


<p>And if you do have to use your own custom mocks, please, write tests for them, since they can have a lot of logic inside of them.</p>

<p>And, finally, <code>Fake</code> - is a test double providing a simpler implementation used in the tests instead of the real thing. A good example is an in-memory database gateway, that behaves the same way the real one would, but it stores all the data in the memory. A very simple example:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="kd">function</span> <span class="nx">FakeDatabase</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">objects</span> <span class="o">=</span> <span class="p">{};</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">this</span><span class="p">.</span><span class="nx">save</span> <span class="o">=</span> <span class="kd">function</span> <span class="p">(</span><span class="nx">id</span><span class="p">,</span> <span class="nx">object</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="nx">objects</span><span class="p">[</span><span class="nx">id</span><span class="p">]</span> <span class="o">=</span> <span class="nx">object</span><span class="p">;</span>
</span><span class='line'>  <span class="p">};</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">this</span><span class="p">.</span><span class="nx">findById</span> <span class="o">=</span> <span class="kd">function</span> <span class="p">(</span><span class="nx">id</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">return</span> <span class="nx">objects</span><span class="p">[</span><span class="nx">id</span><span class="p">];</span>
</span><span class='line'>  <span class="p">};</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">this</span><span class="p">.</span><span class="nx">findByName</span> <span class="o">=</span> <span class="kd">function</span> <span class="p">(</span><span class="nx">name</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">for</span> <span class="p">(</span><span class="kd">var</span> <span class="nx">id</span> <span class="k">in</span> <span class="nx">objects</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>      <span class="k">if</span> <span class="p">(</span><span class="nx">objects</span><span class="p">.</span><span class="nx">hasOwnProperty</span><span class="p">(</span><span class="nx">id</span><span class="p">))</span> <span class="p">{</span>
</span><span class='line'>        <span class="k">if</span> <span class="p">(</span><span class="nx">objects</span><span class="p">[</span><span class="nx">id</span><span class="p">].</span><span class="nx">name</span> <span class="o">===</span> <span class="nx">name</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>          <span class="k">return</span> <span class="nx">objects</span><span class="p">[</span><span class="nx">id</span><span class="p">];</span>
</span><span class='line'>        <span class="p">}</span>
</span><span class='line'>      <span class="p">}</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">return</span> <span class="kc">null</span><span class="p">;</span>
</span><span class='line'>  <span class="p">};</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>Obviously, fakes require full-blown testing for them. And if the real implementation is testable (even if it is slow), it is a good idea to have the same test suite for both: fake and real implementation. This way we can really be sure, that the fake behaves the same way as the real thing. And don&rsquo;t forget about the edge cases, for example, if the real thing can throw a <code>ConnectionError</code>, the fake should be able too (after being instructed to do so via a special method in the tests).</p>

<h2>Thanks</h2>

<p>Thank you for reading, my dear reader. If you liked it, please share this article on social networks and follow me on twitter: <a href="https://twitter.com/tdd_fellow">@tdd_fellow</a>.</p>

<p>If you have any questions or feedback for me, don&rsquo;t hesitate to reach me out on Twitter: <a href="https://twitter.com/tdd_fellow">@tdd_fellow</a>.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Build Your Own Testing Framework. Part 4]]></title>
    <link href="http://www.tddfellow.com/blog/2016/09/17/build-your-own-testing-framework-part-4/"/>
    <updated>2016-09-17T10:00:32+02:00</updated>
    <id>http://www.tddfellow.com/blog/2016/09/17/build-your-own-testing-framework-part-4</id>
    <content type="html"><![CDATA[<p>Welcome back to the new issue of &ldquo;Build Your Own Testing Framework&rdquo; series! As you might have noticed, currently, our testing framework only outputs failures and nothing else. It is impossible to know if it actually runs any tests when they all pass because there is no output. Today we will implement a simple reporter for our testing framework. It will report the name of the test suite and names of the tests that are being executed, for example:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>SpyTest
</span><span class='line'>    testIsNotCalledInitially
</span><span class='line'>    testAssertNotCalledFailsWhenWasCalled
</span><span class='line'>    testIsCalledAfterBeingCalled
</span><span class='line'>    testAssertCalledFailsWhenWasNotCalled</span></code></pre></td></tr></table></div></figure>


<p>This article is the fourth one of the series &ldquo;Build Your Own Testing Framework&rdquo;, so make sure to stick around for next parts! All articles of these series can be found <a href="http://www.tddfellow.com/blog/categories/build-your-own-testing-framework/">here</a>.</p>

<p>Shall we get started?</p>

<!--more-->


<h2>Render the name of the test suite</h2>

<p>So where should the name of the test suite come from? Probably it should be a test suite class name. Currently, all of them are anonymous classes and therefore don&rsquo;t have a name:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="nx">runTestSuite</span><span class="p">(</span><span class="kd">function</span> <span class="p">()</span> <span class="p">{</span>
</span><span class='line'>  <span class="c1">//         ^          ^</span>
</span><span class='line'>  <span class="c1">//       - no name here -</span>
</span><span class='line'>  <span class="c1">// ...</span>
</span><span class='line'><span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>


<p>We would like all test suites to have that name, for example:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="nx">runTestSuite</span><span class="p">(</span><span class="kd">function</span> <span class="nx">SpyTest</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>  <span class="c1">//                 ^       ^</span>
</span><span class='line'>  <span class="c1">//            - here is the name -</span>
</span><span class='line'>  <span class="c1">// ...</span>
</span><span class='line'><span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>


<p>We should write a test for this case:</p>

<ol>
<li>Create a test suite with the name</li>
<li>Run the test suite with function <code>runTestSuite</code></li>
<li>Assert that the test suite name is reported</li>
</ol>


<p>Let&rsquo;s try to write a test in a <code>RunTestSuiteTest.js</code> test suite for that:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="k">this</span><span class="p">.</span><span class="nx">testItOutputsNameOfTheTest</span> <span class="o">=</span> <span class="kd">function</span> <span class="p">()</span> <span class="p">{</span>
</span><span class='line'>  <span class="nx">runTestSuite</span><span class="p">(</span><span class="kd">function</span> <span class="nx">TestSuiteName</span><span class="p">(</span><span class="nx">t</span><span class="p">)</span> <span class="p">{});</span>
</span><span class='line'>
</span><span class='line'>  <span class="c1">// TODO: assert that the test suite name is reported</span>
</span><span class='line'><span class="p">};</span>
</span></code></pre></td></tr></table></div></figure>


<p>Now it is problematic: how are we going to assert that something is reported? Should we replace <code>console.log(message)</code> or <code>process.stdout.write(message)</code> with our own implementation, so that we can test it?:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="kd">var</span> <span class="nx">logged</span> <span class="o">=</span> <span class="s2">&quot;&quot;</span><span class="p">;</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">oldConsoleLog</span> <span class="o">=</span> <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'><span class="nx">console</span><span class="p">.</span><span class="nx">log</span> <span class="o">=</span> <span class="kd">function</span> <span class="p">(</span><span class="nx">message</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>  <span class="nx">logged</span> <span class="o">=</span> <span class="nx">logged</span> <span class="o">+</span> <span class="nx">message</span> <span class="o">+</span> <span class="s2">&quot;\n&quot;</span><span class="p">;</span>
</span><span class='line'><span class="p">};</span>
</span></code></pre></td></tr></table></div></figure>


<p>And then we should be able to assert with: <code>t.assertTrue(logged.indexOf("TestSuiteName") &gt;= 0)</code>. Finally we will need to restore the old <code>console.log</code> function:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="k">this</span><span class="p">.</span><span class="nx">testItOutputsNameOfTheTest</span> <span class="o">=</span> <span class="kd">function</span> <span class="p">()</span> <span class="p">{</span>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">logged</span> <span class="o">=</span> <span class="s2">&quot;&quot;</span><span class="p">;</span>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">oldConsoleLog</span> <span class="o">=</span> <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>  <span class="nx">console</span><span class="p">.</span><span class="nx">log</span> <span class="o">=</span> <span class="kd">function</span> <span class="p">(</span><span class="nx">message</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="nx">logged</span> <span class="o">=</span> <span class="nx">logged</span> <span class="o">+</span> <span class="nx">message</span> <span class="o">+</span> <span class="s2">&quot;\n&quot;</span><span class="p">;</span>
</span><span class='line'>  <span class="p">};</span>
</span><span class='line'>
</span><span class='line'>  <span class="nx">runTestSuite</span><span class="p">(</span><span class="kd">function</span> <span class="nx">TestSuiteName</span><span class="p">(</span><span class="nx">t</span><span class="p">)</span> <span class="p">{});</span>
</span><span class='line'>
</span><span class='line'>  <span class="nx">t</span><span class="p">.</span><span class="nx">assertTrue</span><span class="p">(</span><span class="nx">logged</span><span class="p">.</span><span class="nx">indexOf</span><span class="p">(</span><span class="s2">&quot;TestSuiteName&quot;</span> <span class="o">&gt;=</span> <span class="mi">0</span><span class="p">));</span>
</span><span class='line'>
</span><span class='line'>  <span class="nx">console</span><span class="p">.</span><span class="nx">log</span> <span class="o">=</span> <span class="nx">oldConsoleLog</span><span class="p">;</span>
</span><span class='line'><span class="p">};</span>
</span></code></pre></td></tr></table></div></figure>


<p>While this code works, it has multitude of problems:</p>

<ul>
<li>If the test fails then <code>oldConsoleLog</code> function is not restored;</li>
<li>It has too much setup (which we could extract as a function);</li>
<li>It has teardown (which would be nice to avoid if we could);</li>
<li>It is hard to read because from 8 lines of code only 2 are delivering the core intent;</li>
<li>And it is testing how exactly test suite name is being reported, which is basically a View-like concern.</li>
</ul>


<p>And fixing the last problem will actually fix everything else because this problem causes others. We can fix it by introducing some sort of <code>Reporter</code> type, that can respond to <code>reportTestSuite(name)</code> message:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="k">this</span><span class="p">.</span><span class="nx">testItOutputsNameOfTheTest</span> <span class="o">=</span> <span class="kd">function</span> <span class="p">()</span> <span class="p">{</span>
</span><span class='line'>  <span class="nx">runTestSuite</span><span class="p">(</span><span class="kd">function</span> <span class="nx">TestSuiteName</span><span class="p">(</span><span class="nx">t</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>  <span class="p">},</span> <span class="p">{</span><span class="nx">reporter</span><span class="o">:</span> <span class="nx">reporter</span><span class="p">});</span>
</span><span class='line'>
</span><span class='line'>  <span class="nx">t</span><span class="p">.</span><span class="nx">assertTrue</span><span class="p">(</span><span class="nx">reporter</span><span class="p">.</span><span class="nx">hasReportedTestSuite</span><span class="p">(</span><span class="s2">&quot;TestSuiteName&quot;</span><span class="p">));</span>
</span><span class='line'>  <span class="c1">// or even better:</span>
</span><span class='line'>  <span class="nx">reporter</span><span class="p">.</span><span class="nx">assertHasReportedTestSuite</span><span class="p">(</span><span class="s2">&quot;TestSuiteName&quot;</span><span class="p">);</span>
</span><span class='line'><span class="p">};</span>
</span></code></pre></td></tr></table></div></figure>


<p><code>reporter</code> in this case is some sort of test double. And what are they? - Find out here: <a href="http://www.tddfellow.com/blog/2016/09/18/introducing-test-doubles/">Introducing Test Doubles</a>.</p>

<h2>Implementing the reporter spy</h2>

<p>So our <code>reporter</code> object in the test seems terribly like a Spy Double to me, let&rsquo;s test-drive it:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="c1">// test/ReporterSpyTest.js</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">runTestSuite</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s2">&quot;../src/TestingFramework&quot;</span><span class="p">);</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">ReporterSpy</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s2">&quot;./ReporterSpy&quot;</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'><span class="nx">runTestSuite</span><span class="p">(</span><span class="kd">function</span> <span class="nx">ReporterSpy_BehaviorTest</span><span class="p">(</span><span class="nx">t</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">reporter</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">ReporterSpy</span><span class="p">(</span><span class="nx">t</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>  <span class="c1">// Let&#39;s write our first test:</span>
</span><span class='line'>  <span class="k">this</span><span class="p">.</span><span class="nx">testAssertHasReportedTestSuite_whenFailing</span> <span class="o">=</span> <span class="kd">function</span> <span class="p">()</span> <span class="p">{</span>
</span><span class='line'>    <span class="nx">t</span><span class="p">.</span><span class="nx">assertThrow</span><span class="p">(</span>
</span><span class='line'>      <span class="s2">&quot;Expected test suite &#39;HelloWorld&#39; to be reported&quot;</span><span class="p">,</span>
</span><span class='line'>      <span class="kd">function</span> <span class="p">()</span> <span class="p">{</span>
</span><span class='line'>        <span class="nx">reporter</span><span class="p">.</span><span class="nx">assertHasReportedTestSuite</span><span class="p">(</span><span class="s2">&quot;HelloWorld&quot;</span><span class="p">);</span>
</span><span class='line'>      <span class="p">}</span>
</span><span class='line'>    <span class="p">);</span>
</span><span class='line'>  <span class="p">};</span>
</span><span class='line'><span class="p">});</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// Error: Cannot find module &#39;./ReporterSpy&#39;</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// Create file test/ReporterSpy.js</span>
</span></code></pre></td></tr></table></div></figure>


<p>Now we are getting the following error:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="c1">//     var reporter = new ReporterSpy(t);</span>
</span><span class='line'><span class="c1">//                    ^</span>
</span><span class='line'><span class="c1">//</span>
</span><span class='line'><span class="c1">// TypeError: ReporterSpy is not a function</span>
</span></code></pre></td></tr></table></div></figure>


<p>We need to create ReporterSpy object now:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="nx">module</span><span class="p">.</span><span class="nx">exports</span> <span class="o">=</span> <span class="kd">function</span> <span class="nx">ReporterSpy</span><span class="p">(</span><span class="nx">assertions</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>
</span><span class='line'><span class="p">};</span>
</span></code></pre></td></tr></table></div></figure>


<p>Now we are getting:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="c1">// Error: Expected to equal</span>
</span><span class='line'><span class="c1">//   Expected test suite &#39;HelloWorld&#39; to be reported,</span>
</span><span class='line'><span class="c1">// but got:</span>
</span><span class='line'><span class="c1">//   reporter.assertHasReportedTestSuite is not a function</span>
</span></code></pre></td></tr></table></div></figure>


<p>Now we need to create a function <code>assertHasReportedTestSuite(name)</code> for out <code>ReporterSpy</code>:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="k">this</span><span class="p">.</span><span class="nx">assertHasReportedTestSuite</span> <span class="o">=</span> <span class="kd">function</span> <span class="p">(</span><span class="nx">expectedName</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>  <span class="nx">assertions</span><span class="p">.</span><span class="nx">assertTrue</span><span class="p">(</span>
</span><span class='line'>    <span class="kc">false</span><span class="p">,</span>
</span><span class='line'>    <span class="s2">&quot;Expected test suite &#39;HelloWorld&#39; to be reported&quot;</span>
</span><span class='line'>  <span class="p">);</span>
</span><span class='line'><span class="p">};</span>
</span></code></pre></td></tr></table></div></figure>


<p>Next we need to make sure, that <code>expectedName</code> is actually present in the error message by triangulating with different name:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="k">this</span><span class="p">.</span><span class="nx">testAssertHasReportedTestSuite_whenFailing_withOtherName</span> <span class="o">=</span> <span class="kd">function</span> <span class="p">()</span> <span class="p">{</span>
</span><span class='line'>  <span class="nx">t</span><span class="p">.</span><span class="nx">assertThrow</span><span class="p">(</span><span class="s2">&quot;Expected test suite &#39;OtherTestSuite&#39; to be reported&quot;</span><span class="p">,</span> <span class="kd">function</span> <span class="p">()</span> <span class="p">{</span>
</span><span class='line'>    <span class="nx">reporter</span><span class="p">.</span><span class="nx">assertHasReportedTestSuite</span><span class="p">(</span><span class="s2">&quot;OtherTestSuite&quot;</span><span class="p">);</span>
</span><span class='line'>  <span class="p">});</span>
</span><span class='line'><span class="p">};</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// Error: Expected to equal</span>
</span><span class='line'><span class="c1">//   Expected test suite &#39;OtherTestSuite&#39; to be reported,</span>
</span><span class='line'><span class="c1">// but got:</span>
</span><span class='line'><span class="c1">//   Expected test suite &#39;HelloWorld&#39; to be reported</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// And we need to change the respective string:</span>
</span><span class='line'><span class="s2">&quot;Expected test suite &#39;&quot;</span> <span class="o">+</span> <span class="nx">expectedName</span> <span class="o">+</span> <span class="s2">&quot;&#39; to be reported&quot;</span>
</span></code></pre></td></tr></table></div></figure>


<p>Then we need to make sure that we do succeed when the message is received:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
<span class='line-number'>37</span>
<span class='line-number'>38</span>
<span class='line-number'>39</span>
<span class='line-number'>40</span>
<span class='line-number'>41</span>
<span class='line-number'>42</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="k">this</span><span class="p">.</span><span class="nx">testAssertHasReportedTestSuite_whenSucceeding</span> <span class="o">=</span> <span class="kd">function</span> <span class="p">()</span> <span class="p">{</span>
</span><span class='line'>  <span class="nx">t</span><span class="p">.</span><span class="nx">assertNotThrow</span><span class="p">(</span><span class="kd">function</span> <span class="p">()</span> <span class="p">{</span>
</span><span class='line'>    <span class="nx">reporter</span><span class="p">.</span><span class="nx">reportTestSuite</span><span class="p">(</span><span class="s2">&quot;HelloWorld&quot;</span><span class="p">);</span>
</span><span class='line'>    <span class="nx">reporter</span><span class="p">.</span><span class="nx">assertHasReportedTestSuite</span><span class="p">(</span><span class="s2">&quot;HelloWorld&quot;</span><span class="p">);</span>
</span><span class='line'>  <span class="p">});</span>
</span><span class='line'><span class="p">};</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// Error:</span>
</span><span class='line'><span class="c1">//   Expected not to throw error,</span>
</span><span class='line'><span class="c1">// but thrown</span>
</span><span class='line'><span class="c1">//   &#39;reporter.reportTestSuite is not a function&#39;</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// So we need to define this function in ReporterSpy:</span>
</span><span class='line'><span class="k">this</span><span class="p">.</span><span class="nx">reportTestSuite</span> <span class="o">=</span> <span class="kd">function</span> <span class="p">(</span><span class="nx">name</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>
</span><span class='line'><span class="p">};</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// Error:</span>
</span><span class='line'><span class="c1">//   Expected not to throw error,</span>
</span><span class='line'><span class="c1">// but thrown</span>
</span><span class='line'><span class="c1">//   &#39;Expected test suite &#39;HelloWorld&#39; to be reported&#39;</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// Now we need to provide the simplest implementation we can,</span>
</span><span class='line'><span class="c1">// we can do that by introducing the boolean variable:</span>
</span><span class='line'>
</span><span class='line'><span class="nx">module</span><span class="p">.</span><span class="nx">exports</span> <span class="o">=</span> <span class="kd">function</span> <span class="nx">ReporterSpy</span><span class="p">(</span><span class="nx">assertions</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>  <span class="c1">// initially nothing is reported</span>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">hasReported</span> <span class="o">=</span> <span class="kc">false</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">this</span><span class="p">.</span><span class="nx">assertHasReportedTestSuite</span> <span class="o">=</span> <span class="kd">function</span> <span class="p">(</span><span class="nx">expectedName</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="nx">assertions</span><span class="p">.</span><span class="nx">assertTrue</span><span class="p">(</span>
</span><span class='line'>      <span class="c1">// we should fail only when nothing was reported</span>
</span><span class='line'>      <span class="nx">hasReported</span><span class="p">,</span>
</span><span class='line'>      <span class="s2">&quot;Expected test suite &#39;&quot;</span> <span class="o">+</span> <span class="nx">expectedName</span> <span class="o">+</span> <span class="s2">&quot;&#39; to be reported&quot;</span>
</span><span class='line'>    <span class="p">);</span>
</span><span class='line'>  <span class="p">};</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">this</span><span class="p">.</span><span class="nx">reportTestSuite</span> <span class="o">=</span> <span class="kd">function</span> <span class="p">(</span><span class="nx">name</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="c1">// and we mark it as reported when we do receive the message</span>
</span><span class='line'>    <span class="nx">hasReported</span> <span class="o">=</span> <span class="kc">true</span><span class="p">;</span>
</span><span class='line'>  <span class="p">};</span>
</span><span class='line'><span class="p">};</span>
</span></code></pre></td></tr></table></div></figure>


<p>And all our tests pass. Now, when the wrong name is getting reported we should still fail:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="k">this</span><span class="p">.</span><span class="nx">testAssertHasReportedTestSuite_whenReporting_andFailing</span> <span class="o">=</span> <span class="kd">function</span> <span class="p">()</span> <span class="p">{</span>
</span><span class='line'>  <span class="nx">t</span><span class="p">.</span><span class="nx">assertThrow</span><span class="p">(</span><span class="s2">&quot;Expected test suite &#39;HelloWorld&#39; to be reported&quot;</span><span class="p">,</span> <span class="kd">function</span> <span class="p">()</span> <span class="p">{</span>
</span><span class='line'>    <span class="nx">reporter</span><span class="p">.</span><span class="nx">reportTestSuite</span><span class="p">(</span><span class="s2">&quot;OtherTestSuite&quot;</span><span class="p">);</span>
</span><span class='line'>    <span class="nx">reporter</span><span class="p">.</span><span class="nx">assertHasReportedTestSuite</span><span class="p">(</span><span class="s2">&quot;HelloWorld&quot;</span><span class="p">);</span>
</span><span class='line'>  <span class="p">});</span>
</span><span class='line'><span class="p">};</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// Error: Expected to throw an error,</span>
</span><span class='line'><span class="c1">// but nothing was thrown</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// Now we need to actually store the name of reported test suite:</span>
</span><span class='line'>
</span><span class='line'><span class="nx">module</span><span class="p">.</span><span class="nx">exports</span> <span class="o">=</span> <span class="kd">function</span> <span class="nx">ReporterSpy</span><span class="p">(</span><span class="nx">assertions</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>  <span class="c1">// initially, we didn&#39;t receive any reports</span>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">testSuiteName</span> <span class="o">=</span> <span class="kc">null</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">this</span><span class="p">.</span><span class="nx">assertHasReportedTestSuite</span> <span class="o">=</span> <span class="kd">function</span> <span class="p">(</span><span class="nx">expectedName</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="nx">assertions</span><span class="p">.</span><span class="nx">assertTrue</span><span class="p">(</span>
</span><span class='line'>      <span class="c1">// we fail only if received testSuiteName is not right</span>
</span><span class='line'>      <span class="nx">testSuiteName</span> <span class="o">===</span> <span class="s2">&quot;HelloWorld&quot;</span><span class="p">,</span>
</span><span class='line'>      <span class="s2">&quot;Expected test suite &#39;&quot;</span> <span class="o">+</span> <span class="nx">expectedName</span> <span class="o">+</span> <span class="s2">&quot;&#39; to be reported&quot;</span>
</span><span class='line'>    <span class="p">);</span>
</span><span class='line'>  <span class="p">};</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">this</span><span class="p">.</span><span class="nx">reportTestSuite</span> <span class="o">=</span> <span class="kd">function</span> <span class="p">(</span><span class="nx">name</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="c1">// and we need to store the reported name</span>
</span><span class='line'>    <span class="nx">testSuiteName</span> <span class="o">=</span> <span class="nx">name</span><span class="p">;</span>
</span><span class='line'>  <span class="p">};</span>
</span><span class='line'><span class="p">};</span>
</span></code></pre></td></tr></table></div></figure>


<p>And all tests pass again. Although, we should notice this weird condition:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="nx">testSuiteName</span> <span class="o">===</span> <span class="s2">&quot;HelloWorld&quot;</span>
</span></code></pre></td></tr></table></div></figure>


<p>Looks like our current production code is not generic enough, it will work well only with the <code>expectedName</code> equal to <code>"HelloWorld"</code>. Let&rsquo;s fix that by triangulating over this parameter:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="k">this</span><span class="p">.</span><span class="nx">testAssertHasReportedTestSuite_whenReporting_andFailingWithDifferentName</span> <span class="o">=</span> <span class="kd">function</span> <span class="p">()</span> <span class="p">{</span>
</span><span class='line'>  <span class="nx">t</span><span class="p">.</span><span class="nx">assertThrow</span><span class="p">(</span><span class="s2">&quot;Expected test suite &#39;OtherTestSuite&#39; to be reported&quot;</span><span class="p">,</span> <span class="kd">function</span> <span class="p">()</span> <span class="p">{</span>
</span><span class='line'>    <span class="nx">reporter</span><span class="p">.</span><span class="nx">reportTestSuite</span><span class="p">(</span><span class="s2">&quot;HelloWorld&quot;</span><span class="p">);</span>
</span><span class='line'>    <span class="nx">reporter</span><span class="p">.</span><span class="nx">assertHasReportedTestSuite</span><span class="p">(</span><span class="s2">&quot;OtherTestSuite&quot;</span><span class="p">);</span>
</span><span class='line'>  <span class="p">});</span>
</span><span class='line'><span class="p">};</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// Error: Expected to throw an error,</span>
</span><span class='line'><span class="c1">// but nothing was thrown</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// And we should fix it by actually using the `expectedName`:</span>
</span><span class='line'>
</span><span class='line'><span class="nx">assertions</span><span class="p">.</span><span class="nx">assertTrue</span><span class="p">(</span>
</span><span class='line'>  <span class="nx">testSuiteName</span> <span class="o">===</span> <span class="nx">expectedName</span><span class="p">,</span>
</span><span class='line'>  <span class="c1">//               ^ fixed here ^</span>
</span><span class='line'>  <span class="s2">&quot;Expected test suite &#39;&quot;</span> <span class="o">+</span> <span class="nx">expectedName</span> <span class="o">+</span> <span class="s2">&quot;&#39; to be reported&quot;</span>
</span><span class='line'><span class="p">);</span>
</span></code></pre></td></tr></table></div></figure>


<p>And all the tests pass. Now we can get back to our failing test for the <code>runTestSuite</code>:</p>

<h2>Implementing rendering of the name of the test suite</h2>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="k">this</span><span class="p">.</span><span class="nx">testItOutputsNameOfTheTest</span> <span class="o">=</span> <span class="kd">function</span> <span class="p">()</span> <span class="p">{</span>
</span><span class='line'>  <span class="nx">runTestSuite</span><span class="p">(</span><span class="kd">function</span> <span class="nx">TestSuiteName</span><span class="p">(</span><span class="nx">t</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>  <span class="p">},</span> <span class="p">{</span><span class="nx">reporter</span><span class="o">:</span> <span class="nx">reporter</span><span class="p">});</span>
</span><span class='line'>
</span><span class='line'>  <span class="nx">reporter</span><span class="p">.</span><span class="nx">assertHasReportedTestSuite</span><span class="p">(</span><span class="s2">&quot;TestSuiteName&quot;</span><span class="p">);</span>
</span><span class='line'><span class="p">};</span>
</span></code></pre></td></tr></table></div></figure>


<p>To implement this, first we will need to accept <code>options</code> parameter with sane defaults:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="kd">function</span> <span class="nx">runTestSuite</span><span class="p">(</span><span class="nx">testSuiteConstructor</span><span class="p">,</span> <span class="nx">options</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>  <span class="nx">options</span> <span class="o">=</span> <span class="nx">options</span> <span class="o">||</span> <span class="p">{};</span>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">reporter</span> <span class="o">=</span> <span class="nx">options</span><span class="p">.</span><span class="nx">reporter</span> <span class="o">||</span> <span class="k">new</span> <span class="nx">SimpleReporter</span><span class="p">();</span>
</span><span class='line'>
</span><span class='line'>  <span class="c1">// ...</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// We have to implement this, otherwise our test suite will fail</span>
</span><span class='line'><span class="kd">function</span> <span class="nx">SimpleReporter</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">this</span><span class="p">.</span><span class="nx">reportTestSuite</span> <span class="o">=</span> <span class="kd">function</span> <span class="p">(</span><span class="nx">name</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>        <span class="nx">process</span><span class="p">.</span><span class="nx">stdout</span><span class="p">.</span><span class="nx">write</span><span class="p">(</span><span class="s2">&quot;\n&quot;</span> <span class="o">+</span> <span class="nx">name</span> <span class="o">+</span> <span class="s2">&quot;\n&quot;</span><span class="p">);</span>
</span><span class='line'>    <span class="p">};</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>After making the failing test pass and triangulating over the name of the test suite:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="kd">function</span> <span class="nx">runTestSuite</span><span class="p">(</span><span class="nx">testSuiteConstructor</span><span class="p">,</span> <span class="nx">options</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>  <span class="nx">options</span> <span class="o">=</span> <span class="nx">options</span> <span class="o">||</span> <span class="p">{};</span>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">reporter</span> <span class="o">=</span> <span class="nx">options</span><span class="p">.</span><span class="nx">reporter</span> <span class="o">||</span> <span class="k">new</span> <span class="nx">SimpleReporter</span><span class="p">();</span>
</span><span class='line'>
</span><span class='line'>  <span class="nx">reporter</span><span class="p">.</span><span class="nx">reportTestSuite</span><span class="p">(</span><span class="nx">testSuiteConstructor</span><span class="p">.</span><span class="nx">name</span><span class="p">)</span>
</span><span class='line'>
</span><span class='line'>  <span class="c1">// ...</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>And all tests pass now. Unfortunately, this is the output that we see now:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'>
</span></code></pre></td></tr></table></div></figure>


<p>Yeah, empty lines. This is because <code>(function () {}).name</code> is equal to <code>""</code>. We need to give proper names to all our anonymous constructors for the test suites:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="nx">runTestSuite</span><span class="p">(</span><span class="kd">function</span> <span class="nx">RunTestSuiteTest</span><span class="p">(</span><span class="nx">t</span><span class="p">)</span> <span class="p">{</span> <span class="p">...</span> <span class="p">});</span>
</span><span class='line'><span class="nx">runTestSuite</span><span class="p">(</span><span class="kd">function</span> <span class="nx">AssertEqualTest</span><span class="p">(</span><span class="nx">t</span><span class="p">)</span> <span class="p">{</span> <span class="p">...</span> <span class="p">});</span>
</span><span class='line'><span class="c1">// .. and so on ..</span>
</span></code></pre></td></tr></table></div></figure>


<p>And now we should see the correct output:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="nx">AssertEqualTest</span>
</span><span class='line'>
</span><span class='line'><span class="nx">AssertNotEqualTest</span>
</span><span class='line'>
</span><span class='line'><span class="nx">AssertNotThrowTest</span>
</span><span class='line'>
</span><span class='line'><span class="nx">AssertThrowTest</span>
</span><span class='line'>
</span><span class='line'><span class="nx">AssertTrueTest</span>
</span><span class='line'>
</span><span class='line'><span class="nx">FizzBuzzKataTest</span>
</span><span class='line'>
</span><span class='line'><span class="p">..</span> <span class="nx">and</span> <span class="nx">so</span> <span class="nx">on</span> <span class="p">..</span>
</span></code></pre></td></tr></table></div></figure>


<p>Great, now we would like to render the name of the executed test:</p>

<h2>Render the name of the executed test</h2>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="k">this</span><span class="p">.</span><span class="nx">testItOutputsNameOfTheTest</span> <span class="o">=</span> <span class="kd">function</span> <span class="p">()</span> <span class="p">{</span>
</span><span class='line'>  <span class="nx">runTestSuite</span><span class="p">(</span><span class="kd">function</span> <span class="nx">TestSuiteName</span><span class="p">(</span><span class="nx">t</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">this</span><span class="p">.</span><span class="nx">testSomeTestName</span> <span class="o">=</span> <span class="kd">function</span> <span class="p">()</span> <span class="p">{};</span>
</span><span class='line'>    <span class="k">this</span><span class="p">.</span><span class="nx">testSomeOtherTestName</span> <span class="o">=</span> <span class="kd">function</span> <span class="p">()</span> <span class="p">{};</span>
</span><span class='line'>  <span class="p">},</span> <span class="p">{</span><span class="nx">reporter</span><span class="o">:</span> <span class="nx">reporter</span><span class="p">});</span>
</span><span class='line'>
</span><span class='line'>  <span class="nx">reporter</span><span class="p">.</span><span class="nx">assertHasReportedTestSuite</span><span class="p">(</span><span class="s2">&quot;TestSuiteName&quot;</span><span class="p">);</span>
</span><span class='line'>  <span class="nx">reporter</span><span class="p">.</span><span class="nx">assertHasReportedTest</span><span class="p">(</span><span class="s2">&quot;testSomeTestName&quot;</span><span class="p">);</span>
</span><span class='line'>  <span class="nx">reporter</span><span class="p">.</span><span class="nx">assertHasReportedTest</span><span class="p">(</span><span class="s2">&quot;testSomeOtherTestName&quot;</span><span class="p">);</span>
</span><span class='line'><span class="p">};</span>
</span></code></pre></td></tr></table></div></figure>


<p>Of course this fails, because we need to implement <code>assertHasReportedTest(name)</code> now for our <code>ReporterSpy</code>. Let&rsquo;s test-drive it:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
<span class='line-number'>37</span>
<span class='line-number'>38</span>
<span class='line-number'>39</span>
<span class='line-number'>40</span>
<span class='line-number'>41</span>
<span class='line-number'>42</span>
<span class='line-number'>43</span>
<span class='line-number'>44</span>
<span class='line-number'>45</span>
<span class='line-number'>46</span>
<span class='line-number'>47</span>
<span class='line-number'>48</span>
<span class='line-number'>49</span>
<span class='line-number'>50</span>
<span class='line-number'>51</span>
<span class='line-number'>52</span>
<span class='line-number'>53</span>
<span class='line-number'>54</span>
<span class='line-number'>55</span>
<span class='line-number'>56</span>
<span class='line-number'>57</span>
<span class='line-number'>58</span>
<span class='line-number'>59</span>
<span class='line-number'>60</span>
<span class='line-number'>61</span>
<span class='line-number'>62</span>
<span class='line-number'>63</span>
<span class='line-number'>64</span>
<span class='line-number'>65</span>
<span class='line-number'>66</span>
<span class='line-number'>67</span>
<span class='line-number'>68</span>
<span class='line-number'>69</span>
<span class='line-number'>70</span>
<span class='line-number'>71</span>
<span class='line-number'>72</span>
<span class='line-number'>73</span>
<span class='line-number'>74</span>
<span class='line-number'>75</span>
<span class='line-number'>76</span>
<span class='line-number'>77</span>
<span class='line-number'>78</span>
<span class='line-number'>79</span>
<span class='line-number'>80</span>
<span class='line-number'>81</span>
<span class='line-number'>82</span>
<span class='line-number'>83</span>
<span class='line-number'>84</span>
<span class='line-number'>85</span>
<span class='line-number'>86</span>
<span class='line-number'>87</span>
<span class='line-number'>88</span>
<span class='line-number'>89</span>
<span class='line-number'>90</span>
<span class='line-number'>91</span>
<span class='line-number'>92</span>
<span class='line-number'>93</span>
<span class='line-number'>94</span>
<span class='line-number'>95</span>
<span class='line-number'>96</span>
<span class='line-number'>97</span>
<span class='line-number'>98</span>
<span class='line-number'>99</span>
<span class='line-number'>100</span>
<span class='line-number'>101</span>
<span class='line-number'>102</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="c1">// test/ReporterSpyTest.js</span>
</span><span class='line'><span class="k">this</span><span class="p">.</span><span class="nx">testAssertHasReportedTest_whenFailing</span> <span class="o">=</span> <span class="kd">function</span> <span class="p">()</span> <span class="p">{</span>
</span><span class='line'>  <span class="nx">t</span><span class="p">.</span><span class="nx">assertThrow</span><span class="p">(</span><span class="s2">&quot;Expected test &#39;testName&#39; to be reported&quot;</span><span class="p">,</span> <span class="kd">function</span> <span class="p">()</span> <span class="p">{</span>
</span><span class='line'>    <span class="nx">reporter</span><span class="p">.</span><span class="nx">assertHasReportedTest</span><span class="p">(</span><span class="s2">&quot;testName&quot;</span><span class="p">);</span>
</span><span class='line'>  <span class="p">});</span>
</span><span class='line'><span class="p">};</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// Error: Expected to equal</span>
</span><span class='line'><span class="c1">//   Expected test &#39;testName&#39; to be reported,</span>
</span><span class='line'><span class="c1">// but got:</span>
</span><span class='line'><span class="c1">//   reporter.assertHasReportedTest is not a function</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// We need to define assertHasReportedTest(name) method:</span>
</span><span class='line'><span class="k">this</span><span class="p">.</span><span class="nx">assertHasReportedTest</span> <span class="o">=</span> <span class="kd">function</span> <span class="p">(</span><span class="nx">expectedName</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>
</span><span class='line'><span class="p">};</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// Error: Expected to throw an error,</span>
</span><span class='line'><span class="c1">// but nothing was thrown</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// We need to make it throw the expected error:</span>
</span><span class='line'><span class="k">this</span><span class="p">.</span><span class="nx">assertHasReportedTest</span> <span class="o">=</span> <span class="kd">function</span> <span class="p">(</span><span class="nx">expectedName</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>  <span class="nx">assertions</span><span class="p">.</span><span class="nx">assertTrue</span><span class="p">(</span>
</span><span class='line'>    <span class="kc">false</span><span class="p">,</span>
</span><span class='line'>    <span class="s2">&quot;Expected test &#39;testName&#39; to be reported&quot;</span>
</span><span class='line'>  <span class="p">);</span>
</span><span class='line'><span class="p">};</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// And the test passes. Message hard-codes `testName` -</span>
</span><span class='line'><span class="c1">// we should triangulate over it:</span>
</span><span class='line'>
</span><span class='line'><span class="k">this</span><span class="p">.</span><span class="nx">testAssertHasReportedTest_whenFailing_withDifferentName</span> <span class="o">=</span> <span class="kd">function</span> <span class="p">()</span> <span class="p">{</span>
</span><span class='line'>  <span class="nx">t</span><span class="p">.</span><span class="nx">assertThrow</span><span class="p">(</span><span class="s2">&quot;Expected test &#39;testDifferentName&#39; to be reported&quot;</span><span class="p">,</span> <span class="kd">function</span> <span class="p">()</span> <span class="p">{</span>
</span><span class='line'>    <span class="nx">reporter</span><span class="p">.</span><span class="nx">assertHasReportedTest</span><span class="p">(</span><span class="s2">&quot;testDifferentName&quot;</span><span class="p">);</span>
</span><span class='line'>  <span class="p">});</span>
</span><span class='line'><span class="p">};</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// Error: Expected to equal</span>
</span><span class='line'><span class="c1">//   Expected test &#39;testDifferentName&#39; to be reported,</span>
</span><span class='line'><span class="c1">// but got:</span>
</span><span class='line'><span class="c1">//   Expected test &#39;testName&#39; to be reported</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// And to fix it:</span>
</span><span class='line'><span class="s2">&quot;Expected test &#39;&quot;</span> <span class="o">+</span> <span class="nx">expectedName</span> <span class="o">+</span> <span class="s2">&quot;&#39; to be reported&quot;</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// Next test will force us to implement simple reportTest function:</span>
</span><span class='line'><span class="k">this</span><span class="p">.</span><span class="nx">testAssertHasReportedTest_whenSucceeding</span> <span class="o">=</span> <span class="kd">function</span> <span class="p">()</span> <span class="p">{</span>
</span><span class='line'>  <span class="nx">t</span><span class="p">.</span><span class="nx">assertNotThrow</span><span class="p">(</span><span class="kd">function</span> <span class="p">()</span> <span class="p">{</span>
</span><span class='line'>    <span class="nx">reporter</span><span class="p">.</span><span class="nx">reportTest</span><span class="p">(</span><span class="s2">&quot;testName&quot;</span><span class="p">);</span>
</span><span class='line'>    <span class="nx">reporter</span><span class="p">.</span><span class="nx">assertHasReportedTest</span><span class="p">(</span><span class="s2">&quot;testName&quot;</span><span class="p">);</span>
</span><span class='line'>  <span class="p">});</span>
</span><span class='line'><span class="p">};</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// Error: reporter.reportTest is not a function</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// After fixing this and triangulating a bit, we get:</span>
</span><span class='line'>
</span><span class='line'><span class="nx">module</span><span class="p">.</span><span class="nx">exports</span> <span class="o">=</span> <span class="kd">function</span> <span class="nx">ReporterSpy</span><span class="p">(</span><span class="nx">assertions</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">testName</span> <span class="o">=</span> <span class="kc">null</span><span class="p">;</span>
</span><span class='line'>  <span class="c1">// ...</span>
</span><span class='line'>  <span class="k">this</span><span class="p">.</span><span class="nx">assertHasReportedTest</span> <span class="o">=</span> <span class="kd">function</span> <span class="p">(</span><span class="nx">expectedName</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="nx">assertions</span><span class="p">.</span><span class="nx">assertTrue</span><span class="p">(</span>
</span><span class='line'>      <span class="nx">testName</span> <span class="o">===</span> <span class="nx">expectedName</span><span class="p">,</span>
</span><span class='line'>      <span class="s2">&quot;Expected test &#39;&quot;</span> <span class="o">+</span> <span class="nx">expectedName</span> <span class="o">+</span> <span class="s2">&quot;&#39; to be reported&quot;</span>
</span><span class='line'>    <span class="p">);</span>
</span><span class='line'>  <span class="p">};</span>
</span><span class='line'>  <span class="k">this</span><span class="p">.</span><span class="nx">reportTest</span> <span class="o">=</span> <span class="kd">function</span> <span class="p">(</span><span class="nx">name</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="nx">testName</span> <span class="o">=</span> <span class="nx">name</span><span class="p">;</span>
</span><span class='line'>  <span class="p">};</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// Finally we need ability to report multiple tests:</span>
</span><span class='line'>
</span><span class='line'><span class="k">this</span><span class="p">.</span><span class="nx">testAssertHasReportedTest_whenSucceeding_withMultipleReports</span> <span class="o">=</span> <span class="kd">function</span> <span class="p">()</span> <span class="p">{</span>
</span><span class='line'>  <span class="nx">t</span><span class="p">.</span><span class="nx">assertNotThrow</span><span class="p">(</span><span class="kd">function</span> <span class="p">()</span> <span class="p">{</span>
</span><span class='line'>    <span class="nx">reporter</span><span class="p">.</span><span class="nx">reportTest</span><span class="p">(</span><span class="s2">&quot;testName&quot;</span><span class="p">);</span>
</span><span class='line'>    <span class="nx">reporter</span><span class="p">.</span><span class="nx">reportTest</span><span class="p">(</span><span class="s2">&quot;testOtherName&quot;</span><span class="p">);</span>
</span><span class='line'>    <span class="nx">reporter</span><span class="p">.</span><span class="nx">assertHasReportedTest</span><span class="p">(</span><span class="s2">&quot;testName&quot;</span><span class="p">);</span>
</span><span class='line'>  <span class="p">});</span>
</span><span class='line'><span class="p">};</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// Error: Expected not to throw error,</span>
</span><span class='line'><span class="c1">// but thrown &#39;Expected test &#39;testName&#39; to be reported&#39;</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// And to implement this:</span>
</span><span class='line'><span class="nx">module</span><span class="p">.</span><span class="nx">exports</span> <span class="o">=</span> <span class="kd">function</span> <span class="nx">ReporterSpy</span><span class="p">(</span><span class="nx">assertions</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>  <span class="c1">// we will store all reported names,</span>
</span><span class='line'>  <span class="c1">// initially no names are reported</span>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">testNames</span> <span class="o">=</span> <span class="p">[];</span>
</span><span class='line'>  <span class="c1">// ...</span>
</span><span class='line'>  <span class="k">this</span><span class="p">.</span><span class="nx">assertHasReportedTest</span> <span class="o">=</span> <span class="kd">function</span> <span class="p">(</span><span class="nx">expectedName</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="nx">assertions</span><span class="p">.</span><span class="nx">assertTrue</span><span class="p">(</span>
</span><span class='line'>      <span class="c1">// check if expectedName was reported</span>
</span><span class='line'>      <span class="nx">testNames</span><span class="p">.</span><span class="nx">indexOf</span><span class="p">(</span><span class="nx">expectedName</span><span class="p">)</span> <span class="o">&gt;=</span> <span class="mi">0</span><span class="p">,</span>
</span><span class='line'>      <span class="s2">&quot;Expected test &#39;&quot;</span> <span class="o">+</span> <span class="nx">expectedName</span> <span class="o">+</span> <span class="s2">&quot;&#39; to be reported&quot;</span>
</span><span class='line'>    <span class="p">);</span>
</span><span class='line'>  <span class="p">};</span>
</span><span class='line'>  <span class="k">this</span><span class="p">.</span><span class="nx">reportTest</span> <span class="o">=</span> <span class="kd">function</span> <span class="p">(</span><span class="nx">name</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="c1">// store the reported test name</span>
</span><span class='line'>    <span class="nx">testNames</span><span class="p">.</span><span class="nx">push</span><span class="p">(</span><span class="nx">name</span><span class="p">);</span>
</span><span class='line'>  <span class="p">};</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>Unfortunately, this does not pass our tests, because this test fails now:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="k">this</span><span class="p">.</span><span class="nx">testAssertHasReportedTest_whenReporting_andFailing</span> <span class="o">=</span> <span class="kd">function</span> <span class="p">()</span> <span class="p">{</span>
</span><span class='line'>  <span class="nx">t</span><span class="p">.</span><span class="nx">assertThrow</span><span class="p">(</span><span class="s2">&quot;Expected test &#39;testName&#39; to be reported&quot;</span><span class="p">,</span> <span class="kd">function</span> <span class="p">()</span> <span class="p">{</span>
</span><span class='line'>    <span class="nx">reporter</span><span class="p">.</span><span class="nx">reportTest</span><span class="p">(</span><span class="s2">&quot;testOtherName&quot;</span><span class="p">);</span>
</span><span class='line'>    <span class="nx">reporter</span><span class="p">.</span><span class="nx">assertHasReportedTest</span><span class="p">(</span><span class="s2">&quot;testName&quot;</span><span class="p">);</span>
</span><span class='line'>  <span class="p">});</span>
</span><span class='line'><span class="p">};</span>
</span></code></pre></td></tr></table></div></figure>


<p>After an investigation, it becomes clear, that this happens because we can not re-use <code>reporter</code> variable defined at the higher level since all tests share the same <code>testSuite</code> object at the moment. We will have to move the creation of the <code>reporter</code> variable inside of each test:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="k">this</span><span class="p">.</span><span class="nx">testAssertHasReportedTest_whenReporting_andFailing</span> <span class="o">=</span> <span class="kd">function</span> <span class="p">()</span> <span class="p">{</span>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">reporter</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">ReporterSpy</span><span class="p">(</span><span class="nx">t</span><span class="p">);</span>
</span><span class='line'>  <span class="c1">// ...</span>
</span><span class='line'><span class="p">};</span>
</span><span class='line'>
</span><span class='line'><span class="k">this</span><span class="p">.</span><span class="nx">testAssertHasReportedTest_whenReporting_andFailing_withOtherName</span> <span class="o">=</span> <span class="kd">function</span> <span class="p">()</span> <span class="p">{</span>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">reporter</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">ReporterSpy</span><span class="p">(</span><span class="nx">t</span><span class="p">);</span>
</span><span class='line'>  <span class="c1">// ...</span>
</span><span class='line'><span class="p">};</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// .. and so on ..</span>
</span></code></pre></td></tr></table></div></figure>


<p>And this makes all our tests pass.</p>

<h2>Stateless tests</h2>

<p>This is quite a noticeable problem, that our users can be frustrated with, so we probably should make it easy on them and allow such variables to be fresh for every test. This can be achieved quite easy if we were to create a new <code>testSuite</code> for each test. Let&rsquo;s write a simple test to show the problem:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="c1">// test/StatelessTest.js</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">runTestSuite</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s2">&quot;../src/TestingFramework&quot;</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'><span class="nx">runTestSuite</span><span class="p">(</span><span class="kd">function</span> <span class="nx">StatelessTest</span><span class="p">(</span><span class="nx">t</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">answer</span> <span class="o">=</span> <span class="mi">41</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">this</span><span class="p">.</span><span class="nx">testItCanMutateVariable_andImmediatelyUseNewValue</span> <span class="o">=</span> <span class="kd">function</span> <span class="p">()</span> <span class="p">{</span>
</span><span class='line'>    <span class="nx">answer</span><span class="o">++</span><span class="p">;</span>
</span><span class='line'>    <span class="nx">t</span><span class="p">.</span><span class="nx">assertEqual</span><span class="p">(</span><span class="mi">42</span><span class="p">,</span> <span class="nx">answer</span><span class="p">);</span>
</span><span class='line'>  <span class="p">};</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">this</span><span class="p">.</span><span class="nx">testItCanMutateVariableAgain_andGetTheSameResult</span> <span class="o">=</span> <span class="kd">function</span> <span class="p">()</span> <span class="p">{</span>
</span><span class='line'>    <span class="nx">answer</span><span class="o">++</span><span class="p">;</span>
</span><span class='line'>    <span class="nx">t</span><span class="p">.</span><span class="nx">assertEqual</span><span class="p">(</span><span class="mi">42</span><span class="p">,</span> <span class="nx">answer</span><span class="p">);</span>
</span><span class='line'>  <span class="p">};</span>
</span><span class='line'>  <span class="c1">// this fails as expected:</span>
</span><span class='line'>  <span class="c1">// Error: Expected to equal 42, but got: 43</span>
</span><span class='line'><span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>


<p>And now let&rsquo;s implement it by creating the <code>testSuite</code> for every test:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="kd">function</span> <span class="nx">runTestSuite</span><span class="p">(</span><span class="nx">testSuiteConstructor</span><span class="p">,</span> <span class="nx">options</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>  <span class="nx">options</span> <span class="o">=</span> <span class="nx">options</span> <span class="o">||</span> <span class="p">{};</span>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">reporter</span> <span class="o">=</span> <span class="nx">options</span><span class="p">.</span><span class="nx">reporter</span> <span class="o">||</span> <span class="k">new</span> <span class="nx">SimpleReporter</span><span class="p">();</span>
</span><span class='line'>
</span><span class='line'>    <span class="nx">reporter</span><span class="p">.</span><span class="nx">reportTestSuite</span><span class="p">(</span><span class="nx">testSuiteConstructor</span><span class="p">.</span><span class="nx">name</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">testSuitePrototype</span> <span class="o">=</span> <span class="nx">createTestSuite</span><span class="p">(</span><span class="nx">testSuiteConstructor</span><span class="p">);</span>
</span><span class='line'>    <span class="c1">// ^ we change this from `testSuite` to `testSuitePrototype`  ^</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">for</span> <span class="p">(</span><span class="kd">var</span> <span class="nx">testName</span> <span class="k">in</span> <span class="nx">testSuitePrototype</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">if</span> <span class="p">(</span><span class="nx">testName</span><span class="p">.</span><span class="nx">match</span><span class="p">(</span><span class="sr">/^test/</span><span class="p">))</span> <span class="p">{</span>
</span><span class='line'>      <span class="kd">var</span> <span class="nx">testSuite</span> <span class="o">=</span> <span class="nx">createTestSuite</span><span class="p">(</span><span class="nx">testSuiteConstructor</span><span class="p">);</span>
</span><span class='line'>            <span class="c1">// ^   and we create our testSuite every time here   ^</span>
</span><span class='line'>      <span class="nx">testSuite</span><span class="p">[</span><span class="nx">testName</span><span class="p">]();</span>
</span><span class='line'>    <span class="c1">// ^  and run test on it ^</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="kd">function</span> <span class="nx">createTestSuite</span><span class="p">(</span><span class="nx">testSuiteConstructor</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">return</span> <span class="k">new</span> <span class="nx">testSuiteConstructor</span><span class="p">(</span><span class="nx">assertions</span><span class="p">);</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>After doing this, we can move <code>var reporter = new ReporterSpy(t);</code> to the top level of the <code>ReporterSpyTest</code> suite again. And all the tests pass.</p>

<h2>Implementation of the rendering of the test name</h2>

<p>Finally, we need to make sure that the test suite, that we have written before will pass:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="k">this</span><span class="p">.</span><span class="nx">testItOutputsNameOfTheTest</span> <span class="o">=</span> <span class="kd">function</span> <span class="p">()</span> <span class="p">{</span>
</span><span class='line'>    <span class="nx">runTestSuite</span><span class="p">(</span><span class="kd">function</span> <span class="nx">TestSuiteName</span><span class="p">(</span><span class="nx">t</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>        <span class="k">this</span><span class="p">.</span><span class="nx">testSomeTestName</span> <span class="o">=</span> <span class="kd">function</span> <span class="p">()</span> <span class="p">{};</span>
</span><span class='line'>        <span class="k">this</span><span class="p">.</span><span class="nx">testSomeOtherTestName</span> <span class="o">=</span> <span class="kd">function</span> <span class="p">()</span> <span class="p">{};</span>
</span><span class='line'>    <span class="p">},</span> <span class="p">{</span><span class="nx">reporter</span><span class="o">:</span> <span class="nx">reporter</span><span class="p">});</span>
</span><span class='line'>
</span><span class='line'>    <span class="nx">reporter</span><span class="p">.</span><span class="nx">assertHasReportedTestSuite</span><span class="p">(</span><span class="s2">&quot;TestSuiteName&quot;</span><span class="p">);</span>
</span><span class='line'>    <span class="nx">reporter</span><span class="p">.</span><span class="nx">assertHasReportedTest</span><span class="p">(</span><span class="s2">&quot;testSomeTestName&quot;</span><span class="p">);</span>
</span><span class='line'>    <span class="nx">reporter</span><span class="p">.</span><span class="nx">assertHasReportedTest</span><span class="p">(</span><span class="s2">&quot;testSomeOtherTestName&quot;</span><span class="p">);</span>
</span><span class='line'><span class="p">};</span>
</span></code></pre></td></tr></table></div></figure>


<p>As expected it fails with <code>Error: Expected test 'testSomeTestName' to be reported</code>. After fixing it and applying triangulation once, we would end up with the following implementation:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="c1">// src/TestingFramework.js in runTestSuite function:</span>
</span><span class='line'><span class="k">for</span> <span class="p">(</span><span class="kd">var</span> <span class="nx">testName</span> <span class="k">in</span> <span class="nx">testSuitePrototype</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">if</span> <span class="p">(</span><span class="nx">testName</span><span class="p">.</span><span class="nx">match</span><span class="p">(</span><span class="sr">/^test/</span><span class="p">))</span> <span class="p">{</span>
</span><span class='line'>
</span><span class='line'>        <span class="nx">reporter</span><span class="p">.</span><span class="nx">reportTest</span><span class="p">(</span><span class="nx">testName</span><span class="p">);</span>
</span><span class='line'><span class="c1">// ^  here is our implementation  ^</span>
</span><span class='line'>
</span><span class='line'>        <span class="kd">var</span> <span class="nx">testSuite</span> <span class="o">=</span> <span class="nx">createTestSuite</span><span class="p">(</span><span class="nx">testSuiteConstructor</span><span class="p">);</span>
</span><span class='line'>        <span class="nx">testSuite</span><span class="p">[</span><span class="nx">testName</span><span class="p">]();</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="kd">function</span> <span class="nx">SimpleReporter</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>    <span class="c1">// ...</span>
</span><span class='line'>    <span class="c1">// and we should not forget to implement it for real reporter</span>
</span><span class='line'>  <span class="k">this</span><span class="p">.</span><span class="nx">reportTest</span> <span class="o">=</span> <span class="kd">function</span> <span class="p">(</span><span class="nx">name</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="nx">process</span><span class="p">.</span><span class="nx">stdout</span><span class="p">.</span><span class="nx">write</span><span class="p">(</span><span class="s2">&quot;\t&quot;</span> <span class="o">+</span> <span class="nx">name</span> <span class="o">+</span> <span class="s2">&quot;\n&quot;</span><span class="p">);</span>
</span><span class='line'>  <span class="p">};</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>Now, it seems that both <code>ReporterSpy</code> and <code>SimpleReporter</code> are implementing the same Duck type - <code>Reporter</code>. What Duck Type is? - find out here: <a href="http://www.tddfellow.com/blog/2016/09/18/meet-duck-type/">Meet Duck Type</a>.</p>

<h2>Contract testing all Reporter duck types</h2>

<p>So we should test all our ducks that their public API don&rsquo;t get out of sync:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="kd">var</span> <span class="nx">TestingFramework</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s2">&quot;../src/TestingFramework&quot;</span><span class="p">);</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">runTestSuite</span> <span class="o">=</span> <span class="nx">TestingFramework</span><span class="p">;</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">SimpleReporter</span> <span class="o">=</span> <span class="nx">TestingFramework</span><span class="p">.</span><span class="nx">SimpleReporter</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'><span class="kd">var</span> <span class="nx">ReporterSpy</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s2">&quot;./ReporterSpy&quot;</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'><span class="kr">const</span> <span class="nx">IMPLEMENTATIONS</span> <span class="o">=</span> <span class="p">[</span>
</span><span class='line'>    <span class="nx">SimpleReporter</span><span class="p">,</span>
</span><span class='line'>    <span class="nx">ReporterSpy</span>
</span><span class='line'><span class="p">];</span>
</span><span class='line'>
</span><span class='line'><span class="nx">IMPLEMENTATIONS</span><span class="p">.</span><span class="nx">forEach</span><span class="p">(</span><span class="kd">function</span> <span class="p">(</span><span class="nx">ReporterImplementation</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>  <span class="nx">runTestSuite</span><span class="p">(</span><span class="kd">function</span> <span class="p">(</span><span class="nx">t</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">reporter</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">ReporterImplementation</span><span class="p">();</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">this</span><span class="p">.</span><span class="nx">testDefines_reportTestSuite</span> <span class="o">=</span> <span class="kd">function</span> <span class="p">()</span> <span class="p">{</span>
</span><span class='line'>      <span class="kd">var</span> <span class="nx">reportTestSuite</span> <span class="o">=</span> <span class="nx">reporter</span><span class="p">.</span><span class="nx">reportTestSuite</span><span class="p">;</span>
</span><span class='line'>      <span class="nx">t</span><span class="p">.</span><span class="nx">assertEqual</span><span class="p">(</span><span class="s2">&quot;function&quot;</span><span class="p">,</span> <span class="k">typeof</span><span class="p">(</span><span class="nx">reportTestSuite</span><span class="p">));</span>
</span><span class='line'>      <span class="nx">t</span><span class="p">.</span><span class="nx">assertEqual</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="nx">reportTestSuite</span><span class="p">.</span><span class="nx">length</span><span class="p">);</span>
</span><span class='line'>    <span class="p">};</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">this</span><span class="p">.</span><span class="nx">testDefines_reportTest</span> <span class="o">=</span> <span class="kd">function</span> <span class="p">()</span> <span class="p">{</span>
</span><span class='line'>      <span class="kd">var</span> <span class="nx">reportTest</span> <span class="o">=</span> <span class="nx">reporter</span><span class="p">.</span><span class="nx">reportTest</span><span class="p">;</span>
</span><span class='line'>      <span class="nx">t</span><span class="p">.</span><span class="nx">assertEqual</span><span class="p">(</span><span class="s2">&quot;function&quot;</span><span class="p">,</span> <span class="k">typeof</span><span class="p">(</span><span class="nx">reportTest</span><span class="p">));</span>
</span><span class='line'>      <span class="nx">t</span><span class="p">.</span><span class="nx">assertEqual</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="nx">reportTest</span><span class="p">.</span><span class="nx">length</span><span class="p">);</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>  <span class="p">});</span>
</span><span class='line'><span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>


<p>All the tests pass. Unfortunately, the output regarding this test suite looks weird:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'>    <span class="nx">testDefines_reportTestSuite</span>
</span><span class='line'>    <span class="nx">testDefines_reportTest</span>
</span><span class='line'>
</span><span class='line'>
</span><span class='line'>    <span class="nx">testDefines_reportTestSuite</span>
</span><span class='line'>    <span class="nx">testDefines_reportTest</span>
</span></code></pre></td></tr></table></div></figure>


<p>The test suite name is empty. I think we need an ability to define a custom and dynamic test suite name:</p>

<h2>Custom name for the test suite</h2>

<p>We can achieve this by allowing any test suite to define special hook method, that will return its custom name, like <code>testSuite.getTestSuiteName()</code>. Let&rsquo;s write a test for this:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="k">this</span><span class="p">.</span><span class="nx">testItCanHaveCustomNameOfTheTestSuite</span> <span class="o">=</span> <span class="kd">function</span> <span class="p">()</span> <span class="p">{</span>
</span><span class='line'>  <span class="nx">runTestSuite</span><span class="p">(</span><span class="kd">function</span> <span class="p">(</span><span class="nx">t</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">this</span><span class="p">.</span><span class="nx">getTestSuiteName</span> <span class="o">=</span> <span class="kd">function</span> <span class="p">()</span> <span class="p">{</span>
</span><span class='line'>      <span class="k">return</span> <span class="s2">&quot;CustomNameOfTheTestSuite&quot;</span><span class="p">;</span>
</span><span class='line'>    <span class="p">};</span>
</span><span class='line'>  <span class="p">},</span> <span class="p">{</span><span class="nx">reporter</span><span class="o">:</span> <span class="nx">reporter</span><span class="p">});</span>
</span><span class='line'>
</span><span class='line'>  <span class="nx">reporter</span><span class="p">.</span><span class="nx">assertHasReportedTestSuite</span><span class="p">(</span><span class="s2">&quot;CustomNameOfTheTestSuite&quot;</span><span class="p">);</span>
</span><span class='line'><span class="p">};</span>
</span></code></pre></td></tr></table></div></figure>


<p>After implementing it and triangulating over the name once the code looks like this:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="kd">function</span> <span class="nx">runTestSuite</span><span class="p">(</span><span class="nx">testSuiteConstructor</span><span class="p">,</span> <span class="nx">options</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>  <span class="nx">options</span> <span class="o">=</span> <span class="nx">options</span> <span class="o">||</span> <span class="p">{};</span>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">reporter</span> <span class="o">=</span> <span class="nx">options</span><span class="p">.</span><span class="nx">reporter</span> <span class="o">||</span> <span class="k">new</span> <span class="nx">SimpleReporter</span><span class="p">();</span>
</span><span class='line'>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">testSuitePrototype</span> <span class="o">=</span> <span class="nx">createTestSuite</span><span class="p">(</span><span class="nx">testSuiteConstructor</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>  <span class="nx">reporter</span><span class="p">.</span><span class="nx">reportTestSuite</span><span class="p">(</span>
</span><span class='line'>    <span class="nx">getTestSuiteName</span><span class="p">(</span><span class="nx">testSuiteConstructor</span><span class="p">,</span> <span class="nx">testSuitePrototype</span><span class="p">)</span>
</span><span class='line'><span class="c1">// ^ this is the function that we introduced here to make it pass ^</span>
</span><span class='line'>  <span class="p">);</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">for</span> <span class="p">(</span><span class="kd">var</span> <span class="nx">testName</span> <span class="k">in</span> <span class="nx">testSuitePrototype</span><span class="p">)</span> <span class="p">{</span> <span class="p">...</span> <span class="p">}</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="kd">function</span> <span class="nx">getTestSuiteName</span><span class="p">(</span><span class="nx">testSuiteConstructor</span><span class="p">,</span> <span class="nx">testSuitePrototype</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">if</span> <span class="p">(</span><span class="k">typeof</span><span class="p">(</span><span class="nx">testSuitePrototype</span><span class="p">.</span><span class="nx">getTestSuiteName</span><span class="p">)</span> <span class="o">!==</span> <span class="s2">&quot;function&quot;</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>        <span class="k">return</span> <span class="nx">testSuiteConstructor</span><span class="p">.</span><span class="nx">name</span><span class="p">;</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">return</span> <span class="nx">testSuitePrototype</span><span class="p">.</span><span class="nx">getTestSuiteName</span><span class="p">();</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>Now, if we were to use this feature in our duck type tests:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="nx">IMPLEMENTATIONS</span><span class="p">.</span><span class="nx">forEach</span><span class="p">(</span><span class="kd">function</span> <span class="p">(</span><span class="nx">ReporterImplementation</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>  <span class="nx">runTestSuite</span><span class="p">(</span><span class="kd">function</span> <span class="p">(</span><span class="nx">t</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">this</span><span class="p">.</span><span class="nx">getTestSuiteName</span> <span class="o">=</span> <span class="kd">function</span> <span class="p">()</span> <span class="p">{</span>
</span><span class='line'>      <span class="k">return</span> <span class="nx">ReporterImplementation</span><span class="p">.</span><span class="nx">name</span> <span class="o">+</span> <span class="s2">&quot;_ReporterTest&quot;</span><span class="p">;</span>
</span><span class='line'>    <span class="p">};</span>
</span><span class='line'>
</span><span class='line'>    <span class="c1">// ...</span>
</span><span class='line'><span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>


<p>Then we are getting the proper output:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="nx">SimpleReporter_ReporterTest</span>
</span><span class='line'>    <span class="nx">testDefines_reportTestSuite</span>
</span><span class='line'>    <span class="nx">testDefines_reportTest</span>
</span><span class='line'>
</span><span class='line'><span class="nx">ReporterSpy_ReporterTest</span>
</span><span class='line'>    <span class="nx">testDefines_reportTestSuite</span>
</span><span class='line'>    <span class="nx">testDefines_reportTest</span>
</span></code></pre></td></tr></table></div></figure>


<h2>Bottom Line</h2>

<p>I think we are done with implementing our first simple reporter. Now we can see that the tests are actually executing and passing. The code can be found here: <a href="https://github.com/waterlink/BuildYourOwnTestingFrameworkPart4">https://github.com/waterlink/BuildYourOwnTestingFrameworkPart4</a></p>

<p>There is still a lot to go through. In a few next episodes we will:</p>

<ul>
<li>Make sure that first failure does not cause test suite to stop running;</li>
<li>Make sure the exit code is right;</li>
<li>Report OK and FAIL;</li>
<li>Output carefully formatted failures to the STDERR.</li>
</ul>


<p>Stay tuned!</p>

<h2>Thanks</h2>

<p>Thank you for reading, my dear reader. If you liked it, please share this article on social networks and follow me on twitter: <a href="https://twitter.com/tdd_fellow">@tdd_fellow</a>.</p>

<p>If you have any questions or feedback for me, don&rsquo;t hesitate to reach me out on Twitter: <a href="https://twitter.com/tdd_fellow">@tdd_fellow</a>.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Getting Stuck While Doing TDD. Part 3: Triangulation to the Rescue!]]></title>
    <link href="http://www.tddfellow.com/blog/2016/08/31/getting-stuck-while-doing-tdd-part-3-triangulation-to-the-rescue/"/>
    <updated>2016-08-31T02:35:32+02:00</updated>
    <id>http://www.tddfellow.com/blog/2016/08/31/getting-stuck-while-doing-tdd-part-3-triangulation-to-the-rescue</id>
    <content type="html"><![CDATA[<p>Welcome back to the &ldquo;Getting Stuck While Doing TDD&rdquo; series. Today we are going to learn the Golden Rule of TDD and how to not get stuck while doing TDD.</p>

<h2>TL;DR</h2>

<ul>
<li>&ldquo;As tests get more specific, production code gets more generic&rdquo;.</li>
<li><code>RED</code> is as important as other in Red-Green-Refactor cycle. If next test does not fail, it is either: already implemented, or has to wait until a later time (until it will fail).</li>
<li><p>At its core the Triangulation Technique has the following idea:</p>

<p>After implementing one business rule (with Red-Green-Refactor) make sure to find all &ldquo;weirdnesses&rdquo; or non-generalities in the production code and one-by-one eliminate them by writing a test, that proves such non-generality, and then making it pass while removing non-generality. This is the third cycle of TDD - Mini Cycle.</p></li>
</ul>


<!--more-->


<p>This is a series of articles:</p>

<ol>
<li><a href="http://www.tddfellow.com/blog/2016/08/30/getting-stuck-while-doing-tdd-part-1-example/">Part 1: Example</a></li>
<li><a href="http://www.tddfellow.com/blog/2016/08/31/getting-stuck-while-doing-tdd-part-2-buggy-code-and-forcing-our-way-through/">Part 2: Buggy Code and Forcing Our Way Through</a></li>
<li>Part 3: Triangulation to the Rescue! (reading this)</li>
</ol>


<p>Shall we get started?</p>

<h2>Specific/Generic Rule of TDD</h2>

<blockquote><p>As tests get more specific, production code gets more generic.</p></blockquote>

<p>When making the next failing test pass, our production code should also pass a whole class of similar tests. Best shown in the very simple example. The task at hand is to write the function <code>sum(a, b)</code> that will add two numbers. Let&rsquo;s see us a violation of the Specific/Generic rule:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="n">expect</span><span class="p">(</span><span class="n">sum</span><span class="p">(</span><span class="mi">2</span><span class="p">,</span> <span class="mi">2</span><span class="p">))</span><span class="o">.</span><span class="n">to</span> <span class="n">eq</span><span class="p">(</span><span class="mi">4</span><span class="p">)</span>
</span><span class='line'><span class="c1"># =&gt; NoMethodError: undefined method `sum&#39;</span>
</span><span class='line'>
</span><span class='line'><span class="k">def</span> <span class="nf">sum</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">);</span> <span class="k">end</span>
</span><span class='line'><span class="c1"># =&gt; expected: 4, got: nil</span>
</span><span class='line'>
</span><span class='line'><span class="k">def</span> <span class="nf">sum</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">)</span>
</span><span class='line'>  <span class="mi">4</span>
</span><span class='line'><span class="k">end</span>
</span><span class='line'><span class="c1"># =&gt; PASS</span>
</span><span class='line'>
</span><span class='line'><span class="n">expect</span><span class="p">(</span><span class="n">sum</span><span class="p">(</span><span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">))</span><span class="o">.</span><span class="n">to</span> <span class="n">eq</span><span class="p">(</span><span class="mi">5</span><span class="p">)</span>
</span><span class='line'><span class="c1"># =&gt; expected: 5, got: 4</span>
</span><span class='line'>
</span><span class='line'><span class="k">def</span> <span class="nf">sum</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">)</span>
</span><span class='line'>  <span class="k">if</span> <span class="n">b</span> <span class="o">==</span> <span class="mi">2</span>
</span><span class='line'>    <span class="mi">4</span>
</span><span class='line'>  <span class="k">else</span>
</span><span class='line'>    <span class="mi">5</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'><span class="k">end</span>
</span><span class='line'><span class="c1"># =&gt; PASS</span>
</span></code></pre></td></tr></table></div></figure>


<p>The production code to make this last test pass is as specific as the failing test now. The test of the same class (where we change the value of the <code>b</code> parameter) will fail for it:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="n">expect</span><span class="p">(</span><span class="n">sum</span><span class="p">(</span><span class="mi">2</span><span class="p">,</span> <span class="mi">42</span><span class="p">))</span><span class="o">.</span><span class="n">to</span> <span class="n">eq</span><span class="p">(</span><span class="mi">44</span><span class="p">)</span>
</span><span class='line'><span class="c1"># =&gt; expected: 44, got: 5</span>
</span></code></pre></td></tr></table></div></figure>


<p>To follow the Specific/Generic rule we ought to make <code>4</code> into <code>2 + b</code> like that:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="k">def</span> <span class="nf">sum</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">)</span>
</span><span class='line'>  <span class="mi">2</span> <span class="o">+</span> <span class="n">b</span>
</span><span class='line'><span class="k">end</span>
</span><span class='line'><span class="c1"># =&gt; PASS</span>
</span></code></pre></td></tr></table></div></figure>


<p>This way, when we change <code>b</code> to any value it will still pass the test, aside from the fact, that we didn&rsquo;t do anything about <code>a</code>. This is because we still don&rsquo;t have any test showing us, that parameter <code>a</code> is important, like the following one:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="n">expect</span><span class="p">(</span><span class="n">sum</span><span class="p">(</span><span class="mi">4</span><span class="p">,</span> <span class="mi">7</span><span class="p">))</span><span class="o">.</span><span class="n">to</span> <span class="n">eq</span><span class="p">(</span><span class="mi">11</span><span class="p">)</span>
</span><span class='line'><span class="c1"># =&gt; expected: 11, got: 9</span>
</span></code></pre></td></tr></table></div></figure>


<p>Again we can make it pass in a very specific fashion by introducing specific <code>if</code> statement, or we could do it to pass the whole class of such tests:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="k">def</span> <span class="nf">sum</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">)</span>
</span><span class='line'>  <span class="n">a</span> <span class="o">+</span> <span class="n">b</span>
</span><span class='line'><span class="k">end</span>
</span><span class='line'><span class="c1"># =&gt; PASS</span>
</span></code></pre></td></tr></table></div></figure>


<p>Have you noticed, that from the test suite side we had to &ldquo;prove&rdquo; that some knowledge in the system is important and had to be used? This technique is called Triangulation.</p>

<div class="v2-subscribe--inline">
  




  


<div class="mc_embed_signup">
  <form action="//tddfellow.us14.list-manage.com/subscribe/post?u=535a10a8c0274c9a7ebac4f34&amp;id=7f9f94015a" method="post" class="mc-embedded-subscribe-form" name="mc-embedded-subscribe-form" class="validate" target="_blank" novalidate>
    <div class="mc_embed_signup_scroll">
      <h3>Want more articles like this delivered to your inbox?</h3>
      <div class="mc-field-group">
        <!-- real people should not fill this in and expect good things - do not remove this or risk form bot signups-->
        <div style="position: absolute; left: -5000px;" aria-hidden="true"><input type="text" name="b_535a10a8c0274c9a7ebac4f34_7f9f94015a" tabindex="-1" value=""></div>
        <input type="email" value="" name="EMAIL" class="required email mce-EMAIL" placeholder="Enter your email">
        <input type="submit" value="Subscribe" name="subscribe" class="button mc-embedded-subscribe">
      </div>
      <div class="">
        <em>(we respect your privacy, unsubscribe at any time)</em>
      </div>
    </div>
  </form>
</div>


</div>


<h2>Triangulation Technique</h2>

<p>In the essence, Triangulation technique has a very simple idea at its core:</p>

<ol>
<li>Change certain important* knowledge in the system.</li>
<li>Assert that the production code behaves in an accordingly expected manner.</li>
</ol>


<p><em>* - important from the perspective of the system or unit under the test</em></p>

<h2>Red-Green-Refactor has to have all stages</h2>

<p>One Red-Green-Refactor cycle really has to have all stages in it. And I&rsquo;m not ranting right now about &ldquo;Refactor&rdquo; stage, that is a given. Rather, I insist on the &ldquo;Red&rdquo; stage - in TDD, when we write a new test, it has to fail. Writing tests that do not fail is another way to get ourselves stuck while doing TDD. One could ask: &ldquo;If I can&rsquo;t write this test because it does not fail, what should I do about the requirement it represents?&rdquo;, and the answer is rather simple - either this requirement is already implemented and tested by other tests, or we still need this test and we will get back to it later when it actually will fail.</p>

<p>As we can remember, in the first part of these series, we were going through an <code>OrderKindValidator</code> example, and we were writing multiple tests in a row, that were all expecting the same outcome and of course they didn&rsquo;t fail, because we had one line in our function that made them all pass. If we were to sprinkle some other tests, that do fail (like a test for a valid order kind), after making it pass, all of these tests will now be failing and therefore they are good candidates for our next test. Let&rsquo;s see it with our own eyes:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="n">it_fails_with</span><span class="p">(</span><span class="s2">&quot;Order kind can not be empty&quot;</span><span class="p">)</span>
</span><span class='line'>  <span class="o">.</span><span class="n">when_order_kind_is_absent</span>
</span><span class='line'><span class="c1"># =&gt; expected InvalidOrderError with &quot;Order kind can not be empty&quot;,</span>
</span><span class='line'><span class="c1"># =&gt; got #&lt;NoMethodError:</span>
</span><span class='line'><span class="c1"># =&gt;      undefined method `validate&#39; for #&lt;OrderKindValidator:0x000000020335c0&gt;&gt;</span>
</span><span class='line'>
</span><span class='line'><span class="k">class</span> <span class="nc">OrderKindValidator</span>
</span><span class='line'>  <span class="k">def</span> <span class="nf">validate</span><span class="p">(</span><span class="n">order</span><span class="p">)</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'><span class="k">end</span>
</span><span class='line'><span class="c1"># =&gt; expected InvalidOrderError with &quot;Order kind can not be empty&quot;</span>
</span><span class='line'><span class="c1"># =&gt; but nothing was raised</span>
</span><span class='line'>
</span><span class='line'><span class="k">def</span> <span class="nf">validate</span><span class="p">(</span><span class="n">order</span><span class="p">)</span>
</span><span class='line'>  <span class="k">raise</span> <span class="no">InvalidOrderError</span><span class="p">,</span> <span class="s2">&quot;Order kind can not be empty&quot;</span>
</span><span class='line'><span class="k">end</span>
</span><span class='line'><span class="c1"># =&gt; PASS</span>
</span></code></pre></td></tr></table></div></figure>


<p>Now is the point, where we have to choose our next test, and last time we have chosen the test with the same outcome and it did not go so well. Let&rsquo;s choose a test with different outcome, e.g.: when valid order kind is provided:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="n">it_does_not_fail</span>
</span><span class='line'>  <span class="o">.</span><span class="n">when_order_kind_is</span><span class="p">(</span><span class="sx">%w(private)</span><span class="p">)</span>
</span><span class='line'><span class="c1"># =&gt; expected no Exception,</span>
</span><span class='line'><span class="c1"># =&gt; got #&lt;InvalidOrderError: Order kind can not be empty&gt;</span>
</span></code></pre></td></tr></table></div></figure>


<p>Now, we have 2 options, to either check for <code>order[:kind] == %w(private)</code> or to check for <code>order[:kind]</code> being absent. It does not matter what we choose at this point, so let&rsquo;s go with the first one:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="k">def</span> <span class="nf">validate</span><span class="p">(</span><span class="n">order</span><span class="p">)</span>
</span><span class='line'>  <span class="k">if</span> <span class="n">order</span><span class="o">[</span><span class="ss">:kind</span><span class="o">]</span> <span class="o">==</span> <span class="sx">%w(private)</span>
</span><span class='line'>    <span class="k">return</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">raise</span> <span class="no">InvalidOrderError</span><span class="p">,</span> <span class="s2">&quot;Order kind can not be empty&quot;</span>
</span><span class='line'><span class="k">end</span>
</span><span class='line'><span class="c1"># =&gt; PASS</span>
</span></code></pre></td></tr></table></div></figure>


<p>Now let&rsquo;s apply Triangulation technique. We should always ask ourselves the question: &ldquo;What is weird about this code?&rdquo; and &ldquo;What failing test should I write to point out this weirdness?&rdquo;. First weirdness we can spot is that the validator currently accepts only one order kind - <code>private</code>. According to our requirements it should also accept <code>corporate</code>:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="n">it_does_not_fail</span>
</span><span class='line'>  <span class="o">.</span><span class="n">when_order_kind_is</span><span class="p">(</span><span class="sx">%w(corporate)</span><span class="p">)</span>
</span><span class='line'><span class="c1"># =&gt; expected no Exception,</span>
</span><span class='line'><span class="c1"># =&gt; got #&lt;InvalidOrderError: Order kind can not be empty&gt;</span>
</span><span class='line'>
</span><span class='line'><span class="k">def</span> <span class="nf">validate</span><span class="p">(</span><span class="n">order</span><span class="p">)</span>
</span><span class='line'>  <span class="n">kinds</span> <span class="o">=</span> <span class="n">order</span><span class="o">[</span><span class="ss">:kind</span><span class="o">]</span>
</span><span class='line'>  <span class="k">if</span> <span class="n">kinds</span> <span class="o">==</span> <span class="sx">%w(private)</span> <span class="o">||</span> <span class="n">kinds</span> <span class="o">==</span> <span class="sx">%w(corporate)</span>
</span><span class='line'>    <span class="c1"># ...</span>
</span><span class='line'><span class="k">end</span>
</span><span class='line'><span class="c1"># =&gt; PASS</span>
</span></code></pre></td></tr></table></div></figure>


<p>We also know, that our system should handle duplicate entries in <code>order[:kind]</code>:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="n">it_does_not_fail</span>
</span><span class='line'>  <span class="o">.</span><span class="n">when_order_kind_is</span><span class="p">(</span><span class="sx">%w(private private)</span><span class="p">)</span>
</span><span class='line'><span class="c1"># =&gt; expected no Exception,</span>
</span><span class='line'><span class="c1"># =&gt; got #&lt;InvalidOrderError: Order kind can not be empty&gt;</span>
</span><span class='line'>
</span><span class='line'><span class="k">def</span> <span class="nf">validate</span><span class="p">(</span><span class="n">order</span><span class="p">)</span>
</span><span class='line'>  <span class="n">kinds</span> <span class="o">=</span> <span class="n">order</span><span class="o">[</span><span class="ss">:kind</span><span class="o">]</span>
</span><span class='line'>  <span class="k">if</span> <span class="n">kinds</span><span class="o">.</span><span class="n">include?</span><span class="p">(</span><span class="s2">&quot;private&quot;</span><span class="p">)</span> <span class="o">||</span> <span class="n">kinds</span> <span class="o">==</span> <span class="sx">%w(corporate)</span>
</span><span class='line'>    <span class="c1"># ...</span>
</span><span class='line'><span class="k">end</span>
</span><span class='line'><span class="c1"># =&gt; expected InvalidOrderError with &quot;Order kind can not be empty&quot;,</span>
</span><span class='line'><span class="c1"># =&gt; got #&lt;NoMethodError: undefined method `include?&#39;</span>
</span><span class='line'><span class="c1"># =&gt; for nil:NilClass&gt;</span>
</span></code></pre></td></tr></table></div></figure>


<p>Wow! We, of course, can check for <code>kinds</code> to not be <code>nil</code>, but I would rather listen to this test failure and put a check for <code>kinds</code> being absent (and this makes for our second check, that we could have chosen from):</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="k">def</span> <span class="nf">validate</span><span class="p">(</span><span class="n">order</span><span class="p">)</span>
</span><span class='line'>  <span class="n">kinds</span> <span class="o">=</span> <span class="n">order</span><span class="o">[</span><span class="ss">:kind</span><span class="o">]</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">if</span> <span class="n">kinds</span><span class="o">.</span><span class="n">nil?</span>
</span><span class='line'>    <span class="k">raise</span> <span class="no">InvalidOrderError</span><span class="p">,</span> <span class="s2">&quot;Order kind can not be empty&quot;</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">if</span> <span class="n">kinds</span><span class="o">.</span><span class="n">include?</span><span class="p">(</span><span class="s2">&quot;private&quot;</span><span class="p">)</span> <span class="o">||</span> <span class="n">kinds</span> <span class="o">==</span> <span class="sx">%w(corporate)</span>
</span><span class='line'>    <span class="k">return</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">raise</span> <span class="no">InvalidOrderError</span><span class="p">,</span> <span class="s2">&quot;Order kind can not be empty&quot;</span>
</span><span class='line'><span class="k">end</span>
</span><span class='line'><span class="c1"># =&gt; PASS</span>
</span></code></pre></td></tr></table></div></figure>


<p>So this passes all our tests. It may look weird, and this is exactly the pointer for us which test to write next to prove, that this weirdness is incorrect:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="n">it_fails_with</span><span class="p">(</span><span class="s2">&quot;Order kind can be one of: &#39;private&#39;, &#39;corporate&#39;, &#39;bundle&#39;&quot;</span><span class="p">)</span>
</span><span class='line'>  <span class="o">.</span><span class="n">when_order_kind_is</span><span class="p">(</span><span class="sx">%w(invalid)</span><span class="p">)</span>
</span><span class='line'><span class="c1"># =&gt; expected InvalidOrderError</span>
</span><span class='line'><span class="c1"># =&gt; with &quot;Order kind can be one of: &#39;private&#39;, &#39;corporate&#39;, &#39;bundle&#39;&quot;,</span>
</span><span class='line'><span class="c1"># =&gt; got #&lt;InvalidOrderError: Order kind can not be empty&gt;</span>
</span><span class='line'>
</span><span class='line'><span class="k">def</span> <span class="nf">validate</span><span class="p">(</span><span class="n">order</span><span class="p">)</span>
</span><span class='line'>  <span class="c1"># ...</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">raise</span> <span class="no">InvalidOrderError</span><span class="p">,</span>
</span><span class='line'>    <span class="s2">&quot;Order kind can be one of: &#39;private&#39;, &#39;corporate&#39;, &#39;bundle&#39;&quot;</span>
</span><span class='line'><span class="k">end</span>
</span><span class='line'><span class="c1"># =&gt; PASS</span>
</span></code></pre></td></tr></table></div></figure>


<p>Production code starts looking not so clean and I think it is time to give things proper names:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="k">class</span> <span class="nc">OrderKindValidator</span>
</span><span class='line'>  <span class="k">def</span> <span class="nf">validate</span><span class="p">(</span><span class="n">order</span><span class="p">)</span>
</span><span class='line'>    <span class="n">kinds</span> <span class="o">=</span> <span class="n">order</span><span class="o">[</span><span class="ss">:kind</span><span class="o">]</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">if</span> <span class="n">empty?</span><span class="p">(</span><span class="n">kinds</span><span class="p">)</span>
</span><span class='line'>      <span class="n">fail_with</span><span class="p">(</span><span class="s2">&quot;Order kind can not be empty&quot;</span><span class="p">)</span>
</span><span class='line'>    <span class="k">end</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">unless</span> <span class="n">valid?</span><span class="p">(</span><span class="n">kinds</span><span class="p">)</span>
</span><span class='line'>      <span class="n">fail_with</span><span class="p">(</span><span class="s2">&quot;Order kind can be one of: &#39;private&#39;, &#39;corporate&#39;, &#39;bundle&#39;&quot;</span><span class="p">)</span>
</span><span class='line'>    <span class="k">end</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">def</span> <span class="nf">valid?</span><span class="p">(</span><span class="n">kinds</span><span class="p">)</span>
</span><span class='line'>    <span class="n">kinds</span><span class="o">.</span><span class="n">include?</span><span class="p">(</span><span class="s2">&quot;private&quot;</span><span class="p">)</span> <span class="o">||</span> <span class="n">kinds</span> <span class="o">==</span> <span class="sx">%w(corporate)</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">def</span> <span class="nf">empty?</span><span class="p">(</span><span class="n">kinds</span><span class="p">)</span>
</span><span class='line'>    <span class="n">kinds</span><span class="o">.</span><span class="n">nil?</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">def</span> <span class="nf">fail_with</span><span class="p">(</span><span class="n">message</span><span class="p">)</span>
</span><span class='line'>    <span class="k">raise</span> <span class="no">InvalidOrderError</span><span class="p">,</span> <span class="n">message</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>


<p>There is only one weirdness, that is left for triangulation in current production code, before we can move on to the next requirement - <code>private</code> can be duplicated while <code>corporate</code> can not:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="n">it_does_not_fail</span>
</span><span class='line'>  <span class="o">.</span><span class="n">when_order_kind_is</span><span class="p">(</span><span class="sx">%w(corporate corporate)</span><span class="p">)</span>
</span><span class='line'><span class="c1"># =&gt; expected no Exception,</span>
</span><span class='line'><span class="c1"># =&gt; got #&lt;InvalidOrderError: Order kind can be one of: &#39;private&#39;, &#39;corporate&#39;, &#39;bundle&#39;&gt;</span>
</span><span class='line'>
</span><span class='line'><span class="k">def</span> <span class="nf">valid?</span><span class="p">(</span><span class="n">kinds</span><span class="p">)</span>
</span><span class='line'>  <span class="n">kinds</span><span class="o">.</span><span class="n">include?</span><span class="p">(</span><span class="s2">&quot;private&quot;</span><span class="p">)</span> <span class="o">||</span>
</span><span class='line'>      <span class="n">kinds</span><span class="o">.</span><span class="n">include?</span><span class="p">(</span><span class="s2">&quot;corporate&quot;</span><span class="p">)</span>
</span><span class='line'><span class="k">end</span>
</span><span class='line'><span class="c1"># =&gt; PASS</span>
</span></code></pre></td></tr></table></div></figure>


<p>Great, now we can safely go back to our empty order kind edge cases:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="n">it_fails_with</span><span class="p">(</span><span class="s2">&quot;Order kind can not be empty&quot;</span><span class="p">)</span>
</span><span class='line'>  <span class="o">.</span><span class="n">when_order_kind_is</span><span class="p">(</span><span class="o">[]</span><span class="p">)</span>
</span><span class='line'><span class="c1"># =&gt; expected InvalidOrderError with &quot;Order kind can not be empty&quot;,</span>
</span><span class='line'><span class="c1"># =&gt; got #&lt;InvalidOrderError: Order kind can be one of: &#39;private&#39;, &#39;corporate&#39;, &#39;bundle&#39;&gt;</span>
</span><span class='line'>
</span><span class='line'><span class="k">def</span> <span class="nf">empty?</span><span class="p">(</span><span class="n">kinds</span><span class="p">)</span>
</span><span class='line'>  <span class="n">kinds</span><span class="o">.</span><span class="n">nil?</span> <span class="o">||</span>
</span><span class='line'>      <span class="n">kinds</span><span class="o">.</span><span class="n">empty?</span>
</span><span class='line'><span class="k">end</span>
</span><span class='line'><span class="c1"># =&gt; PASS</span>
</span><span class='line'>
</span><span class='line'><span class="n">it_fails_with</span><span class="p">(</span><span class="s2">&quot;Order kind can not be empty&quot;</span><span class="p">)</span>
</span><span class='line'>  <span class="o">.</span><span class="n">when_order_kind_is</span><span class="p">(</span><span class="o">[</span><span class="kp">nil</span><span class="o">]</span><span class="p">)</span>
</span><span class='line'><span class="c1"># =&gt; expected InvalidOrderError with &quot;Order kind can not be empty&quot;,</span>
</span><span class='line'><span class="c1"># =&gt; got #&lt;InvalidOrderError: Order kind can be one of: &#39;private&#39;, &#39;corporate&#39;, &#39;bundle&#39;&gt;</span>
</span><span class='line'>
</span><span class='line'><span class="k">def</span> <span class="nf">empty?</span><span class="p">(</span><span class="n">kinds</span><span class="p">)</span>
</span><span class='line'>  <span class="n">kinds</span><span class="o">.</span><span class="n">nil?</span> <span class="o">||</span>
</span><span class='line'>      <span class="n">kinds</span><span class="o">.</span><span class="n">empty?</span> <span class="o">||</span>
</span><span class='line'>      <span class="n">kinds</span><span class="o">[</span><span class="mi">0</span><span class="o">].</span><span class="n">nil?</span>
</span><span class='line'><span class="k">end</span>
</span><span class='line'><span class="c1"># =&gt; PASS</span>
</span><span class='line'>
</span><span class='line'><span class="n">it_fails_with</span><span class="p">(</span><span class="s2">&quot;Order kind can not be empty&quot;</span><span class="p">)</span>
</span><span class='line'>  <span class="o">.</span><span class="n">when_order_kind_is</span><span class="p">(</span><span class="o">[</span><span class="s2">&quot;&quot;</span><span class="o">]</span><span class="p">)</span>
</span><span class='line'><span class="c1"># =&gt; expected InvalidOrderError with &quot;Order kind can not be empty&quot;,</span>
</span><span class='line'><span class="c1"># =&gt; got #&lt;InvalidOrderError: Order kind can be one of: &#39;private&#39;, &#39;corporate&#39;, &#39;bundle&#39;&gt;</span>
</span><span class='line'>
</span><span class='line'><span class="k">def</span> <span class="nf">empty?</span><span class="p">(</span><span class="n">kinds</span><span class="p">)</span>
</span><span class='line'>  <span class="n">kinds</span><span class="o">.</span><span class="n">nil?</span> <span class="o">||</span>
</span><span class='line'>      <span class="n">kinds</span><span class="o">.</span><span class="n">empty?</span> <span class="o">||</span>
</span><span class='line'>      <span class="n">kinds</span><span class="o">[</span><span class="mi">0</span><span class="o">].</span><span class="n">nil?</span> <span class="o">||</span>
</span><span class='line'>      <span class="n">kinds</span><span class="o">[</span><span class="mi">0</span><span class="o">].</span><span class="n">empty?</span>
</span><span class='line'><span class="k">end</span>
</span><span class='line'><span class="c1"># =&gt; PASS</span>
</span></code></pre></td></tr></table></div></figure>


<p>And it is a good opportunity to eliminate some duplication:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="k">def</span> <span class="nf">empty?</span><span class="p">(</span><span class="n">kinds</span><span class="p">)</span>
</span><span class='line'>  <span class="n">empty_value?</span><span class="p">(</span><span class="n">kinds</span><span class="p">)</span> <span class="o">||</span>
</span><span class='line'>      <span class="n">empty_value?</span><span class="p">(</span><span class="n">kinds</span><span class="o">[</span><span class="mi">0</span><span class="o">]</span><span class="p">)</span>
</span><span class='line'><span class="k">end</span>
</span><span class='line'>
</span><span class='line'><span class="k">def</span> <span class="nf">empty_value?</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
</span><span class='line'>  <span class="n">value</span><span class="o">.</span><span class="n">nil?</span> <span class="o">||</span> <span class="n">value</span><span class="o">.</span><span class="n">empty?</span>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>


<p>Now, it is a good time to triangulate, because we have a weirdness in our code: <code>kinds[0]</code>. To prove that this is too specific we can write another test:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="n">it_fails_with</span><span class="p">(</span><span class="s2">&quot;Order kind can not be empty&quot;</span><span class="p">)</span>
</span><span class='line'>  <span class="o">.</span><span class="n">when_order_kind_is</span><span class="p">(</span><span class="o">[</span><span class="s2">&quot;private&quot;</span><span class="p">,</span> <span class="s2">&quot;&quot;</span><span class="o">]</span><span class="p">)</span>
</span><span class='line'><span class="c1"># =&gt; expected InvalidOrderError with &quot;Order kind can not be empty&quot;</span>
</span><span class='line'><span class="c1"># =&gt; but nothing was raised</span>
</span><span class='line'>
</span><span class='line'><span class="k">def</span> <span class="nf">empty?</span><span class="p">(</span><span class="n">kinds</span><span class="p">)</span>
</span><span class='line'>  <span class="n">empty_value?</span><span class="p">(</span><span class="n">kinds</span><span class="p">)</span> <span class="o">||</span>
</span><span class='line'>      <span class="n">kinds</span><span class="o">.</span><span class="n">any?</span> <span class="p">{</span> <span class="o">|</span><span class="n">kind</span><span class="o">|</span> <span class="n">empty_value?</span><span class="p">(</span><span class="n">kind</span><span class="p">)</span> <span class="p">}</span>
</span><span class='line'><span class="k">end</span>
</span><span class='line'><span class="c1"># =&gt; PASS</span>
</span></code></pre></td></tr></table></div></figure>


<p>Notice, how every single test that we have written was failing and how easy it was to make it pass. This suggests that we are probably moving in the right direction. Let&rsquo;s test our next requirement - we can combine <code>private</code> and <code>bundle</code>:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="n">it_does_not_fail</span>
</span><span class='line'>  <span class="o">.</span><span class="n">when_order_kind_is</span><span class="p">(</span><span class="sx">%w(private bundle)</span><span class="p">)</span>
</span><span class='line'><span class="c1"># =&gt; PASS</span>
</span></code></pre></td></tr></table></div></figure>


<p>Wait a minute. This is really bad. We should have a failing test here. This happened because we are checking only for the inclusion of <code>private</code> or <code>corporate</code> and we do not care about anything else in the <code>order[:kind]</code> array. We have to discard this test and try to go with failing version of the same business rule - invalid order kind can not be combined with <code>private</code>:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="n">it_fails_with</span><span class="p">(</span><span class="s2">&quot;Order kind can be one of: &#39;private&#39;, &#39;corporate&#39;, &#39;bundle&#39;&quot;</span><span class="p">)</span>
</span><span class='line'>  <span class="o">.</span><span class="n">when_order_kind_is</span><span class="p">(</span><span class="sx">%w(private invalid)</span><span class="p">)</span>
</span><span class='line'><span class="c1"># =&gt; expected InvalidOrderError</span>
</span><span class='line'><span class="c1"># =&gt; with &quot;Order kind can be one of: &#39;private&#39;, &#39;corporate&#39;, &#39;bundle&#39;&quot;</span>
</span><span class='line'><span class="c1"># =&gt; but nothing was raised</span>
</span><span class='line'>
</span><span class='line'><span class="k">def</span> <span class="nf">valid?</span><span class="p">(</span><span class="n">kinds</span><span class="p">)</span>
</span><span class='line'>  <span class="k">return</span> <span class="kp">false</span> <span class="k">if</span> <span class="n">kinds</span><span class="o">[</span><span class="mi">1</span><span class="o">]</span> <span class="o">==</span> <span class="s2">&quot;invalid&quot;</span>
</span><span class='line'>
</span><span class='line'>  <span class="n">kinds</span><span class="o">.</span><span class="n">include?</span><span class="p">(</span><span class="s2">&quot;private&quot;</span><span class="p">)</span> <span class="o">||</span>
</span><span class='line'>      <span class="n">kinds</span><span class="o">.</span><span class="n">include?</span><span class="p">(</span><span class="s2">&quot;corporate&quot;</span><span class="p">)</span>
</span><span class='line'><span class="k">end</span>
</span><span class='line'><span class="c1"># =&gt; PASS</span>
</span></code></pre></td></tr></table></div></figure>


<p>While this works, it leads to two other weirdnesses: <code>kinds[1]</code> and <code>"invalid"</code>, let&rsquo;s the latter first:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="n">it_fails_with</span><span class="p">(</span><span class="s2">&quot;Order kind can be one of: &#39;private&#39;, &#39;corporate&#39;, &#39;bundle&#39;&quot;</span><span class="p">)</span>
</span><span class='line'>  <span class="o">.</span><span class="n">when_order_kind_is</span><span class="p">(</span><span class="sx">%w(private another_invalid)</span><span class="p">)</span>
</span><span class='line'><span class="c1"># =&gt; expected InvalidOrderError</span>
</span><span class='line'><span class="c1"># =&gt; with &quot;Order kind can be one of: &#39;private&#39;, &#39;corporate&#39;, &#39;bundle&#39;&quot;</span>
</span><span class='line'><span class="c1"># =&gt; but nothing was raised</span>
</span><span class='line'>
</span><span class='line'><span class="k">def</span> <span class="nf">valid?</span><span class="p">(</span><span class="n">kinds</span><span class="p">)</span>
</span><span class='line'>  <span class="k">return</span> <span class="kp">false</span> <span class="k">if</span> <span class="n">kinds</span><span class="o">[</span><span class="mi">1</span><span class="o">]</span> <span class="o">&amp;&amp;</span> <span class="n">kinds</span><span class="o">[</span><span class="mi">1</span><span class="o">]</span> <span class="o">!=</span> <span class="s2">&quot;private&quot;</span>
</span><span class='line'>
</span><span class='line'>  <span class="n">kinds</span><span class="o">.</span><span class="n">include?</span><span class="p">(</span><span class="s2">&quot;private&quot;</span><span class="p">)</span> <span class="o">||</span>
</span><span class='line'>      <span class="n">kinds</span><span class="o">.</span><span class="n">include?</span><span class="p">(</span><span class="s2">&quot;corporate&quot;</span><span class="p">)</span>
</span><span class='line'><span class="k">end</span>
</span><span class='line'><span class="c1"># =&gt; expected no Exception,</span>
</span><span class='line'><span class="c1"># =&gt; got #&lt;InvalidOrderError: Order kind can be one of: &#39;private&#39;, &#39;corporate&#39;, &#39;bundle&#39;&gt;</span>
</span><span class='line'><span class="c1"># .. and more failures ..</span>
</span></code></pre></td></tr></table></div></figure>


<p>Other tests fail now, from them it is possible to see, that second kind should be either <code>private</code> or <code>corporate</code>:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="k">def</span> <span class="nf">valid?</span><span class="p">(</span><span class="n">kinds</span><span class="p">)</span>
</span><span class='line'>  <span class="k">return</span> <span class="kp">false</span> <span class="k">if</span> <span class="n">kinds</span><span class="o">[</span><span class="mi">1</span><span class="o">]</span> <span class="o">&amp;&amp;</span>
</span><span class='line'>      <span class="n">kinds</span><span class="o">[</span><span class="mi">1</span><span class="o">]</span> <span class="o">!=</span> <span class="s2">&quot;private&quot;</span> <span class="o">&amp;&amp;</span>
</span><span class='line'>      <span class="n">kinds</span><span class="o">[</span><span class="mi">1</span><span class="o">]</span> <span class="o">!=</span> <span class="s2">&quot;corporate&quot;</span>
</span><span class='line'>
</span><span class='line'>  <span class="n">kinds</span><span class="o">.</span><span class="n">include?</span><span class="p">(</span><span class="s2">&quot;private&quot;</span><span class="p">)</span> <span class="o">||</span>
</span><span class='line'>      <span class="n">kinds</span><span class="o">.</span><span class="n">include?</span><span class="p">(</span><span class="s2">&quot;corporate&quot;</span><span class="p">)</span>
</span><span class='line'><span class="k">end</span>
</span><span class='line'><span class="c1"># =&gt; PASS</span>
</span></code></pre></td></tr></table></div></figure>


<p>This looks rather clunky, we should make it a bit cleaner:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="no">ALLOWED_ORDER_KINDS</span> <span class="o">=</span> <span class="sx">%w(private corporate)</span>
</span><span class='line'>
</span><span class='line'><span class="k">def</span> <span class="nf">valid?</span><span class="p">(</span><span class="n">kinds</span><span class="p">)</span>
</span><span class='line'>  <span class="k">return</span> <span class="kp">false</span> <span class="k">if</span> <span class="n">kinds</span><span class="o">[</span><span class="mi">1</span><span class="o">]</span> <span class="o">&amp;&amp;</span>
</span><span class='line'>      <span class="o">!</span><span class="no">ALLOWED_ORDER_KINDS</span><span class="o">.</span><span class="n">include?</span><span class="p">(</span><span class="n">kinds</span><span class="o">[</span><span class="mi">1</span><span class="o">]</span><span class="p">)</span>
</span><span class='line'>
</span><span class='line'>  <span class="n">kinds</span><span class="o">.</span><span class="n">include?</span><span class="p">(</span><span class="s2">&quot;private&quot;</span><span class="p">)</span> <span class="o">||</span>
</span><span class='line'>      <span class="n">kinds</span><span class="o">.</span><span class="n">include?</span><span class="p">(</span><span class="s2">&quot;corporate&quot;</span><span class="p">)</span>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>


<p>Let&rsquo;s eliminate the other weirdness - <code>kinds[1]</code>, it probably should verify all kinds in the array:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="n">it_fails_with</span><span class="p">(</span><span class="s2">&quot;Order kind can be one of: &#39;private&#39;, &#39;corporate&#39;, &#39;bundle&#39;&quot;</span><span class="p">)</span>
</span><span class='line'>  <span class="o">.</span><span class="n">when_order_kind_is</span><span class="p">(</span><span class="sx">%w(invalid private)</span><span class="p">)</span>
</span><span class='line'><span class="c1"># =&gt; expected InvalidOrderError</span>
</span><span class='line'><span class="c1"># =&gt; with &quot;Order kind can be one of: &#39;private&#39;, &#39;corporate&#39;, &#39;bundle&#39;&quot;</span>
</span><span class='line'><span class="c1"># =&gt; but nothing was raised</span>
</span><span class='line'>
</span><span class='line'><span class="k">def</span> <span class="nf">valid?</span><span class="p">(</span><span class="n">kinds</span><span class="p">)</span>
</span><span class='line'>  <span class="k">return</span> <span class="kp">false</span> <span class="k">if</span> <span class="n">kinds</span><span class="o">.</span><span class="n">any?</span> <span class="p">{</span> <span class="o">|</span><span class="n">kind</span><span class="o">|</span>
</span><span class='line'>    <span class="o">!</span><span class="no">ALLOWED_ORDER_KINDS</span><span class="o">.</span><span class="n">include?</span><span class="p">(</span><span class="n">kind</span><span class="p">)</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>  <span class="n">kinds</span><span class="o">.</span><span class="n">include?</span><span class="p">(</span><span class="s2">&quot;private&quot;</span><span class="p">)</span> <span class="o">||</span>
</span><span class='line'>      <span class="n">kinds</span><span class="o">.</span><span class="n">include?</span><span class="p">(</span><span class="s2">&quot;corporate&quot;</span><span class="p">)</span>
</span><span class='line'><span class="k">end</span>
</span><span class='line'><span class="c1"># =&gt; PASS</span>
</span></code></pre></td></tr></table></div></figure>


<p>And now this can be greatly simplified by inverting the boolean logic:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="k">def</span> <span class="nf">valid?</span><span class="p">(</span><span class="n">kinds</span><span class="p">)</span>
</span><span class='line'>  <span class="n">kinds</span><span class="o">.</span><span class="n">all?</span> <span class="p">{</span> <span class="o">|</span><span class="n">kind</span><span class="o">|</span>
</span><span class='line'>    <span class="no">ALLOWED_ORDER_KINDS</span><span class="o">.</span><span class="n">include?</span><span class="p">(</span><span class="n">kind</span><span class="p">)</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>


<p>Now that we have dealt with all weirdnesses in our production code, let&rsquo;s get back to our requirement:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="n">it_does_not_fail</span>
</span><span class='line'>  <span class="o">.</span><span class="n">when_order_kind_is</span><span class="p">(</span><span class="sx">%w(private bundle)</span><span class="p">)</span>
</span><span class='line'><span class="c1"># =&gt; expected no Exception,</span>
</span><span class='line'><span class="c1"># =&gt; got #&lt;InvalidOrderError: Order kind can be one of: &#39;private&#39;, &#39;corporate&#39;, &#39;bundle&#39;&gt;</span>
</span></code></pre></td></tr></table></div></figure>


<p>Wow! Now it fails exactly as it should. This means that it is now the right time for this test! Let&rsquo;s make it pass by adding <code>bundle</code> to the list of allowed order kinds:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="no">ALLOWED_ORDER_KINDS</span> <span class="o">=</span> <span class="sx">%w(private corporate bundle)</span>
</span><span class='line'><span class="c1"># =&gt; PASS</span>
</span></code></pre></td></tr></table></div></figure>


<p>Nice! Our next requirement is about <code>bundle</code> not being used on its own, i.e.: either <code>private</code> or <code>corporate</code> is required:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="n">it_fails_with</span><span class="p">(</span><span class="s2">&quot;Order kind should be &#39;private&#39; or &#39;corporate&#39;&quot;</span><span class="p">)</span>
</span><span class='line'>  <span class="o">.</span><span class="n">when_order_kind_is</span><span class="p">(</span><span class="sx">%w(bundle)</span><span class="p">)</span>
</span><span class='line'><span class="c1"># =&gt; expected InvalidOrderError with &quot;Order kind should be &#39;private&#39; or &#39;corporate&#39;&quot;</span>
</span><span class='line'><span class="c1"># =&gt; but nothing was raised</span>
</span><span class='line'>
</span><span class='line'><span class="k">def</span> <span class="nf">validate</span><span class="p">(</span><span class="n">order</span><span class="p">)</span>
</span><span class='line'>  <span class="c1"># ...</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">if</span> <span class="n">kinds</span> <span class="o">==</span> <span class="sx">%w(bundle)</span>
</span><span class='line'>    <span class="n">fail_with</span><span class="p">(</span><span class="s2">&quot;Order kind should be &#39;private&#39; or &#39;corporate&#39;&quot;</span><span class="p">)</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'><span class="k">end</span>
</span><span class='line'><span class="c1"># =&gt; PASS</span>
</span></code></pre></td></tr></table></div></figure>


<p>And this is good enough, because that is really the only case, when this can happen until the list of allowed order kinds is extended by future business requirements. We should at least give this condition a proper name:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="k">unless</span> <span class="n">has_required?</span><span class="p">(</span><span class="n">kinds</span><span class="p">)</span>
</span><span class='line'>  <span class="n">fail_with</span><span class="p">(</span><span class="s2">&quot;Order kind should be &#39;private&#39; or &#39;corporate&#39;&quot;</span><span class="p">)</span>
</span><span class='line'><span class="k">end</span>
</span><span class='line'>
</span><span class='line'><span class="c1"># ...</span>
</span><span class='line'>
</span><span class='line'><span class="k">def</span> <span class="nf">has_required?</span><span class="p">(</span><span class="n">kinds</span><span class="p">)</span>
</span><span class='line'>  <span class="n">kinds</span> <span class="o">!=</span> <span class="sx">%w(bundle)</span>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>


<p>Except, that we could provide duplicated <code>bundle</code>:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="n">it_fails_with</span><span class="p">(</span><span class="s2">&quot;Order kind should be &#39;private&#39; or &#39;corporate&#39;&quot;</span><span class="p">)</span>
</span><span class='line'>  <span class="o">.</span><span class="n">when_order_kind_is</span><span class="p">(</span><span class="sx">%w(bundle bundle)</span><span class="p">)</span>
</span><span class='line'><span class="c1"># =&gt; expected InvalidOrderError</span>
</span><span class='line'><span class="c1"># =&gt; with &quot;Order kind should be &#39;private&#39; or &#39;corporate&#39;&quot;</span>
</span><span class='line'><span class="c1"># =&gt; but nothing was raised</span>
</span><span class='line'>
</span><span class='line'><span class="k">def</span> <span class="nf">has_required?</span><span class="p">(</span><span class="n">kinds</span><span class="p">)</span>
</span><span class='line'>  <span class="c1"># Easy to fix if we de-duplicate it with #uniq:</span>
</span><span class='line'>  <span class="n">kinds</span><span class="o">.</span><span class="n">uniq</span> <span class="o">!=</span> <span class="sx">%w(bundle)</span>
</span><span class='line'><span class="k">end</span>
</span><span class='line'><span class="c1"># =&gt; PASS</span>
</span></code></pre></td></tr></table></div></figure>


<p>Now it is time to move on to the final requirement about conflicts between <code>private</code> and <code>corporate</code>:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="n">it_fails_with</span><span class="p">(</span><span class="s2">&quot;Order kind can not be &#39;private&#39; and &#39;corporate&#39; at the same time&quot;</span><span class="p">)</span>
</span><span class='line'>  <span class="o">.</span><span class="n">when_order_kind_is</span><span class="p">(</span><span class="sx">%w(private corporate)</span><span class="p">)</span>
</span><span class='line'><span class="c1"># =&gt; expected InvalidOrderError</span>
</span><span class='line'><span class="c1"># =&gt; with &quot;Order kind can not be &#39;private&#39; and &#39;corporate&#39; at the same time&quot;</span>
</span><span class='line'><span class="c1"># =&gt; but nothing was raised</span>
</span><span class='line'>
</span><span class='line'><span class="k">def</span> <span class="nf">validate</span><span class="p">(</span><span class="n">order</span><span class="p">)</span>
</span><span class='line'>  <span class="c1"># ...</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">if</span> <span class="n">kinds</span> <span class="o">==</span> <span class="sx">%w(private corporate)</span>
</span><span class='line'>    <span class="n">fail_with</span><span class="p">(</span><span class="s2">&quot;Order kind can not be &#39;private&#39; and &#39;corporate&#39; at the same time&quot;</span><span class="p">)</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'><span class="k">end</span>
</span><span class='line'><span class="c1"># =&gt; PASS</span>
</span></code></pre></td></tr></table></div></figure>


<p>Of course, <code>kinds == %w(private corporate)</code> can be considered too specific for production code, we should triangulate it:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="n">it_fails_with</span><span class="p">(</span><span class="s2">&quot;Order kind can not be &#39;private&#39; and &#39;corporate&#39; at the same time&quot;</span><span class="p">)</span>
</span><span class='line'>  <span class="o">.</span><span class="n">when_order_kind_is</span><span class="p">(</span><span class="sx">%w(corporate private)</span><span class="p">)</span>
</span><span class='line'><span class="c1"># =&gt; expected InvalidOrderError</span>
</span><span class='line'><span class="c1"># =&gt; with &quot;Order kind can not be &#39;private&#39; and &#39;corporate&#39; at the same time&quot;</span>
</span><span class='line'><span class="c1"># =&gt; but nothing was raised</span>
</span><span class='line'>
</span><span class='line'><span class="k">if</span> <span class="n">kinds</span><span class="o">.</span><span class="n">include?</span><span class="p">(</span><span class="s2">&quot;private&quot;</span><span class="p">)</span> <span class="o">&amp;&amp;</span>
</span><span class='line'>    <span class="n">kinds</span><span class="o">.</span><span class="n">include?</span><span class="p">(</span><span class="s2">&quot;corporate&quot;</span><span class="p">)</span>
</span><span class='line'>  <span class="n">fail_with</span><span class="p">(</span><span class="s2">&quot;Order kind can not be &#39;private&#39; and &#39;corporate&#39; at the same time&quot;</span><span class="p">)</span>
</span><span class='line'><span class="k">end</span>
</span><span class='line'><span class="c1"># =&gt; PASS</span>
</span></code></pre></td></tr></table></div></figure>


<p>And, finally, let&rsquo;s give this condition a proper name:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="k">if</span> <span class="n">has_conflicts?</span><span class="p">(</span><span class="n">kinds</span><span class="p">)</span>
</span><span class='line'>  <span class="n">fail_with</span><span class="p">(</span><span class="s2">&quot;Order kind can not be &#39;private&#39; and &#39;corporate&#39; at the same time&quot;</span><span class="p">)</span>
</span><span class='line'><span class="k">end</span>
</span><span class='line'>
</span><span class='line'><span class="c1"># ...</span>
</span><span class='line'>
</span><span class='line'><span class="k">def</span> <span class="nf">has_conflicts?</span><span class="p">(</span><span class="n">kinds</span><span class="p">)</span>
</span><span class='line'>  <span class="n">kinds</span><span class="o">.</span><span class="n">include?</span><span class="p">(</span><span class="s2">&quot;private&quot;</span><span class="p">)</span> <span class="o">&amp;&amp;</span>
</span><span class='line'>    <span class="n">kinds</span><span class="o">.</span><span class="n">include?</span><span class="p">(</span><span class="s2">&quot;corporate&quot;</span><span class="p">)</span>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>


<p>I believe we are done now. Source for this example can be found in <a href="https://github.com/waterlink/order_kind_validator/pull/3">an open pull request here</a>.</p>

<p>Let&rsquo;s recap how Triangulation technique worked for us here.</p>

<h2>Triangulation Technique in Depth</h2>

<p>The main goal of triangulation is to prove that the code is not general enough along some axis (class of tests) by writing a test and then making sure it passes. Effective application of the technique requires to prove and eliminate all such &ldquo;weirdnesses&rdquo; or non-generalities from the production code after each Red-Green-Refactor cycle for business requirements. This is, in fact, the 3rd cycle of Test-Driven-Development called Mini Cycle of TDD, it should be executed about every 10 minutes.</p>

<p>Another observation is that following this technique we are introducing only one small piece of knowledge into our production code, for example:</p>

<ul>
<li>When writing a test for next business requirement, we are introducing the fact that we need an <code>if</code> statement with a certain body (in this example it was a <code>raise error</code> statement). Since we can not introduce the <code>if</code> statement without a condition we need to put some condition there and we put a very specific condition on purpose since we know that it is tested and it is simple.</li>
<li>Next, we are proving that this condition is too specific by writing a test, and then making it pass with a more generic solution. This way we are introducing a tiny little bit more knowledge in our production code.</li>
<li>We are repeating this iterative process until the production code is generic enough for the current specification (test suite). And we start over. This is the Mini Cycle of TDD.</li>
</ul>


<h2>Bottom Line</h2>

<p>Today we have learned the Golden Rule of TDD - &ldquo;As tests get more specific, production code gets more generic&rdquo;, and we have learned the Triangulation Technique, that allows us to follow this rule in an incremental and confident way. Additionally, we have learned, that following Red-Green-Refactor strictly is important, and this includes even the <code>RED</code> stage of this cycle - when the test for business requirement does not fail, it is either: already implemented or it has to wait for later.</p>

<p>This is a series of articles:</p>

<ol>
<li><a href="http://www.tddfellow.com/blog/2016/08/30/getting-stuck-while-doing-tdd-part-1-example/">Part 1: Example</a></li>
<li><a href="http://www.tddfellow.com/blog/2016/08/31/getting-stuck-while-doing-tdd-part-2-buggy-code-and-forcing-our-way-through/">Part 2: Buggy Code and Forcing Our Way Through</a></li>
<li>Part 3: Triangulation to the Rescue! (reading this)</li>
</ol>


<p>You would not want to miss next articles on this tech blog, we still have a lot to talk about:</p>

<ul>
<li>Continuous Integration and Continuous Delivery - importance of not impeding others,</li>
<li>Open-Closed Principle - changing behavior by adding new code,</li>
<li>Mutational Testing, &ldquo;Build Your Own Testing Framework&rdquo; series, 4 Cycles of TDD, Test-Driven Development screencasts and so much more!</li>
</ul>


<h2>Thanks!</h2>

<p>Thank you for reading, my dear reader. If you liked it, please share this article on social networks and follow me on twitter: <a href="https://twitter.com/tdd_fellow">@tdd_fellow</a>.</p>

<p>If you have any questions or feedback for me, don&rsquo;t hesitate to reach me out on Twitter: <a href="https://twitter.com/tdd_fellow">@tdd_fellow</a>.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Getting Stuck While Doing TDD. Part 2: Buggy Code and Forcing Our Way Through]]></title>
    <link href="http://www.tddfellow.com/blog/2016/08/31/getting-stuck-while-doing-tdd-part-2-buggy-code-and-forcing-our-way-through/"/>
    <updated>2016-08-31T02:35:06+02:00</updated>
    <id>http://www.tddfellow.com/blog/2016/08/31/getting-stuck-while-doing-tdd-part-2-buggy-code-and-forcing-our-way-through</id>
    <content type="html"><![CDATA[<p>Welcome back to the &ldquo;Getting Stuck While Doing TDD&rdquo; series. Today we are going to see the results of getting stuck while doing TDD and scratch the surface of how to avoid this outcome.</p>

<p>Code examples today will be in Ruby programming language. The technique itself is, of course, language-agnostic.</p>

<h2>TL;DR</h2>

<ul>
<li>It is painful and difficult to force your way through when getting stuck in TDD.</li>
<li>It results in degraded guarantees from TDD (such as test coverage, semantical stability, and confidence).</li>
</ul>


<p>Ways to avoid this outcome:</p>

<ul>
<li>do not write tests that will not fail with the current production code</li>
<li>choose next test to write that will address particular detail about production code that is wrong or not general enough (Triangulation)</li>
</ul>


<p>Finally, do not forget to remove redundant tests if any.</p>

<!--more-->


<p>This is a series of articles:</p>

<ol>
<li><a href="http://www.tddfellow.com/blog/2016/08/30/getting-stuck-while-doing-tdd-part-1-example/">Part 1: Example</a></li>
<li>Part 2: Buggy Code and Forcing Our Way Through (reading this)</li>
<li><a href="http://www.tddfellow.com/blog/2016/08/31/getting-stuck-while-doing-tdd-part-3-triangulation-to-the-rescue/">Part 3: Triangulation to the Rescue!</a></li>
</ol>


<h2>Buggy if-riddled code</h2>

<p>Buggy <code>if</code>-riddled code is what we&rsquo;ve got. It is even not so easy to read. While we can refactor it to be more readable that won&rsquo;t change the presence of bugs, though. Let&rsquo;s still do it to understand what happens in this code better:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
<span class='line-number'>37</span>
<span class='line-number'>38</span>
<span class='line-number'>39</span>
<span class='line-number'>40</span>
<span class='line-number'>41</span>
<span class='line-number'>42</span>
<span class='line-number'>43</span>
<span class='line-number'>44</span>
<span class='line-number'>45</span>
<span class='line-number'>46</span>
<span class='line-number'>47</span>
<span class='line-number'>48</span>
<span class='line-number'>49</span>
<span class='line-number'>50</span>
<span class='line-number'>51</span>
<span class='line-number'>52</span>
<span class='line-number'>53</span>
<span class='line-number'>54</span>
<span class='line-number'>55</span>
<span class='line-number'>56</span>
<span class='line-number'>57</span>
<span class='line-number'>58</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="k">class</span> <span class="nc">OrderKindValidator</span>
</span><span class='line'>  <span class="k">def</span> <span class="nf">validate</span><span class="p">(</span><span class="n">order</span><span class="p">)</span>
</span><span class='line'>    <span class="n">kinds</span> <span class="o">=</span> <span class="n">order</span><span class="o">[</span><span class="ss">:kind</span><span class="o">]</span>
</span><span class='line'>
</span><span class='line'>    <span class="n">validate_only_known</span><span class="p">(</span><span class="n">kinds</span><span class="p">)</span>
</span><span class='line'>    <span class="n">validate_has_required</span><span class="p">(</span><span class="n">kinds</span><span class="p">)</span>
</span><span class='line'>    <span class="n">validate_no_conflicting</span><span class="p">(</span><span class="n">kinds</span><span class="p">)</span>
</span><span class='line'>    <span class="n">validate_non_empty</span><span class="p">(</span><span class="n">kinds</span><span class="p">)</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'>
</span><span class='line'>  <span class="kp">private</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">def</span> <span class="nf">validate_non_empty</span><span class="p">(</span><span class="n">kinds</span><span class="p">)</span>
</span><span class='line'>    <span class="k">if</span> <span class="n">empty?</span><span class="p">(</span><span class="n">kinds</span><span class="p">)</span>
</span><span class='line'>      <span class="n">fail_with</span><span class="p">(</span><span class="s2">&quot;Order kind can not be empty&quot;</span><span class="p">)</span>
</span><span class='line'>    <span class="k">end</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">def</span> <span class="nf">validate_no_conflicting</span><span class="p">(</span><span class="n">kinds</span><span class="p">)</span>
</span><span class='line'>    <span class="k">if</span> <span class="n">has_conflicting</span><span class="p">(</span><span class="n">kinds</span><span class="p">)</span>
</span><span class='line'>      <span class="n">fail_with</span><span class="p">(</span><span class="s2">&quot;Order kind can not be &#39;private&#39; and &#39;corporate&#39; at the same time&quot;</span><span class="p">)</span>
</span><span class='line'>    <span class="k">end</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">def</span> <span class="nf">validate_has_required</span><span class="p">(</span><span class="n">kinds</span><span class="p">)</span>
</span><span class='line'>    <span class="k">if</span> <span class="n">has_no_required</span><span class="p">(</span><span class="n">kinds</span><span class="p">)</span>
</span><span class='line'>      <span class="n">fail_with</span><span class="p">(</span><span class="s2">&quot;Order kind should be &#39;private&#39; or &#39;corporate&#39;&quot;</span><span class="p">)</span>
</span><span class='line'>    <span class="k">end</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">def</span> <span class="nf">validate_only_known</span><span class="p">(</span><span class="n">kinds</span><span class="p">)</span>
</span><span class='line'>    <span class="k">if</span> <span class="n">invalid?</span><span class="p">(</span><span class="n">kinds</span><span class="p">)</span>
</span><span class='line'>      <span class="n">fail_with</span><span class="p">(</span><span class="s2">&quot;Order kind can be one of: &#39;private&#39;, &#39;corporate&#39;, &#39;bundle&#39;&quot;</span><span class="p">)</span>
</span><span class='line'>    <span class="k">end</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">def</span> <span class="nf">empty?</span><span class="p">(</span><span class="n">kind</span><span class="p">)</span>
</span><span class='line'>    <span class="n">kind</span> <span class="o">!=</span> <span class="o">[</span><span class="s2">&quot;private&quot;</span><span class="o">]</span> <span class="o">&amp;&amp;</span> <span class="n">kind</span> <span class="o">!=</span> <span class="o">[</span><span class="s2">&quot;corporate&quot;</span><span class="o">]</span> <span class="o">&amp;&amp;</span>
</span><span class='line'>        <span class="n">kind</span> <span class="o">!=</span> <span class="sx">%w(private bundle)</span> <span class="o">&amp;&amp;</span>
</span><span class='line'>        <span class="n">kind</span> <span class="o">!=</span> <span class="sx">%w(corporate bundle)</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">def</span> <span class="nf">has_conflicting</span><span class="p">(</span><span class="n">kind</span><span class="p">)</span>
</span><span class='line'>    <span class="n">kind</span> <span class="o">==</span> <span class="sx">%w(private corporate)</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">def</span> <span class="nf">has_no_required</span><span class="p">(</span><span class="n">kind</span><span class="p">)</span>
</span><span class='line'>    <span class="n">kind</span> <span class="o">==</span> <span class="o">[</span><span class="s2">&quot;bundle&quot;</span><span class="o">]</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">def</span> <span class="nf">invalid?</span><span class="p">(</span><span class="n">kind</span><span class="p">)</span>
</span><span class='line'>    <span class="n">kind</span> <span class="o">==</span> <span class="o">[</span><span class="s2">&quot;invalid&quot;</span><span class="o">]</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">def</span> <span class="nf">fail_with</span><span class="p">(</span><span class="n">message</span><span class="p">)</span>
</span><span class='line'>    <span class="k">raise</span> <span class="no">InvalidOrderError</span><span class="o">.</span><span class="n">new</span><span class="p">(</span><span class="n">message</span><span class="p">)</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>


<p>Structure of the class, actually, sounds just right, but conditions are not good:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="k">def</span> <span class="nf">empty?</span><span class="p">(</span><span class="n">kind</span><span class="p">)</span>
</span><span class='line'>  <span class="n">kind</span> <span class="o">!=</span> <span class="o">[</span><span class="s2">&quot;private&quot;</span><span class="o">]</span> <span class="o">&amp;&amp;</span> <span class="n">kind</span> <span class="o">!=</span> <span class="o">[</span><span class="s2">&quot;corporate&quot;</span><span class="o">]</span> <span class="o">&amp;&amp;</span>
</span><span class='line'>      <span class="n">kind</span> <span class="o">!=</span> <span class="sx">%w(private bundle)</span> <span class="o">&amp;&amp;</span>
</span><span class='line'>      <span class="n">kind</span> <span class="o">!=</span> <span class="sx">%w(corporate bundle)</span>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>


<p>Really? It does not do what it says. At all. It basically just solves the problem very specifically to the tests. I can easily come up with a test that will break it:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="n">it_fails_with</span><span class="p">(</span><span class="s2">&quot;Order kind can be one of: &#39;private&#39;, &#39;corporate&#39;, &#39;bundle&#39;&quot;</span><span class="p">)</span>
</span><span class='line'>    <span class="o">.</span><span class="n">when_order_kind_is</span> <span class="o">[</span><span class="s2">&quot;almost anything&quot;</span><span class="o">]</span>
</span><span class='line'>
</span><span class='line'><span class="c1"># Error: expected InvalidOrderError with</span>
</span><span class='line'><span class="c1">#    &quot;Order kind can be one of: &#39;private&#39;, &#39;corporate&#39;, &#39;bundle&#39;&quot;,</span>
</span><span class='line'><span class="c1"># got #&lt;InvalidOrderError: Order kind can not be empty&gt;</span>
</span><span class='line'>
</span><span class='line'><span class="c1"># or other test</span>
</span><span class='line'><span class="n">it_does_not_fail</span><span class="o">.</span><span class="n">when_order_kind_is</span> <span class="sx">%w(corporate corporate)</span>
</span></code></pre></td></tr></table></div></figure>




<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="k">def</span> <span class="nf">has_conflicting</span><span class="p">(</span><span class="n">kind</span><span class="p">)</span>
</span><span class='line'>  <span class="n">kind</span> <span class="o">==</span> <span class="sx">%w(private corporate)</span>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>


<p>This at least does what it says. But only for one specific case, instead of general one. One test that I can come up with right away:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="n">it_fails_with</span><span class="p">(</span><span class="s2">&quot;Order kind can not be &#39;private&#39; and &#39;corporate&#39; at the same time&quot;</span><span class="p">)</span>
</span><span class='line'>    <span class="o">.</span><span class="n">when_order_kind_is</span> <span class="sx">%w(private corporate bundle)</span>
</span><span class='line'>
</span><span class='line'><span class="c1"># and another one:</span>
</span><span class='line'><span class="n">it_fails_with</span><span class="p">(</span><span class="s2">&quot;Order kind can not be &#39;private&#39; and &#39;corporate&#39; at the same time&quot;</span><span class="p">)</span>
</span><span class='line'>    <span class="o">.</span><span class="n">when_order_kind_is</span> <span class="sx">%w(corporate private)</span>
</span></code></pre></td></tr></table></div></figure>




<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="k">def</span> <span class="nf">has_no_required</span><span class="p">(</span><span class="n">kind</span><span class="p">)</span>
</span><span class='line'>  <span class="n">kind</span> <span class="o">==</span> <span class="o">[</span><span class="s2">&quot;bundle&quot;</span><span class="o">]</span>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>


<p>While this may work for our current requirements, it is really confusing for the reader. Method name says: &ldquo;has no required kind&rdquo; while method body checks if it is only <code>bundle</code>. And it does not work well with that edge case:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="n">it_fails_with</span><span class="p">(</span><span class="s2">&quot;Order kind should be &#39;private&#39; or &#39;corporate&#39;&quot;</span><span class="p">)</span>
</span><span class='line'>    <span class="o">.</span><span class="n">when_order_kind_is</span> <span class="sx">%w(bundle bundle)</span>
</span></code></pre></td></tr></table></div></figure>


<p>While this case is quite unlikely, nothing in business rules forbid that and some other part of the system may as well duplicate <code>bundle</code> kind for some reason or it may be a user input mistake.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="k">def</span> <span class="nf">invalid?</span><span class="p">(</span><span class="n">kind</span><span class="p">)</span>
</span><span class='line'>  <span class="n">kind</span> <span class="o">==</span> <span class="o">[</span><span class="s2">&quot;invalid&quot;</span><span class="o">]</span>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>


<p>This method, indeed, checks that <code>kind</code> is <code>invalid</code>. Literally <code>"invalid"</code>. Which would mean, that all kinds except exactly <code>"invalid"</code> are allowed. This is not true according to our business rules. In fact, we have already written the failing test for this some moments ago:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="n">it_fails_with</span><span class="p">(</span><span class="s2">&quot;Order kind can be one of: &#39;private&#39;, &#39;corporate&#39;, &#39;bundle&#39;&quot;</span><span class="p">)</span>
</span><span class='line'>    <span class="o">.</span><span class="n">when_order_kind_is</span> <span class="o">[</span><span class="s2">&quot;almost anything&quot;</span><span class="o">]</span>
</span></code></pre></td></tr></table></div></figure>


<p>Let&rsquo;s comment out these failing tests and try to force-TDD our way through these bugs by uncommenting and fixing them one-by-one following Red-Green-Refactor loop:</p>

<h2>Forcing our way through</h2>

<p>So, let&rsquo;s uncomment our first failing test:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="n">it_fails_with</span><span class="p">(</span><span class="s2">&quot;Order kind can be one of: &#39;private&#39;, &#39;corporate&#39;, &#39;bundle&#39;&quot;</span><span class="p">)</span>
</span><span class='line'>    <span class="o">.</span><span class="n">when_order_kind_is</span> <span class="o">[</span><span class="s2">&quot;almost anything&quot;</span><span class="o">]</span>
</span></code></pre></td></tr></table></div></figure>


<p>We are expecting <code>validate_only_known</code> to fail with its message and that means <code>invalid?(kinds)</code> should return true. To make it return <code>true</code> in this case and preserve its old behavior we will need to remove <code>private</code>, <code>corporate</code> and <code>bundle</code> from <code>kinds</code> and check that it is not empty:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="k">def</span> <span class="nf">invalid?</span><span class="p">(</span><span class="n">kinds</span><span class="p">)</span>
</span><span class='line'>  <span class="p">(</span><span class="n">kinds</span> <span class="o">-</span> <span class="sx">%w(private corporate bundle)</span><span class="p">)</span><span class="o">.</span><span class="n">any?</span>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>


<p>See how we had to write the whole thing in one go. There is no chance to write it incrementally because there will be a bunch of tests that fail. Wait! While it does not fail for any tests related to invalid kinds, it fails for all tests related to emptiness:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="no">OrderKindValidator</span>
</span><span class='line'>  <span class="n">fails</span> <span class="n">with</span> <span class="n">message</span> <span class="s2">&quot;Order kind can not be empty&quot;</span>
</span><span class='line'>    <span class="k">when</span> <span class="n">order</span> <span class="n">kind</span> <span class="n">is</span> <span class="o">[</span><span class="s2">&quot;&quot;</span><span class="o">]</span> <span class="p">(</span><span class="no">FAILED</span> <span class="o">-</span> <span class="mi">1</span><span class="p">)</span>
</span><span class='line'>    <span class="k">when</span> <span class="n">order</span> <span class="n">kind</span> <span class="n">is</span> <span class="o">[</span><span class="s2">&quot;&quot;</span><span class="p">,</span> <span class="s2">&quot;&quot;</span><span class="o">]</span> <span class="p">(</span><span class="no">FAILED</span> <span class="o">-</span> <span class="mi">2</span><span class="p">)</span>
</span><span class='line'>    <span class="k">when</span> <span class="n">order</span> <span class="n">kind</span> <span class="n">is</span> <span class="o">[</span><span class="s2">&quot;private&quot;</span><span class="p">,</span> <span class="s2">&quot;&quot;</span><span class="o">]</span> <span class="p">(</span><span class="no">FAILED</span> <span class="o">-</span> <span class="mi">3</span><span class="p">)</span>
</span><span class='line'>    <span class="k">when</span> <span class="n">order</span> <span class="n">kind</span> <span class="n">is</span> <span class="n">absent</span> <span class="p">(</span><span class="no">FAILED</span> <span class="o">-</span> <span class="mi">4</span><span class="p">)</span>
</span><span class='line'>    <span class="k">when</span> <span class="n">order</span> <span class="n">kind</span> <span class="n">is</span> <span class="kp">nil</span> <span class="p">(</span><span class="no">FAILED</span> <span class="o">-</span> <span class="mi">5</span><span class="p">)</span>
</span></code></pre></td></tr></table></div></figure>


<p>So we need to change more production code to make this one tiny test pass. It looks like <code>validate_non_empty</code> is a culprit now - it is being called after <code>validate_only_known</code>. It should be the other way around:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="k">def</span> <span class="nf">validate</span><span class="p">(</span><span class="n">order</span><span class="p">)</span>
</span><span class='line'>  <span class="n">kinds</span> <span class="o">=</span> <span class="n">order</span><span class="o">[</span><span class="ss">:kind</span><span class="o">]</span>
</span><span class='line'>
</span><span class='line'>  <span class="n">validate_non_empty</span><span class="p">(</span><span class="n">kinds</span><span class="p">)</span>
</span><span class='line'><span class="c1"># ^ we moved this up here ^</span>
</span><span class='line'>
</span><span class='line'>  <span class="n">validate_only_known</span><span class="p">(</span><span class="n">kinds</span><span class="p">)</span>
</span><span class='line'>  <span class="n">validate_has_required</span><span class="p">(</span><span class="n">kinds</span><span class="p">)</span>
</span><span class='line'>  <span class="n">validate_no_conflicting</span><span class="p">(</span><span class="n">kinds</span><span class="p">)</span>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>


<p>Oh! Now a bunch of other tests fails:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="no">OrderKindValidator</span>
</span><span class='line'>  <span class="n">fails</span> <span class="n">with</span> <span class="n">message</span> <span class="s2">&quot;Order kind should be &#39;private&#39; or &#39;corporate&#39;&quot;</span>
</span><span class='line'>    <span class="k">when</span> <span class="n">order</span> <span class="n">kind</span> <span class="n">is</span> <span class="o">[</span><span class="s2">&quot;bundle&quot;</span><span class="o">]</span> <span class="p">(</span><span class="no">FAILED</span> <span class="o">-</span> <span class="mi">1</span><span class="p">)</span>
</span><span class='line'>
</span><span class='line'>  <span class="n">fails</span> <span class="n">with</span> <span class="n">a</span> <span class="n">message</span> <span class="s2">&quot;Order kind can not be &#39;private&#39; and &#39;corporate&#39; at the same time&quot;</span>
</span><span class='line'>    <span class="k">when</span> <span class="n">order</span> <span class="n">kind</span> <span class="n">is</span> <span class="o">[</span><span class="s2">&quot;private&quot;</span><span class="p">,</span> <span class="s2">&quot;corporate&quot;</span><span class="o">]</span> <span class="p">(</span><span class="no">FAILED</span> <span class="o">-</span> <span class="mi">4</span><span class="p">)</span>
</span><span class='line'>
</span><span class='line'>  <span class="n">fails</span> <span class="n">with</span> <span class="n">a</span> <span class="n">message</span> <span class="s2">&quot;Order kind can be one of: &#39;private&#39;, &#39;corporate&#39;, &#39;bundle&#39;&quot;</span>
</span><span class='line'>    <span class="k">when</span> <span class="n">order</span> <span class="n">kind</span> <span class="n">is</span> <span class="o">[</span><span class="s2">&quot;almost anything&quot;</span><span class="o">]</span> <span class="p">(</span><span class="no">FAILED</span> <span class="o">-</span> <span class="mi">2</span><span class="p">)</span>
</span><span class='line'>    <span class="k">when</span> <span class="n">order</span> <span class="n">kind</span> <span class="n">is</span> <span class="o">[</span><span class="s2">&quot;invalid&quot;</span><span class="o">]</span> <span class="p">(</span><span class="no">FAILED</span> <span class="o">-</span> <span class="mi">3</span><span class="p">)</span>
</span></code></pre></td></tr></table></div></figure>


<p>From failure messages it is possible to guess, that the culprit is <code>empty?(kinds)</code> function that fails in too much cases now, such as: <code>["bundle"]</code>, <code>["private", "corporate"]</code>, <code>["almost anything"]</code> and <code>["invalid"]</code>. This is because it was not doing what it said it was:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="k">def</span> <span class="nf">empty?</span><span class="p">(</span><span class="n">kinds</span><span class="p">)</span>
</span><span class='line'>  <span class="n">kinds</span> <span class="o">!=</span> <span class="o">[</span><span class="s2">&quot;private&quot;</span><span class="o">]</span> <span class="o">&amp;&amp;</span> <span class="n">kinds</span> <span class="o">!=</span> <span class="o">[</span><span class="s2">&quot;corporate&quot;</span><span class="o">]</span> <span class="o">&amp;&amp;</span>
</span><span class='line'>      <span class="n">kinds</span> <span class="o">!=</span> <span class="sx">%w(private bundle)</span> <span class="o">&amp;&amp;</span>
</span><span class='line'>      <span class="n">kinds</span> <span class="o">!=</span> <span class="sx">%w(corporate bundle)</span>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>


<p>And this is why it was hard to change the order of validations. We will have to completely rewrite this function. Let&rsquo;s start small and see which tests fail:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="k">def</span> <span class="nf">empty?</span><span class="p">(</span><span class="n">kinds</span><span class="p">)</span>
</span><span class='line'>  <span class="kp">false</span>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>


<p>The failures are:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="no">OrderKindValidator</span>
</span><span class='line'>  <span class="n">fails</span> <span class="n">with</span> <span class="n">message</span> <span class="s2">&quot;Order kind can not be empty&quot;</span>
</span><span class='line'>    <span class="k">when</span> <span class="n">order</span> <span class="n">kind</span> <span class="n">is</span> <span class="o">[</span><span class="s2">&quot;private&quot;</span><span class="p">,</span> <span class="s2">&quot;&quot;</span><span class="o">]</span> <span class="p">(</span><span class="no">FAILED</span> <span class="o">-</span> <span class="mi">1</span><span class="p">)</span>
</span><span class='line'>    <span class="k">when</span> <span class="n">order</span> <span class="n">kind</span> <span class="n">is</span> <span class="o">[</span><span class="kp">nil</span><span class="o">]</span> <span class="p">(</span><span class="no">FAILED</span> <span class="o">-</span> <span class="mi">2</span><span class="p">)</span>
</span><span class='line'>    <span class="k">when</span> <span class="n">order</span> <span class="n">kind</span> <span class="n">is</span> <span class="o">[</span><span class="s2">&quot;&quot;</span><span class="p">,</span> <span class="s2">&quot;&quot;</span><span class="o">]</span> <span class="p">(</span><span class="no">FAILED</span> <span class="o">-</span> <span class="mi">3</span><span class="p">)</span>
</span><span class='line'>    <span class="k">when</span> <span class="n">order</span> <span class="n">kind</span> <span class="n">is</span> <span class="kp">nil</span> <span class="p">(</span><span class="no">FAILED</span> <span class="o">-</span> <span class="mi">4</span><span class="p">)</span>
</span><span class='line'>    <span class="k">when</span> <span class="n">order</span> <span class="n">kind</span> <span class="n">is</span> <span class="o">[</span><span class="s2">&quot;&quot;</span><span class="o">]</span> <span class="p">(</span><span class="no">FAILED</span> <span class="o">-</span> <span class="mi">5</span><span class="p">)</span>
</span><span class='line'>    <span class="k">when</span> <span class="n">order</span> <span class="n">kind</span> <span class="n">is</span> <span class="n">absent</span> <span class="p">(</span><span class="no">FAILED</span> <span class="o">-</span> <span class="mi">6</span><span class="p">)</span>
</span><span class='line'>    <span class="k">when</span> <span class="n">order</span> <span class="n">kind</span> <span class="n">is</span> <span class="o">[</span><span class="kp">nil</span><span class="p">,</span> <span class="kp">nil</span><span class="o">]</span> <span class="p">(</span><span class="no">FAILED</span> <span class="o">-</span> <span class="mi">7</span><span class="p">)</span>
</span><span class='line'>    <span class="k">when</span> <span class="n">order</span> <span class="n">kind</span> <span class="n">is</span> <span class="o">[</span><span class="s2">&quot;private&quot;</span><span class="p">,</span> <span class="kp">nil</span><span class="o">]</span> <span class="p">(</span><span class="no">FAILED</span> <span class="o">-</span> <span class="mi">8</span><span class="p">)</span>
</span><span class='line'>    <span class="k">when</span> <span class="n">order</span> <span class="n">kind</span> <span class="n">is</span> <span class="o">[]</span> <span class="p">(</span><span class="no">FAILED</span> <span class="o">-</span> <span class="mi">9</span><span class="p">)</span>
</span></code></pre></td></tr></table></div></figure>


<p>Good, only tests related directly to this case are failing. So one-by-one we can construct our condition while fixing these test failures:</p>

<ol>
<li><code>kinds.nil?</code></li>
<li><code>|| kinds.empty?</code></li>
<li><code>|| kinds[0].nil?</code>   (turned out to be redundant in the end)</li>
<li><code>|| kinds[0].empty?</code> (turned out to be redundant in the end)</li>
<li><code>|| kinds.any? { |k| k.nil? || k.empty? }</code></li>
</ol>


<p>After refactoring <code>empty?</code> the function now is looking this way:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="k">def</span> <span class="nf">empty?</span><span class="p">(</span><span class="n">kinds</span><span class="p">)</span>
</span><span class='line'>  <span class="n">absent_or_empty?</span><span class="p">(</span><span class="n">kinds</span><span class="p">)</span> <span class="o">||</span>
</span><span class='line'>      <span class="n">kinds</span><span class="o">.</span><span class="n">any?</span> <span class="p">{</span> <span class="o">|</span><span class="n">kind</span><span class="o">|</span> <span class="n">absent_or_empty?</span><span class="p">(</span><span class="n">kind</span><span class="p">)</span> <span class="p">}</span>
</span><span class='line'><span class="k">end</span>
</span><span class='line'>
</span><span class='line'><span class="k">def</span> <span class="nf">absent_or_empty?</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
</span><span class='line'>  <span class="n">value</span><span class="o">.</span><span class="n">nil?</span> <span class="o">||</span> <span class="n">value</span><span class="o">.</span><span class="n">empty?</span>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>


<p>And all tests, finally, pass. It took a lot of effort and re-writing to get this one little test to pass. This is what we call &ldquo;Getting Stuck&rdquo; in TDD. There is always an order of tests that will lead to this result almost for any somewhat complex problem.</p>

<p>The code can be found in GitHub repository in <a href="https://github.com/waterlink/order_kind_validator/pull/2/files">an open pull request here</a>.</p>

<p>Almost guaranteed ways to get stuck in TDD:</p>

<ul>
<li>write tests that do not fail,</li>
<li>do not address weird results of &ldquo;simplest thing that could possibly work&rdquo; to make the test pass and moving on to the next business rule,</li>
<li>make production code a mirror of the tests and too specific, not general.</li>
</ul>


<p>And to not get stuck is to do the opposite:</p>

<ul>
<li>do not write the test that will not fail (wait until later, when it will fail), and</li>
<li>always first write the test that will point out next deficiency in the current production code (in TDD this is called Triangulation), and</li>
<li>while making some failing test pass, make sure that the change in production code covers not only this one specific test, rather, a whole class of tests (Golden Rule of TDD: As tests get more specific, production code gets more generic).</li>
</ul>


<h2>Bottom Line</h2>

<p>Today we have seen how bad the results of getting stuck while doing TDD can be. In the next article of these series, we will explore Golden Rule of TDD and the technique called Triangulation, that allows us to incrementally test-drive code in a way, that it will always be conforming to the Golden Rule of TDD and therefore will never get us stuck. Stay tuned!</p>

<p>This is a series of articles:</p>

<ol>
<li><a href="http://www.tddfellow.com/blog/2016/08/30/getting-stuck-while-doing-tdd-part-1-example/">Part 1: Example</a></li>
<li>Part 2: Buggy Code and Forcing Our Way Through (reading this)</li>
<li><a href="http://www.tddfellow.com/blog/2016/08/31/getting-stuck-while-doing-tdd-part-3-triangulation-to-the-rescue/">Part 3: Triangulation to the Rescue!</a></li>
</ol>


<p>You would not want to miss next articles on this tech blog, we still have a lot to talk about:</p>

<ul>
<li>Triangulation technique in Test-Driven Development - overlooking this technique might cause one fail at doing TDD (these series),</li>
<li>Continuous Integration and Continuous Delivery - importance of not impeding others,</li>
<li>Open-Closed Principle - changing behavior by adding new code,</li>
<li>Mutational Testing, &ldquo;Build Your Own Testing Framework&rdquo; series, Test-Driven Development screencasts and so much more!</li>
</ul>


<h2>Thanks!</h2>

<p>Thank you for reading, my dear reader. If you liked it, please share this article on social networks and follow me on twitter: <a href="https://twitter.com/tdd_fellow">@tdd_fellow</a>.</p>

<p>If you have any questions or feedback for me, don&rsquo;t hesitate to reach me out on Twitter: <a href="https://twitter.com/tdd_fellow">@tdd_fellow</a>.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Getting Stuck While Doing TDD. Part 1: Example]]></title>
    <link href="http://www.tddfellow.com/blog/2016/08/30/getting-stuck-while-doing-tdd-part-1-example/"/>
    <updated>2016-08-30T15:27:30+02:00</updated>
    <id>http://www.tddfellow.com/blog/2016/08/30/getting-stuck-while-doing-tdd-part-1-example</id>
    <content type="html"><![CDATA[<p>Following 3 rules of TDD sounds really simple at first. In practice, there is a moment when one has to implement the whole algorithm at once to make currently failing test pass. This is called &ldquo;getting stuck&rdquo; in TDD. In this article, we will explore how exactly this happens and how to prevent that.</p>

<p>Code examples today will be in Ruby programming language. The technique itself is, of course, language-agnostic.</p>

<h2>TL;DR</h2>

<p>&ldquo;Getting stuck&rdquo; happens for a couple of reasons:</p>

<ul>
<li>wrong order of tests</li>
<li>production code is not getting more general with each test</li>
</ul>


<!--more-->


<p>This is a series of articles:</p>

<ol>
<li>Part 1: Example (reading this)</li>
<li><a href="http://www.tddfellow.com/blog/2016/08/31/getting-stuck-while-doing-tdd-part-2-buggy-code-and-forcing-our-way-through/">Part 2: Buggy Code and Forcing Our Way Through</a></li>
<li><a href="http://www.tddfellow.com/blog/2016/08/31/getting-stuck-while-doing-tdd-part-3-triangulation-to-the-rescue/">Part 3: Triangulation to the Rescue!</a></li>
</ol>


<h2>&ldquo;Getting Stuck&rdquo; in TDD</h2>

<p>Usually &ldquo;Getting Stuck&rdquo; follows this pattern:</p>

<ul>
<li>write some test and implement it via &ldquo;simplest thing that might possibly work&rdquo;,</li>
<li>write another test and implement it again in a non-general manner,</li>
<li>write some more tests in that fashion, while never addressing the fact that production code now looks completely wrong from what it should probably be looking like,</li>
<li>write a new test, that forces us to completely rewrite production code in a complete algorithm just to make it pass.</li>
</ul>


<p>This last step usually takes minutes to hours depending on the complexity of the problem at hand. Additionally, the first few tests are basically wasted time since they did not produce any bits of knowledge in the production code that persisted in production code in the end. Even worse, chances are that the algorithm that we have just written is not fully covered by current tests, since we have written it in one go just to make current failing test pass - this is no longer correct TDD and can not guarantee high test coverage, and, therefore, can not guarantee high confidence anymore.</p>

<p>Let&rsquo;s go through a small example on how one can get stuck in TDD:</p>

<h2>Order Kind Validation - Getting Stuck</h2>

<p>Let&rsquo;s define the problem at hand first. We have some sort of order request as an input to our system and we need to validate that its kind is correct:</p>

<ul>
<li>valid order kinds: <code>private</code>, <code>corporate</code>, <code>bundle</code>,</li>
<li>order kinds can be combined,</li>
<li><code>private</code> and <code>corporate</code> order kinds can not be combined, otherwise <code>InvalidOrderError</code> with message <code>Order kind can not be 'private' and 'corporate' at the same time</code>,</li>
<li>either <code>private</code> or <code>corporate</code> should be always present, otherwise <code>InvalidOrderError</code> with message <code>Order kind should be 'private' or 'corporate'</code>,</li>
<li>if order kind is not in the above list, then we need to raise <code>InvalidOrderError</code> with message <code>Order kind can be one of: 'private', 'corporate', 'bundle'</code>,</li>
<li>if order kind is not present or an empty string, then we need to raise <code>InvalidOrderError</code> with message <code>Order kind can not be empty</code>.</li>
</ul>


<p>This is a fairly simple problem and it is easy to get stuck while doing TDD here. So let&rsquo;s write our first test: &ldquo;When order has no order_kind, then we should get InvalidOrderError with message &lsquo;Order kind can not be empty&rsquo;&rdquo;:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="no">RSpec</span><span class="o">.</span><span class="n">describe</span> <span class="no">OrderKindValidator</span> <span class="k">do</span>
</span><span class='line'>  <span class="n">it</span> <span class="s2">&quot;fails with a message about order kind being empty when it is absent&quot;</span> <span class="k">do</span>
</span><span class='line'>    <span class="n">validator</span> <span class="o">=</span> <span class="no">OrderKindValidator</span><span class="o">.</span><span class="n">new</span>
</span><span class='line'>
</span><span class='line'>    <span class="n">expect</span> <span class="p">{</span> <span class="n">validator</span><span class="o">.</span><span class="n">validate</span><span class="p">({</span> <span class="ss">items</span><span class="p">:</span> <span class="mi">42</span> <span class="p">})</span> <span class="p">}</span>
</span><span class='line'>        <span class="o">.</span><span class="n">to</span> <span class="n">raise_error</span><span class="p">(</span><span class="no">InvalidOrderError</span><span class="p">,</span> <span class="s2">&quot;Order kind can not be empty&quot;</span><span class="p">)</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>


<p>And the simplest implementation possible:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="k">class</span> <span class="nc">OrderKindValidator</span>
</span><span class='line'>  <span class="k">def</span> <span class="nf">validate</span><span class="p">(</span><span class="n">order</span><span class="p">)</span>
</span><span class='line'>    <span class="k">raise</span> <span class="no">InvalidOrderError</span><span class="o">.</span><span class="n">new</span><span class="p">(</span><span class="s2">&quot;Order kind can not be empty&quot;</span><span class="p">)</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'><span class="k">end</span>
</span><span class='line'>
</span><span class='line'><span class="k">class</span> <span class="nc">InvalidOrderError</span> <span class="o">&lt;</span> <span class="no">StandardError</span>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>


<p>Next test is our next simplest edge case - when kind&rsquo;s value is <code>nil</code>:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="n">it</span> <span class="s2">&quot;fails with a message about order kind being empty when it is nil&quot;</span> <span class="k">do</span>
</span><span class='line'>  <span class="n">validator</span> <span class="o">=</span> <span class="no">OrderKindValidator</span><span class="o">.</span><span class="n">new</span>
</span><span class='line'>
</span><span class='line'>  <span class="n">expect</span> <span class="p">{</span> <span class="n">validator</span><span class="o">.</span><span class="n">validate</span><span class="p">({</span><span class="ss">items</span><span class="p">:</span> <span class="mi">42</span><span class="p">,</span> <span class="ss">kind</span><span class="p">:</span> <span class="kp">nil</span> <span class="p">})</span> <span class="p">}</span>
</span><span class='line'>      <span class="o">.</span><span class="n">to</span> <span class="n">raise_error</span><span class="p">(</span><span class="no">InvalidOrderError</span><span class="p">,</span> <span class="s2">&quot;Order kind can not be empty&quot;</span><span class="p">)</span>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>


<p>It does not fail at all, so we don&rsquo;t have any reason to change the production code. We can already spot a little duplication - <code>validator</code> variable. Let&rsquo;s extract it as a named subject of the test suite:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="n">subject</span><span class="p">(</span><span class="ss">:validator</span><span class="p">)</span> <span class="p">{</span> <span class="no">OrderKindValidator</span><span class="o">.</span><span class="n">new</span> <span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>And <code>OrderKindValidator</code> can be replaced with <code>described_class</code> (RSpec feature), so that we will not have to change too much in case we wanted to change name of the class:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="n">subject</span><span class="p">(</span><span class="ss">:validator</span><span class="p">)</span> <span class="p">{</span> <span class="n">described_class</span><span class="o">.</span><span class="n">new</span> <span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>Next simplest edge case - when kind is an empty array:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="n">it</span> <span class="s2">&quot;fails with a message about order kind being empty when it has zero elements&quot;</span> <span class="k">do</span>
</span><span class='line'>  <span class="n">expect</span> <span class="p">{</span> <span class="n">validator</span><span class="o">.</span><span class="n">validate</span><span class="p">({</span><span class="ss">items</span><span class="p">:</span> <span class="mi">42</span><span class="p">,</span> <span class="ss">kind</span><span class="p">:</span> <span class="o">[]</span> <span class="p">})</span> <span class="p">}</span>
</span><span class='line'>      <span class="o">.</span><span class="n">to</span> <span class="n">raise_error</span><span class="p">(</span><span class="no">InvalidOrderError</span><span class="p">,</span> <span class="s2">&quot;Order kind can not be empty&quot;</span><span class="p">)</span>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>


<p>I believe I am spotting annoying pattern now:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="n">it</span> <span class="s2">&quot;fails with message MESSAGE when it is KIND_CASE&quot;</span> <span class="k">do</span>
</span><span class='line'>  <span class="n">expect</span> <span class="p">{</span> <span class="n">validator</span><span class="o">.</span><span class="n">validate</span><span class="p">({</span><span class="ss">items</span><span class="p">:</span> <span class="mi">42</span><span class="p">,</span> <span class="ss">kind</span><span class="p">:</span> <span class="no">KIND_VALUE</span><span class="p">})</span> <span class="p">}</span>
</span><span class='line'>    <span class="o">.</span><span class="n">to</span> <span class="n">raise_error</span><span class="p">(</span><span class="no">InvalidOrderError</span><span class="p">,</span> <span class="no">MESSAGE</span><span class="p">)</span>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>


<p>It would be really nice to write it in this fashion:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="n">it_fails_with</span><span class="p">(</span><span class="s2">&quot;Order kind can not be empty&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">when_order_kind_is_absent</span>
</span><span class='line'><span class="n">it_fails_with</span><span class="p">(</span><span class="s2">&quot;Order kind can not be empty&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">when_order_kind_is</span> <span class="kp">nil</span>
</span><span class='line'><span class="n">it_fails_with</span><span class="p">(</span><span class="s2">&quot;Order kind can not be empty&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">when_order_kind_is</span> <span class="o">[]</span>
</span></code></pre></td></tr></table></div></figure>


<p>And as another duplication piles up:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="n">it_fails_with_order_kind_not_empty</span> <span class="o">=</span> <span class="n">it_fails_with</span><span class="p">(</span><span class="s2">&quot;Order kind can not be empty&quot;</span><span class="p">)</span>
</span><span class='line'>
</span><span class='line'><span class="n">it_fails_with_order_kind_not_empty</span><span class="o">.</span><span class="n">when_order_kind_is_absent</span>
</span><span class='line'><span class="n">it_fails_with_order_kind_not_empty</span><span class="o">.</span><span class="n">when_order_kind_is</span> <span class="kp">nil</span>
</span><span class='line'><span class="n">it_fails_with_order_kind_not_empty</span><span class="o">.</span><span class="n">when_order_kind_is</span> <span class="o">[]</span>
</span></code></pre></td></tr></table></div></figure>


<p>Now the next tests look very easy and simple:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="n">it_fails_with_order_kind_not_empty</span><span class="o">.</span><span class="n">when_order_kind_is</span> <span class="o">[</span><span class="kp">nil</span><span class="o">]</span>
</span><span class='line'><span class="n">it_fails_with_order_kind_not_empty</span><span class="o">.</span><span class="n">when_order_kind_is</span> <span class="o">[</span><span class="s2">&quot;&quot;</span><span class="o">]</span>
</span><span class='line'><span class="n">it_fails_with_order_kind_not_empty</span><span class="o">.</span><span class="n">when_order_kind_is</span> <span class="o">[</span><span class="kp">nil</span><span class="p">,</span> <span class="kp">nil</span><span class="o">]</span>
</span><span class='line'><span class="n">it_fails_with_order_kind_not_empty</span><span class="o">.</span><span class="n">when_order_kind_is</span> <span class="o">[</span><span class="s2">&quot;&quot;</span><span class="p">,</span> <span class="s2">&quot;&quot;</span><span class="o">]</span>
</span><span class='line'><span class="n">it_fails_with_order_kind_not_empty</span><span class="o">.</span><span class="n">when_order_kind_is</span> <span class="o">[</span><span class="s2">&quot;private&quot;</span><span class="p">,</span> <span class="s2">&quot;&quot;</span><span class="o">]</span>
</span><span class='line'><span class="n">it_fails_with_order_kind_not_empty</span><span class="o">.</span><span class="n">when_order_kind_is</span> <span class="o">[</span><span class="s2">&quot;private&quot;</span><span class="p">,</span> <span class="kp">nil</span><span class="o">]</span>
</span></code></pre></td></tr></table></div></figure>


<p>And they all pass right from the go. The implementation for the <code>it_fails_with</code> is looking like this:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="no">RSpec</span><span class="o">.</span><span class="n">describe</span> <span class="no">OrderKindValidator</span> <span class="k">do</span>
</span><span class='line'>  <span class="k">class</span> <span class="nc">ItFailsWith</span>
</span><span class='line'>    <span class="k">def</span> <span class="nf">initialize</span><span class="p">(</span><span class="n">spec</span><span class="p">,</span> <span class="n">expected_message</span><span class="p">)</span>
</span><span class='line'>      <span class="vi">@spec</span> <span class="o">=</span> <span class="n">spec</span>
</span><span class='line'>      <span class="vi">@expected_message</span> <span class="o">=</span> <span class="n">expected_message</span>
</span><span class='line'>    <span class="k">end</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">def</span> <span class="nf">when_order_kind_is_absent</span>
</span><span class='line'>      <span class="n">expect_failure</span><span class="p">(</span><span class="s2">&quot;absent&quot;</span><span class="p">,</span> <span class="p">{</span><span class="ss">items</span><span class="p">:</span> <span class="mi">42</span><span class="p">})</span>
</span><span class='line'>    <span class="k">end</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">def</span> <span class="nf">when_order_kind_is</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
</span><span class='line'>      <span class="n">expect_failure</span><span class="p">(</span><span class="n">value</span><span class="o">.</span><span class="n">inspect</span><span class="p">,</span> <span class="p">{</span><span class="ss">items</span><span class="p">:</span> <span class="mi">42</span><span class="p">,</span> <span class="ss">kind</span><span class="p">:</span> <span class="n">value</span><span class="p">})</span>
</span><span class='line'>    <span class="k">end</span>
</span><span class='line'>
</span><span class='line'>    <span class="kp">private</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">def</span> <span class="nf">expect_failure</span><span class="p">(</span><span class="n">feature</span><span class="p">,</span> <span class="n">order</span><span class="p">,</span> <span class="n">expected_message</span> <span class="o">=</span> <span class="vi">@expected_message</span><span class="p">)</span>
</span><span class='line'>      <span class="vi">@spec</span><span class="o">.</span><span class="n">it</span><span class="p">(</span><span class="s2">&quot;fails with message </span><span class="si">#{</span><span class="n">expected_message</span><span class="o">.</span><span class="n">inspect</span><span class="si">}</span><span class="s2"> when order kind is </span><span class="si">#{</span><span class="n">feature</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span> <span class="k">do</span>
</span><span class='line'>        <span class="n">expect</span> <span class="p">{</span> <span class="n">validator</span><span class="o">.</span><span class="n">validate</span><span class="p">(</span><span class="n">order</span><span class="p">)</span> <span class="p">}</span>
</span><span class='line'>            <span class="o">.</span><span class="n">to</span> <span class="n">raise_error</span><span class="p">(</span><span class="no">InvalidOrderError</span><span class="p">,</span> <span class="n">expected_message</span><span class="p">)</span>
</span><span class='line'>      <span class="k">end</span>
</span><span class='line'>    <span class="k">end</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">def</span> <span class="nc">self</span><span class="o">.</span><span class="nf">it_fails_with</span><span class="p">(</span><span class="n">message</span><span class="p">)</span>
</span><span class='line'>    <span class="no">ItFailsWith</span><span class="o">.</span><span class="n">new</span><span class="p">(</span><span class="nb">self</span><span class="p">,</span> <span class="n">message</span><span class="p">)</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>


<p>So, let&rsquo;s write our next edge case - when order kind is invalid:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="n">it_fails_with</span><span class="p">(</span><span class="s2">&quot;Order kind can be one of: &#39;private&#39;, &#39;corporate&#39;, &#39;bundle&#39;&quot;</span><span class="p">)</span>
</span><span class='line'>    <span class="o">.</span><span class="n">when_order_kind_is</span> <span class="o">[</span><span class="s2">&quot;invalid&quot;</span><span class="o">]</span>
</span></code></pre></td></tr></table></div></figure>


<p>Pretty neat! And oh, it fails:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="n">expected</span> <span class="no">InvalidOrderError</span> <span class="n">with</span>
</span><span class='line'>  <span class="s2">&quot;Order kind can be one of: &#39;private&#39;, &#39;corporate&#39;, &#39;bundle&#39;&quot;</span><span class="p">,</span>
</span><span class='line'><span class="n">got</span> <span class="c1">#&lt;InvalidOrderError: Order kind can not be empty&gt;</span>
</span></code></pre></td></tr></table></div></figure>


<p>And the fix:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="k">def</span> <span class="nf">validate</span><span class="p">(</span><span class="n">order</span><span class="p">)</span>
</span><span class='line'>  <span class="k">if</span> <span class="n">order</span><span class="o">[</span><span class="ss">:kind</span><span class="o">]</span> <span class="o">==</span> <span class="o">[</span><span class="s2">&quot;invalid&quot;</span><span class="o">]</span>
</span><span class='line'>    <span class="k">raise</span> <span class="no">InvalidOrderError</span><span class="o">.</span><span class="n">new</span><span class="p">(</span>
</span><span class='line'>        <span class="s2">&quot;Order kind can be one of: &#39;private&#39;, &#39;corporate&#39;, &#39;bundle&#39;&quot;</span>
</span><span class='line'>    <span class="p">)</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">raise</span> <span class="no">InvalidOrderError</span><span class="o">.</span><span class="n">new</span><span class="p">(</span><span class="s2">&quot;Order kind can not be empty&quot;</span><span class="p">)</span>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>


<p>Let&rsquo;s write our next test - when order kind is <code>private</code>:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="n">it_does_not_fail</span><span class="o">.</span><span class="n">when_order_kind_is</span> <span class="o">[</span><span class="s2">&quot;private&quot;</span><span class="o">]</span>
</span></code></pre></td></tr></table></div></figure>


<p>This fails as expected with <code>expected no Exception, got #&lt;InvalidOrderError: Order kind can not be empty&gt;</code>. And to make it pass we need to wrap second <code>raise</code> statement in the <code>if</code> condition:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="k">if</span> <span class="n">order</span><span class="o">[</span><span class="ss">:kind</span><span class="o">]</span> <span class="o">!=</span> <span class="o">[</span><span class="s2">&quot;private&quot;</span><span class="o">]</span>
</span><span class='line'>  <span class="k">raise</span> <span class="no">InvalidOrderError</span><span class="o">.</span><span class="n">new</span><span class="p">(</span><span class="s2">&quot;Order kind can not be empty&quot;</span><span class="p">)</span>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>


<p>The implementation for <code>it_does_not_fail</code> looks like that:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="k">class</span> <span class="nc">ItDoesNotFail</span>
</span><span class='line'>  <span class="k">def</span> <span class="nf">initialize</span><span class="p">(</span><span class="n">spec</span><span class="p">)</span>
</span><span class='line'>    <span class="vi">@spec</span> <span class="o">=</span> <span class="n">spec</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">def</span> <span class="nf">when_order_kind_is</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
</span><span class='line'>    <span class="vi">@spec</span><span class="o">.</span><span class="n">it</span><span class="p">(</span><span class="s2">&quot;does not fail when order kind is </span><span class="si">#{</span><span class="n">value</span><span class="o">.</span><span class="n">inspect</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span> <span class="k">do</span>
</span><span class='line'>      <span class="n">expect</span> <span class="p">{</span> <span class="n">validator</span><span class="o">.</span><span class="n">validate</span><span class="p">({</span><span class="ss">items</span><span class="p">:</span> <span class="mi">42</span><span class="p">,</span> <span class="ss">kind</span><span class="p">:</span> <span class="n">value</span><span class="p">})</span> <span class="p">}</span>
</span><span class='line'>        <span class="o">.</span><span class="n">not_to</span> <span class="n">raise_error</span>
</span><span class='line'>    <span class="k">end</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'><span class="k">end</span>
</span><span class='line'>
</span><span class='line'><span class="k">def</span> <span class="nc">self</span><span class="o">.</span><span class="nf">it_does_not_fail</span>
</span><span class='line'>  <span class="no">ItDoesNotFail</span><span class="o">.</span><span class="n">new</span><span class="p">(</span><span class="nb">self</span><span class="p">)</span>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>


<p>Let&rsquo;s write our next test:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="n">it_does_not_fail</span><span class="o">.</span><span class="n">when_order_kind_is</span> <span class="o">[</span><span class="s2">&quot;corporate&quot;</span><span class="o">]</span>
</span></code></pre></td></tr></table></div></figure>


<p>And it fails with the expected error: <code>expected no Exception, got #&lt;InvalidOrderError: Order kind can not be empty&gt;</code>. The fix is to amend our <code>if</code> condition with that case:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="k">if</span> <span class="n">order</span><span class="o">[</span><span class="ss">:kind</span><span class="o">]</span> <span class="o">!=</span> <span class="o">[</span><span class="s2">&quot;private&quot;</span><span class="o">]</span> <span class="o">&amp;&amp;</span> <span class="n">order</span><span class="o">[</span><span class="ss">:kind</span><span class="o">]</span> <span class="o">!=</span> <span class="o">[</span><span class="s2">&quot;corporate&quot;</span><span class="o">]</span>
</span><span class='line'>                                <span class="c1"># ^  we have added this case  ^</span>
</span><span class='line'>  <span class="k">raise</span> <span class="no">InvalidOrderError</span><span class="o">.</span><span class="n">new</span><span class="p">(</span><span class="s2">&quot;Order kind can not be empty&quot;</span><span class="p">)</span>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>


<p>And the tests pass. Our next business rule is that one of <code>private</code> and <code>corporate</code> should be always present:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="n">it_fails_with</span><span class="p">(</span><span class="s2">&quot;Order kind should be &#39;private&#39; or &#39;corporate&#39;&quot;</span><span class="p">)</span>
</span><span class='line'>    <span class="o">.</span><span class="n">when_order_kind_is</span> <span class="o">[</span><span class="s2">&quot;bundle&quot;</span><span class="o">]</span>
</span></code></pre></td></tr></table></div></figure>


<p>As expected the test fails:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="n">expected</span> <span class="no">InvalidOrderError</span> <span class="n">with</span>
</span><span class='line'>  <span class="s2">&quot;Order kind should be &#39;private&#39; or &#39;corporate&#39;&quot;</span><span class="p">,</span>
</span><span class='line'><span class="n">got</span> <span class="c1">#&lt;InvalidOrderError: Order kind can not be empty&gt;</span>
</span></code></pre></td></tr></table></div></figure>


<p>And to fix it we just need to sprinkle another <code>if</code> statement in the middle of the function:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="k">if</span> <span class="n">order</span><span class="o">[</span><span class="ss">:kind</span><span class="o">]</span> <span class="o">==</span> <span class="o">[</span><span class="s2">&quot;bundle&quot;</span><span class="o">]</span>
</span><span class='line'>  <span class="k">raise</span> <span class="no">InvalidOrderError</span><span class="o">.</span><span class="n">new</span><span class="p">(</span><span class="s2">&quot;Order kind should be &#39;private&#39; or &#39;corporate&#39;&quot;</span><span class="p">)</span>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>


<p>As expected, the test passes. Now we should test the next business rule - order can not be of <code>private</code> and <code>corporate</code> kind at the same time:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="n">it_fails_with</span><span class="p">(</span><span class="s2">&quot;Order kind can not be &#39;private&#39; and &#39;corporate&#39; at the same time&quot;</span><span class="p">)</span>
</span><span class='line'>    <span class="o">.</span><span class="n">when_order_kind_is</span> <span class="sx">%w(private corporate)</span>
</span></code></pre></td></tr></table></div></figure>


<p>This, as expected, fails with error message:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="n">expected</span> <span class="no">InvalidOrderError</span> <span class="n">with</span>
</span><span class='line'>  <span class="s2">&quot;Order kind can not be &#39;private&#39; and &#39;corporate&#39; at the same time&quot;</span><span class="p">,</span>
</span><span class='line'><span class="n">got</span> <span class="c1">#&lt;InvalidOrderError: Order kind can not be empty&gt;</span>
</span></code></pre></td></tr></table></div></figure>


<p>And easiest way to fix that is to add another <code>if</code> statement:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="k">if</span> <span class="n">order</span><span class="o">[</span><span class="ss">:kind</span><span class="o">]</span> <span class="o">==</span> <span class="sx">%w(private corporate)</span>
</span><span class='line'>  <span class="k">raise</span> <span class="no">InvalidOrderError</span><span class="o">.</span><span class="n">new</span><span class="p">(</span>
</span><span class='line'>      <span class="s2">&quot;Order kind can not be &#39;private&#39; and &#39;corporate&#39; at the same time&quot;</span>
</span><span class='line'>  <span class="p">)</span>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>


<p>And it passes. Let&rsquo;s test that we can combine <code>private</code> or <code>corporate</code> with <code>bundle</code> order kinds:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="n">it_does_not_fail</span><span class="o">.</span><span class="n">when_order_kind_is</span> <span class="sx">%w(private bundle)</span>
</span></code></pre></td></tr></table></div></figure>


<p>And it fails with error: <code>expected no Exception, got #&lt;InvalidOrderError: Order kind can not be empty&gt;</code>. To fix this we will have to amend our last <code>if</code> condition in the function even more:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="k">if</span> <span class="n">order</span><span class="o">[</span><span class="ss">:kind</span><span class="o">]</span> <span class="o">!=</span> <span class="o">[</span><span class="s2">&quot;private&quot;</span><span class="o">]</span> <span class="o">&amp;&amp;</span> <span class="n">order</span><span class="o">[</span><span class="ss">:kind</span><span class="o">]</span> <span class="o">!=</span> <span class="o">[</span><span class="s2">&quot;corporate&quot;</span><span class="o">]</span> <span class="o">&amp;&amp;</span>
</span><span class='line'>    <span class="n">order</span><span class="o">[</span><span class="ss">:kind</span><span class="o">]</span> <span class="o">!=</span> <span class="sx">%w(private bundle)</span>
</span><span class='line'>  <span class="c1"># ^    this is our new condition    ^</span>
</span><span class='line'>  <span class="k">raise</span> <span class="no">InvalidOrderError</span><span class="o">.</span><span class="n">new</span><span class="p">(</span><span class="s2">&quot;Order kind can not be empty&quot;</span><span class="p">)</span>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>


<p>And the test passes. Let&rsquo;s refactor the code a bit:</p>

<ul>
<li>First, we should extract <code>order[:kind]</code> duplication to a local variable <code>kind</code></li>
<li>Extract common parts of <code>raise</code> statement to the private method</li>
</ul>


<p>After this, <code>OrderKindValidator</code> will look a bit cleaner:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="k">class</span> <span class="nc">OrderKindValidator</span>
</span><span class='line'>  <span class="k">def</span> <span class="nf">validate</span><span class="p">(</span><span class="n">order</span><span class="p">)</span>
</span><span class='line'>    <span class="n">kind</span> <span class="o">=</span> <span class="n">order</span><span class="o">[</span><span class="ss">:kind</span><span class="o">]</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">if</span> <span class="n">kind</span> <span class="o">==</span> <span class="o">[</span><span class="s2">&quot;invalid&quot;</span><span class="o">]</span>
</span><span class='line'>      <span class="n">fail_with</span><span class="p">(</span><span class="s2">&quot;Order kind can be one of: &#39;private&#39;, &#39;corporate&#39;, &#39;bundle&#39;&quot;</span><span class="p">)</span>
</span><span class='line'>    <span class="k">end</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">if</span> <span class="n">kind</span> <span class="o">==</span> <span class="o">[</span><span class="s2">&quot;bundle&quot;</span><span class="o">]</span>
</span><span class='line'>      <span class="n">fail_with</span><span class="p">(</span><span class="s2">&quot;Order kind should be &#39;private&#39; or &#39;corporate&#39;&quot;</span><span class="p">)</span>
</span><span class='line'>    <span class="k">end</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">if</span> <span class="n">kind</span> <span class="o">==</span> <span class="sx">%w(private corporate)</span>
</span><span class='line'>      <span class="n">fail_with</span><span class="p">(</span><span class="s2">&quot;Order kind can not be &#39;private&#39; and &#39;corporate&#39; at the same time&quot;</span><span class="p">)</span>
</span><span class='line'>    <span class="k">end</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">if</span> <span class="n">kind</span> <span class="o">!=</span> <span class="o">[</span><span class="s2">&quot;private&quot;</span><span class="o">]</span> <span class="o">&amp;&amp;</span> <span class="n">kind</span> <span class="o">!=</span> <span class="o">[</span><span class="s2">&quot;corporate&quot;</span><span class="o">]</span> <span class="o">&amp;&amp;</span>
</span><span class='line'>        <span class="n">kind</span> <span class="o">!=</span> <span class="sx">%w(private bundle)</span>
</span><span class='line'>      <span class="n">fail_with</span><span class="p">(</span><span class="s2">&quot;Order kind can not be empty&quot;</span><span class="p">)</span>
</span><span class='line'>    <span class="k">end</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'>
</span><span class='line'>  <span class="kp">private</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">def</span> <span class="nf">fail_with</span><span class="p">(</span><span class="n">message</span><span class="p">)</span>
</span><span class='line'>    <span class="k">raise</span> <span class="no">InvalidOrderError</span><span class="o">.</span><span class="n">new</span><span class="p">(</span><span class="n">message</span><span class="p">)</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>


<p>Let&rsquo;s write our next test for the same business rule (now a corporate bundle):</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="n">it_does_not_fail</span><span class="o">.</span><span class="n">when_order_kind_is</span> <span class="sx">%w(corporate bundle)</span>
</span></code></pre></td></tr></table></div></figure>


<p>And it fails with error: <code>expected no Exception, got #&lt;InvalidOrderError: Order kind can not be empty&gt;</code>. To fix this we need to add <code>&amp;&amp; kind != %w(corporate bundle)</code> to our last <code>if</code> condition again.</p>

<p>The code can be found in GitHub repository in <a href="https://github.com/waterlink/order_kind_validator/pull/1/files">an open pull request here</a>.</p>

<p>Now it seems that we have implemented all the business rules (we have all tests for them). Or did we?</p>

<h2>Bottom Line</h2>

<p>Buggy <code>if</code>-riddled code is what we&rsquo;ve got. We will see why in the next part of &ldquo;Getting Stuck While Doing TDD&rdquo; series. Stay tuned!</p>

<p>This is a series of articles:</p>

<ol>
<li>Part 1: Example (reading this)</li>
<li><a href="http://www.tddfellow.com/blog/2016/08/31/getting-stuck-while-doing-tdd-part-2-buggy-code-and-forcing-our-way-through/">Part 2: Buggy Code and Forcing Our Way Through</a></li>
<li><a href="http://www.tddfellow.com/blog/2016/08/31/getting-stuck-while-doing-tdd-part-3-triangulation-to-the-rescue/">Part 3: Triangulation to the Rescue!</a></li>
</ol>


<p>Today we have implemented our not-so-complex problem at hand while following 3 rules of TDD. The result was not of the best quality and we will take a look why in further articles of these series. You would not want to miss next articles on this tech blog, we still have a lot to talk about:</p>

<ul>
<li>Triangulation technique in Test-Driven Development - overlooking this technique might cause one fail at doing TDD (these series),</li>
<li>Continuous Integration and Continuous Delivery - importance of not impeding others,</li>
<li>Open-Closed Principle - changing behavior by adding new code,</li>
<li>Mutational Testing, &ldquo;Build Your Own Testing Framework&rdquo; series, Test-Driven Development screencasts and so much more!</li>
</ul>


<h2>Thanks!</h2>

<p>Thank you for reading, my dear reader. If you liked it, please share this article on social networks and follow me on twitter: <a href="https://twitter.com/tdd_fellow">@tdd_fellow</a>.</p>

<p>If you have any questions or feedback for me, don&rsquo;t hesitate to reach me out on Twitter: <a href="https://twitter.com/tdd_fellow">@tdd_fellow</a>.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Eliminating 'if' Statements: Legacy Endpoint Primer]]></title>
    <link href="http://www.tddfellow.com/blog/2016/08/20/eliminating-if-statements-legacy-endpoint-primer/"/>
    <updated>2016-08-20T11:59:37+02:00</updated>
    <id>http://www.tddfellow.com/blog/2016/08/20/eliminating-if-statements-legacy-endpoint-primer</id>
    <content type="html"><![CDATA[<p><code>if</code> statements tend to duplicate throughout the code base. This may lead to subtle mistakes and bugs. One way to avoid that problem is to eliminate <code>if</code> statement completely. Today we are going to take a look at one example of such elimination. Code examples today will be in Kotlin.</p>

<!--more-->


<h2>Problem at hand</h2>

<ul>
<li>Our API has an endpoint for issuing some sort of <code>verification token</code> given <code>device id</code> and <code>phone number</code> of the user&rsquo;s mobile device.</li>
<li>We need to integrate these <code>verification tokens</code> with 3rd party API.</li>
<li>The format of <code>verification token</code> is fairly standardized.</li>
<li>After initial research, it turned out that <code>issuer</code> field of <code>verification token</code> has to be URL of the API that has issued that token and 3rd party API in question validates this fact.</li>
<li>Currently, <code>issuer</code> field gets generated as <code>com.tddfellow</code>. According to this standard, it has to be <code>https://tddfellow.com</code>.</li>
<li>Additionally, we have to support old versions of mobile clients for next 6 months, that are validating <code>issuer</code> to be <code>com.tddfellow</code>, we can not change them as they are already installed on users&#8217; mobile devices.</li>
</ul>


<p>Solution: bump the version of our API from <code>v1</code> to <code>v2</code> and use <code>v1</code> for integration with old mobile clients and use <code>v2</code> for integration with 3rd party API and all new clients.</p>

<h2>Current Relevant Code</h2>

<p>Main program, containing routing information:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
</pre></td><td class='code'><pre><code class='kotlin'><span class='line'><span class="c1">// Main.kt</span>
</span><span class='line'>
</span><span class='line'><span class="k">fun</span> <span class="nf">main</span><span class="p">(</span><span class="n">args</span><span class="p">:</span> <span class="n">Array</span><span class="p">&lt;</span><span class="n">String</span><span class="p">&gt;)</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">val</span> <span class="py">secureTokenSource</span> <span class="p">=</span> <span class="n">SimpleSecureTokenSource</span><span class="p">()</span>
</span><span class='line'>    <span class="k">val</span> <span class="py">verificationTokenGateway</span> <span class="p">=</span> <span class="n">DummyVerificationTokenGateway</span><span class="p">()</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">val</span> <span class="py">issueVerificationTokenUseCase</span> <span class="p">=</span> <span class="n">UseCase</span><span class="p">(</span><span class="n">secureTokenSource</span><span class="p">,</span> <span class="n">verificationTokenGateway</span><span class="p">)</span>
</span><span class='line'>    <span class="k">val</span> <span class="py">issueVerificationTokenEndpoint</span> <span class="p">=</span> <span class="n">Endpoint</span><span class="p">(</span><span class="n">issueVerificationTokenUseCase</span><span class="p">)</span>
</span><span class='line'>
</span><span class='line'>    <span class="n">Spark</span><span class="p">.</span><span class="k">get</span><span class="p">(</span><span class="s">&quot;/api/v1/issueVerificationToken&quot;</span><span class="p">)</span> <span class="p">{</span> <span class="n">request</span><span class="p">,</span> <span class="n">response</span> <span class="p">-&gt;</span>
</span><span class='line'>        <span class="n">issueVerificationTokenEndpoint</span><span class="p">.</span><span class="n">issueVerificationToken</span><span class="p">(</span>
</span><span class='line'>                <span class="n">deviceId</span> <span class="p">=</span> <span class="n">request</span><span class="p">.</span><span class="n">queryParams</span><span class="p">(</span><span class="s">&quot;deviceId&quot;</span><span class="p">),</span>
</span><span class='line'>                <span class="n">phoneNumber</span> <span class="p">=</span> <span class="n">request</span><span class="p">.</span><span class="n">queryParams</span><span class="p">(</span><span class="s">&quot;phoneNumber&quot;</span><span class="p">)</span>
</span><span class='line'>        <span class="p">)</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>Endpoint that issues verification token:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
</pre></td><td class='code'><pre><code class='kotlin'><span class='line'><span class="c1">// ApiEndpoints/IssueVerificationToken/Endpoint.kt</span>
</span><span class='line'>
</span><span class='line'><span class="k">class</span> <span class="nc">Endpoint</span><span class="p">(</span><span class="k">private</span> <span class="k">val</span> <span class="py">useCase</span><span class="p">:</span> <span class="n">UseCase</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">fun</span> <span class="nf">issueVerificationToken</span><span class="p">(</span><span class="n">deviceId</span><span class="p">:</span> <span class="n">String</span><span class="p">,</span> <span class="n">phoneNumber</span><span class="p">:</span> <span class="n">String</span><span class="p">):</span> <span class="n">IssueVerificationTokenEndpointResponse</span> <span class="p">{</span>
</span><span class='line'>        <span class="k">val</span> <span class="py">issueVerificationToken</span> <span class="p">=</span> <span class="n">useCase</span><span class="p">.</span><span class="n">issueVerificationToken</span><span class="p">(</span><span class="n">deviceId</span><span class="p">,</span> <span class="n">phoneNumber</span><span class="p">)</span>
</span><span class='line'>
</span><span class='line'>        <span class="k">return</span> <span class="n">IssueVerificationTokenEndpointResponse</span><span class="p">(</span>
</span><span class='line'>                <span class="n">issuer</span> <span class="p">=</span> <span class="n">issueVerificationToken</span><span class="p">.</span><span class="n">issuer</span><span class="p">,</span>
</span><span class='line'>                <span class="n">token</span> <span class="p">=</span> <span class="n">issueVerificationToken</span><span class="p">.</span><span class="n">secureToken</span>
</span><span class='line'>        <span class="p">)</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>And the UseCase itself:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
</pre></td><td class='code'><pre><code class='kotlin'><span class='line'><span class="c1">// IssueVerificationToken/UseCase.kt</span>
</span><span class='line'>
</span><span class='line'><span class="k">open</span> <span class="k">class</span> <span class="nc">UseCase</span><span class="p">(</span><span class="k">private</span> <span class="k">val</span> <span class="py">secureTokenSource</span><span class="p">:</span> <span class="n">SecureTokenSource</span><span class="p">,</span>
</span><span class='line'>                   <span class="k">private</span> <span class="k">val</span> <span class="py">verificationTokenGateway</span><span class="p">:</span> <span class="n">VerificationTokenGateway</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">open</span> <span class="k">fun</span> <span class="nf">issueVerificationToken</span><span class="p">(</span><span class="n">deviceId</span><span class="p">:</span> <span class="n">String</span><span class="p">,</span> <span class="n">phoneNumber</span><span class="p">:</span> <span class="n">String</span><span class="p">):</span> <span class="n">VerificationToken</span> <span class="p">{</span>
</span><span class='line'>        <span class="k">val</span> <span class="py">verificationToken</span> <span class="p">=</span> <span class="n">VerificationToken</span><span class="p">(</span>
</span><span class='line'>                <span class="n">issuer</span> <span class="p">=</span> <span class="s">&quot;com.tddfellow&quot;</span><span class="p">,</span>
</span><span class='line'>                <span class="n">deviceId</span> <span class="p">=</span> <span class="n">deviceId</span><span class="p">,</span>
</span><span class='line'>                <span class="n">phoneNumber</span> <span class="p">=</span> <span class="n">phoneNumber</span><span class="p">,</span>
</span><span class='line'>                <span class="n">secureToken</span> <span class="p">=</span> <span class="n">secureTokenSource</span><span class="p">.</span><span class="n">generateToken</span><span class="p">()</span>
</span><span class='line'>        <span class="p">)</span>
</span><span class='line'>
</span><span class='line'>        <span class="n">verificationTokenGateway</span><span class="p">.</span><span class="n">persist</span><span class="p">(</span><span class="n">verificationToken</span><span class="p">)</span>
</span><span class='line'>        <span class="k">return</span> <span class="n">verificationToken</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>Code can be found <a href="https://github.com/waterlink/LegacyEndpointPrimer/">here</a>.</p>

<h2>Solution With Awkward <code>if</code> Statement</h2>

<p>Easiest solution using passed in <code>apiVersion</code> from the <code>Main</code> program and switch on it being old or new in the use case to determine which issuer to generate:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
</pre></td><td class='code'><pre><code class='kotlin'><span class='line'><span class="c1">// Main.kt</span>
</span><span class='line'>
</span><span class='line'><span class="n">Spark</span><span class="p">.</span><span class="k">get</span><span class="p">(</span><span class="s">&quot;/api/v1/issueVerificationToken&quot;</span><span class="p">)</span> <span class="p">{</span> <span class="n">request</span><span class="p">,</span> <span class="n">response</span> <span class="p">-&gt;</span>
</span><span class='line'>    <span class="n">issueVerificationTokenEndpoint</span><span class="p">.</span><span class="n">issueVerificationToken</span><span class="p">(</span>
</span><span class='line'>            <span class="n">deviceId</span> <span class="p">=</span> <span class="n">request</span><span class="p">.</span><span class="n">queryParams</span><span class="p">(</span><span class="s">&quot;deviceId&quot;</span><span class="p">),</span>
</span><span class='line'>            <span class="n">phoneNumber</span> <span class="p">=</span> <span class="n">request</span><span class="p">.</span><span class="n">queryParams</span><span class="p">(</span><span class="s">&quot;phoneNumber&quot;</span><span class="p">),</span>
</span><span class='line'>
</span><span class='line'>            <span class="c1">// here we are passing &quot;old&quot; version to the endpoint</span>
</span><span class='line'>            <span class="n">apiVersion</span> <span class="p">=</span> <span class="s">&quot;v1&quot;</span>
</span><span class='line'>    <span class="p">)</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="n">Spark</span><span class="p">.</span><span class="k">get</span><span class="p">(</span><span class="s">&quot;/api/v2/issueVerificationToken&quot;</span><span class="p">)</span> <span class="p">{</span> <span class="n">request</span><span class="p">,</span> <span class="n">response</span> <span class="p">-&gt;</span>
</span><span class='line'>    <span class="n">issueVerificationTokenEndpoint</span><span class="p">.</span><span class="n">issueVerificationToken</span><span class="p">(</span>
</span><span class='line'>            <span class="n">deviceId</span> <span class="p">=</span> <span class="n">request</span><span class="p">.</span><span class="n">queryParams</span><span class="p">(</span><span class="s">&quot;deviceId&quot;</span><span class="p">),</span>
</span><span class='line'>            <span class="n">phoneNumber</span> <span class="p">=</span> <span class="n">request</span><span class="p">.</span><span class="n">queryParams</span><span class="p">(</span><span class="s">&quot;phoneNumber&quot;</span><span class="p">),</span>
</span><span class='line'>
</span><span class='line'>            <span class="c1">// here we are passing &quot;new&quot; version to the endpoint</span>
</span><span class='line'>            <span class="n">apiVersion</span> <span class="p">=</span> <span class="s">&quot;v2&quot;</span>
</span><span class='line'>    <span class="p">)</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>And the endpoint just passes this value through to the use case:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
</pre></td><td class='code'><pre><code class='kotlin'><span class='line'><span class="c1">// ApiEndpoints/IssueVerificationToken/Endpoint.kt</span>
</span><span class='line'>
</span><span class='line'><span class="k">fun</span> <span class="nf">issueVerificationToken</span><span class="p">(</span><span class="n">deviceId</span><span class="p">:</span> <span class="n">String</span><span class="p">,</span>
</span><span class='line'>                           <span class="n">phoneNumber</span><span class="p">:</span> <span class="n">String</span><span class="p">,</span>
</span><span class='line'>                           <span class="n">apiVersion</span><span class="p">:</span> <span class="n">String</span><span class="p">):</span> <span class="n">IssueVerificationTokenEndpointResponse</span> <span class="p">{</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">val</span> <span class="py">issueVerificationToken</span> <span class="p">=</span> <span class="n">useCase</span><span class="p">.</span><span class="n">issueVerificationToken</span><span class="p">(</span>
</span><span class='line'>            <span class="n">deviceId</span> <span class="p">=</span> <span class="n">deviceId</span><span class="p">,</span>
</span><span class='line'>            <span class="n">phoneNumber</span> <span class="p">=</span> <span class="n">phoneNumber</span><span class="p">,</span>
</span><span class='line'>
</span><span class='line'>            <span class="c1">// here we are passing API version through</span>
</span><span class='line'>            <span class="n">apiVersion</span> <span class="p">=</span> <span class="n">apiVersion</span>
</span><span class='line'>    <span class="p">)</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">return</span> <span class="n">IssueVerificationTokenEndpointResponse</span><span class="p">(</span>
</span><span class='line'>            <span class="n">issuer</span> <span class="p">=</span> <span class="n">issueVerificationToken</span><span class="p">.</span><span class="n">issuer</span><span class="p">,</span>
</span><span class='line'>            <span class="n">token</span> <span class="p">=</span> <span class="n">issueVerificationToken</span><span class="p">.</span><span class="n">secureToken</span>
</span><span class='line'>    <span class="p">)</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>And finally the <code>if</code> statement in the use case:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
</pre></td><td class='code'><pre><code class='kotlin'><span class='line'><span class="c1">// IssueVerificationToken/UseCase.kt</span>
</span><span class='line'>
</span><span class='line'><span class="k">private</span> <span class="k">val</span> <span class="py">OLD_ISSUER</span> <span class="p">=</span> <span class="s">&quot;com.tddfellow&quot;</span>
</span><span class='line'><span class="k">private</span> <span class="k">val</span> <span class="py">NEW_ISSUER</span> <span class="p">=</span> <span class="s">&quot;https://tddfellow.com&quot;</span>
</span><span class='line'><span class="k">private</span> <span class="k">val</span> <span class="py">OLD_API_VERSION</span> <span class="p">=</span> <span class="s">&quot;v1&quot;</span>
</span><span class='line'>
</span><span class='line'><span class="k">fun</span> <span class="nf">issueVerificationToken</span><span class="p">(</span><span class="n">deviceId</span><span class="p">:</span> <span class="n">String</span><span class="p">,</span> <span class="n">phoneNumber</span><span class="p">:</span> <span class="n">String</span><span class="p">,</span> <span class="n">apiVersion</span><span class="p">:</span> <span class="n">String</span><span class="p">):</span> <span class="n">VerificationToken</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">val</span> <span class="py">verificationToken</span> <span class="p">=</span> <span class="n">VerificationToken</span><span class="p">(</span>
</span><span class='line'>            <span class="n">issuer</span> <span class="p">=</span> <span class="n">getIssuerFor</span><span class="p">(</span><span class="n">apiVersion</span><span class="p">),</span>
</span><span class='line'>            <span class="n">deviceId</span> <span class="p">=</span> <span class="n">deviceId</span><span class="p">,</span>
</span><span class='line'>            <span class="n">phoneNumber</span> <span class="p">=</span> <span class="n">phoneNumber</span><span class="p">,</span>
</span><span class='line'>            <span class="n">secureToken</span> <span class="p">=</span> <span class="n">secureTokenSource</span><span class="p">.</span><span class="n">generateToken</span><span class="p">()</span>
</span><span class='line'>    <span class="p">)</span>
</span><span class='line'>
</span><span class='line'>    <span class="n">verificationTokenGateway</span><span class="p">.</span><span class="n">persist</span><span class="p">(</span><span class="n">verificationToken</span><span class="p">)</span>
</span><span class='line'>    <span class="k">return</span> <span class="n">verificationToken</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="k">private</span> <span class="k">fun</span> <span class="nf">getIssuerFor</span><span class="p">(</span><span class="n">apiVersion</span><span class="p">:</span> <span class="n">String</span><span class="p">):</span> <span class="n">String</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">if</span> <span class="p">(</span><span class="n">apiVersion</span><span class="p">.</span><span class="n">equals</span><span class="p">(</span><span class="n">OLD_API_VERSION</span><span class="p">))</span> <span class="p">{</span>
</span><span class='line'>        <span class="k">return</span> <span class="n">OLD_ISSUER</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>    <span class="k">return</span> <span class="n">NEW_ISSUER</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>The full code change available <a href="https://github.com/waterlink/LegacyEndpointPrimer/pull/1">here (via open Pull Request)</a>.</p>

<p>This solution has quite a few problems:</p>

<ul>
<li><code>if</code> statement smells a bit</li>
<li>use case probably should not have any knowledge of <code>apiVersion</code>, since APIs is not our domain, it is just a delivery mechanism</li>
</ul>


<p>If we were to pass some object, like <code>TokenIssuer</code>, it would probably be more appropriate to have use case know of it. Let&rsquo;s try to refactor:</p>

<h2>Refactoring <code>if</code> Statement Using Polymorphism</h2>

<p>First, let&rsquo;s start passing in the token issuer in the routing:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
</pre></td><td class='code'><pre><code class='kotlin'><span class='line'><span class="c1">// Main.kt</span>
</span><span class='line'>
</span><span class='line'><span class="n">Spark</span><span class="p">.</span><span class="k">get</span><span class="p">(</span><span class="s">&quot;/api/v1/issueVerificationToken&quot;</span><span class="p">)</span> <span class="p">{</span> <span class="n">request</span><span class="p">,</span> <span class="n">response</span> <span class="p">-&gt;</span>
</span><span class='line'>    <span class="n">issueVerificationTokenEndpoint</span><span class="p">.</span><span class="n">issueVerificationToken</span><span class="p">(</span>
</span><span class='line'>            <span class="n">deviceId</span> <span class="p">=</span> <span class="n">request</span><span class="p">.</span><span class="n">queryParams</span><span class="p">(</span><span class="s">&quot;deviceId&quot;</span><span class="p">),</span>
</span><span class='line'>            <span class="n">phoneNumber</span> <span class="p">=</span> <span class="n">request</span><span class="p">.</span><span class="n">queryParams</span><span class="p">(</span><span class="s">&quot;phoneNumber&quot;</span><span class="p">),</span>
</span><span class='line'>
</span><span class='line'>            <span class="c1">// here we pass a specific object now for old token issuer:</span>
</span><span class='line'>            <span class="n">tokenIssuer</span> <span class="p">=</span> <span class="n">OldTokenIssuer</span><span class="p">()</span>
</span><span class='line'>    <span class="p">)</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="n">Spark</span><span class="p">.</span><span class="k">get</span><span class="p">(</span><span class="s">&quot;/api/v2/issueVerificationToken&quot;</span><span class="p">)</span> <span class="p">{</span> <span class="n">request</span><span class="p">,</span> <span class="n">response</span> <span class="p">-&gt;</span>
</span><span class='line'>    <span class="n">issueVerificationTokenEndpoint</span><span class="p">.</span><span class="n">issueVerificationToken</span><span class="p">(</span>
</span><span class='line'>            <span class="n">deviceId</span> <span class="p">=</span> <span class="n">request</span><span class="p">.</span><span class="n">queryParams</span><span class="p">(</span><span class="s">&quot;deviceId&quot;</span><span class="p">),</span>
</span><span class='line'>            <span class="n">phoneNumber</span> <span class="p">=</span> <span class="n">request</span><span class="p">.</span><span class="n">queryParams</span><span class="p">(</span><span class="s">&quot;phoneNumber&quot;</span><span class="p">),</span>
</span><span class='line'>
</span><span class='line'>            <span class="c1">// here we pass an object that returns URL according to the standard</span>
</span><span class='line'>            <span class="n">tokenIssuer</span> <span class="p">=</span> <span class="n">UrlTokenIssuer</span><span class="p">()</span>
</span><span class='line'>    <span class="p">)</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>And this is how <code>TokenIssuer</code> and its derivatives are looking like:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
</pre></td><td class='code'><pre><code class='kotlin'><span class='line'><span class="c1">// IssueVerificationToken/TokenIssuer.kt</span>
</span><span class='line'>
</span><span class='line'><span class="n">interface</span> <span class="n">TokenIssuer</span> <span class="p">{</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">fun</span> <span class="nf">getName</span><span class="p">():</span> <span class="n">String</span>
</span><span class='line'>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>




<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
</pre></td><td class='code'><pre><code class='kotlin'><span class='line'><span class="c1">// IssueVerificationToken/OldTokenIssuer.kt</span>
</span><span class='line'>
</span><span class='line'><span class="k">class</span> <span class="nc">OldTokenIssuer</span> <span class="p">:</span> <span class="n">TokenIssuer</span> <span class="p">{</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">override</span> <span class="k">fun</span> <span class="nf">getName</span><span class="p">()</span> <span class="p">=</span> <span class="s">&quot;com.tddfellow&quot;</span>
</span><span class='line'>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>




<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
</pre></td><td class='code'><pre><code class='kotlin'><span class='line'><span class="c1">// IssueVerificationToken/UrlTokenIssuer.kt</span>
</span><span class='line'>
</span><span class='line'><span class="k">class</span> <span class="nc">UrlTokenIssuer</span> <span class="p">:</span> <span class="n">TokenIssuer</span> <span class="p">{</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">override</span> <span class="k">fun</span> <span class="nf">getName</span><span class="p">()</span> <span class="p">=</span> <span class="s">&quot;https://tddfellow.com&quot;</span>
</span><span class='line'>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>As you might guess, endpoint just passes this object through to the use case. And the use case itself just calls <code>getName()</code> on it when generating issuer:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
</pre></td><td class='code'><pre><code class='kotlin'><span class='line'><span class="c1">// IssueVerificationToken/UseCase.kt</span>
</span><span class='line'>
</span><span class='line'><span class="k">fun</span> <span class="nf">issueVerificationToken</span><span class="p">(</span><span class="n">deviceId</span><span class="p">:</span> <span class="n">String</span><span class="p">,</span> <span class="n">phoneNumber</span><span class="p">:</span> <span class="n">String</span><span class="p">,</span> <span class="n">tokenIssuer</span><span class="p">:</span> <span class="n">TokenIssuer</span><span class="p">):</span> <span class="n">VerificationToken</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">val</span> <span class="py">verificationToken</span> <span class="p">=</span> <span class="n">VerificationToken</span><span class="p">(</span>
</span><span class='line'>
</span><span class='line'>            <span class="c1">// here is how much simpler it becomes</span>
</span><span class='line'>            <span class="n">issuer</span> <span class="p">=</span> <span class="n">tokenIssuer</span><span class="p">.</span><span class="n">getName</span><span class="p">(),</span>
</span><span class='line'>
</span><span class='line'>            <span class="n">deviceId</span> <span class="p">=</span> <span class="n">deviceId</span><span class="p">,</span>
</span><span class='line'>            <span class="n">phoneNumber</span> <span class="p">=</span> <span class="n">phoneNumber</span><span class="p">,</span>
</span><span class='line'>            <span class="n">secureToken</span> <span class="p">=</span> <span class="n">secureTokenSource</span><span class="p">.</span><span class="n">generateToken</span><span class="p">()</span>
</span><span class='line'>    <span class="p">)</span>
</span><span class='line'>
</span><span class='line'>    <span class="n">verificationTokenGateway</span><span class="p">.</span><span class="n">persist</span><span class="p">(</span><span class="n">verificationToken</span><span class="p">)</span>
</span><span class='line'>    <span class="k">return</span> <span class="n">verificationToken</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>Full code change can be seen <a href="https://github.com/waterlink/LegacyEndpointPrimer/pull/2">here (in the Pull Request)</a>.</p>

<h2>Bottom Line</h2>

<p>This code may be refactored further so that even <code>Endpoint</code> class will not have to know about <code>tokenIssuer</code> and pass it through. I will leave that as an exercise to you, my dear reader.</p>

<p>You would not want to miss next articles on this tech blog, we still have a lot to talk about:</p>

<ul>
<li>Continuous Integration and Continuous Delivery - importance of not impeding others,</li>
<li>Open-Closed Principle - changing behavior by adding new code,</li>
<li>Triangulation technique in Test-Driven Development - overlooking this technique might cause one fail at doing TDD,</li>
<li>Mutational Testing, &ldquo;Build Your Own Testing Framework&rdquo; series, Test-Driven Development screencasts and so much more!</li>
</ul>


<h2>Thanks!</h2>

<p>Thank you for reading, my dear reader. If you liked it, please share this article on social networks and follow me on twitter: <a href="https://twitter.com/tdd_fellow">@tdd_fellow</a>.</p>

<p>If you have any questions or feedback for me, don&rsquo;t hesitate to reach me out on Twitter: <a href="https://twitter.com/tdd_fellow">@tdd_fellow</a>.</p>
]]></content>
  </entry>
  
</feed>
