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

  <title><![CDATA[Caffeine-Powered Life]]></title>
  <link href="http://jarrettmeyer.com/atom.xml" rel="self"/>
  <link href="http://jarrettmeyer.com/"/>
  <updated>2015-04-22T09:17:16-04:00</updated>
  <id>http://jarrettmeyer.com/</id>
  <author>
    <name><![CDATA[Jarrett Meyer]]></name>
    <email><![CDATA[jarrettmeyer@gmail.com]]></email>
  </author>
  <generator uri="http://octopress.org/">Octopress</generator>

  
  <entry>
    <title type="html"><![CDATA[Getting into Docker]]></title>
    <link href="http://jarrettmeyer.com/blog/2015/04/22/getting-into-docker/"/>
    <updated>2015-04-22T08:00:00-04:00</updated>
    <id>http://jarrettmeyer.com/blog/2015/04/22/getting-into-docker</id>
    <content type="html"><![CDATA[<h2>What is this Docker thing, anyway?</h2>

<p>For the best answer, check out <a href="https://www.docker.com/whatisdocker/">What is Docker?</a> on Docker&rsquo;s web site. Briefly, Docker is a way to deliver applications. A container holds one or more applications. Docker provides a way to deploy, share, and update those containers. Docker containers are similar to virtual machines, in so far as they host an operating system. However, they rely solely on the host&rsquo;s RAM, CPU, and networking.</p>

<h2>Advantages of Docker vs. traditional deployment</h2>

<p><strong>You are not shipping code; you are shipping a binary.</strong> This binary is an image of the application. It is published to a Docker registry &mdash; either the public registry at <a href="https://registry.hub.docker.com/">Docker Hub</a> or an <a href="https://docs.docker.com/registry/">internal registry in your organization</a>. To get the latest version of a container, simply use <code>docker pull</code>.</p>

<p>Except for the Docker engine, <strong>you do not have to install anything on your production machines.</strong> You do not have to install web servers, databases, cache engines, scripting runtimes (like NodeJS, Python, or Ruby) or any of your production servers.</p>

<p><strong>Every application runs inside its own Docker container.</strong> You can have multiple versions of your application&rsquo;s toolset without version interference issues.</p>

<h2>Authoring a Client-Side Web Application</h2>

<p>Here is our application directory structure.</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'>my-app/
</span><span class='line'>  src/
</span><span class='line'>    scripts/
</span><span class='line'>      main.js
</span><span class='line'>    index.html</span></code></pre></td></tr></table></div></figure>


<p>The application itself lives under <code>/my-app/src</code>. In this app, we only have an <code>index.html</code> and a single JavaScript file. Deployment scripts are under <code>/my-app/deploy</code>.</p>

<p>Here is the <code>my-app/src/index.html</code> file.</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='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;title&gt;</span>Getting into Docker<span class="nt">&lt;/title&gt;</span>
</span><span class='line'>    <span class="nt">&lt;script </span><span class="na">type=</span><span class="s">&quot;text/javascript&quot;</span> <span class="na">src=</span><span class="s">&quot;https://code.jquery.com/jquery-2.1.3.min.js&quot;</span><span class="nt">&gt;&lt;/script&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 class="nt">&lt;h1&gt;</span>Hello World!<span class="nt">&lt;/h1&gt;</span>
</span><span class='line'>    <span class="nt">&lt;p&gt;</span>The current time is <span class="nt">&lt;span</span> <span class="na">id=</span><span class="s">&quot;timestamp&quot;</span><span class="nt">&gt;&lt;/span&gt;&lt;/p&gt;</span>
</span><span class='line'><span class="nt">&lt;/body&gt;</span>
</span><span class='line'><span class="nt">&lt;script </span><span class="na">type=</span><span class="s">&quot;text/javascript&quot;</span> <span class="na">src=</span><span class="s">&quot;/scripts/main.js&quot;</span><span class="nt">&gt;&lt;/script&gt;</span>
</span><span class='line'><span class="nt">&lt;/html&gt;</span>
</span></code></pre></td></tr></table></div></figure>


<p>Here is our <code>my-app/src/scripts/main.js</code> file.</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="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="kd">function</span> <span class="nx">updateTimestamp</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>        <span class="kd">var</span> <span class="nx">timestamp</span> <span class="o">=</span> <span class="p">(</span><span class="k">new</span> <span class="nb">Date</span><span class="p">()).</span><span class="nx">toLocaleString</span><span class="p">();</span>
</span><span class='line'>        <span class="nx">$</span><span class="p">(</span><span class="s1">&#39;#timestamp&#39;</span><span class="p">).</span><span class="nx">text</span><span class="p">(</span><span class="nx">timestamp</span><span class="p">);</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="nx">updateTimestamp</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>


<h2>Deploying our application</h2>

<p>First, let&rsquo;s start with the <a href="http://nginx.org/">nginx</a> Docker container. It is <a href="https://registry.hub.docker.com/u/library/nginx/">available in the public Docker registry</a>. This container is configured to forward requests from port 80 to <code>/usr/share/nginx/html</code>. (Port 443 is ready to go for SSL, as well, but we will not be using that in this demo.) To do this, we are going to add three new files to the <code>my-app/</code> directory.</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">my</span><span class="o">-</span><span class="nx">app</span><span class="o">/</span>
</span><span class='line'>  <span class="nx">build</span><span class="p">.</span><span class="nx">sh</span>
</span><span class='line'>  <span class="nx">Dockerfile</span>
</span><span class='line'>  <span class="nx">run</span><span class="p">.</span><span class="nx">sh</span>
</span></code></pre></td></tr></table></div></figure>


<p>Let&rsquo;s take a look at the <code>Dockerfile</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='javascript'><span class='line'><span class="nx">FROM</span> <span class="nx">nginx</span><span class="o">:</span><span class="mf">1.7</span><span class="p">.</span><span class="mi">12</span>
</span><span class='line'><span class="nx">COPY</span> <span class="p">.</span><span class="o">/</span><span class="nx">src</span> <span class="o">/</span><span class="nx">usr</span><span class="o">/</span><span class="nx">share</span><span class="o">/</span><span class="nx">nginx</span><span class="o">/</span><span class="nx">html</span>
</span></code></pre></td></tr></table></div></figure>


<p>There is nothing too difficult here. We are starting with the <code>nginx:1.7.12</code> image. To that image, we are going to copy the contents from the <code>src</code> directory to the <code>/usr/share/nginx/html</code> folder.</p>

<p>You might be tempted to move the <code>Dockerfile</code> to a build folder. <em>This will not work</em>. The <code>Dockerfile</code> must be in or above the the <code>src/</code> directory. This is because Docker sets us a context from the location of the <code>Dockerfile</code>, and it cannot access anything outside of that context.</p>

<p>Our build script will take care of this build process for us.</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='javascript'><span class='line'><span class="err">#</span><span class="o">!</span><span class="err">/usr/bin/env bash</span>
</span><span class='line'><span class="nx">sudo</span> <span class="nx">docker</span> <span class="nx">build</span> <span class="o">-</span><span class="nx">t</span> <span class="nx">my_app</span> <span class="p">.</span>
</span></code></pre></td></tr></table></div></figure>


<p>Build, using the <code>Dockerfile</code> located in the current directory. Additionally, tag (<code>-t</code>) this container as <code>my-app</code>. We can now see this Docker image on our server.</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">$</span> <span class="nx">sudo</span> <span class="nx">docker</span> <span class="nx">images</span>
</span><span class='line'><span class="nx">REPOSITORY</span>          <span class="nx">TAG</span>                 <span class="nx">IMAGE</span> <span class="nx">ID</span>            <span class="nx">CREATED</span>             <span class="nx">VIRTUAL</span> <span class="nx">SIZE</span>
</span><span class='line'><span class="nx">my_app</span>              <span class="nx">latest</span>              <span class="mi">04</span><span class="nx">caf9e7a04e</span>        <span class="mi">6</span> <span class="nx">minutes</span> <span class="nx">ago</span>       <span class="mf">93.44</span> <span class="nx">MB</span>
</span><span class='line'><span class="nx">nginx</span>               <span class="mf">1.7</span><span class="p">.</span><span class="mi">12</span>              <span class="mi">637</span><span class="nx">d3b2f5fb5</span>        <span class="mi">7</span> <span class="nx">days</span> <span class="nx">ago</span>          <span class="mf">93.44</span> <span class="nx">MB</span>
</span></code></pre></td></tr></table></div></figure>


<p>Finally, let&rsquo;s create a script to run our application.</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='javascript'><span class='line'><span class="err">#</span><span class="o">!</span><span class="err">/usr/bin/env bash</span>
</span><span class='line'><span class="nx">sudo</span> <span class="nx">docker</span> <span class="nx">run</span> <span class="o">--</span><span class="nx">name</span> <span class="nx">my_app_run</span> <span class="o">-</span><span class="nx">d</span> <span class="o">-</span><span class="nx">p</span> <span class="mi">8080</span><span class="o">:</span><span class="mi">80</span> <span class="nx">my_app</span>
</span></code></pre></td></tr></table></div></figure>


<p>Run the application in the background (<code>-d</code>), using the container named <code>my_app</code>. Forward requests on host port 8080 to container port 80. Also, name the running container to let us easily access it by name later (<code>--name my_app_run</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="nx">$</span> <span class="nx">sudo</span> <span class="nx">docker</span> <span class="nx">ps</span>
</span><span class='line'><span class="nx">CONTAINER</span> <span class="nx">ID</span>        <span class="nx">IMAGE</span>               <span class="nx">COMMAND</span>                <span class="nx">CREATED</span>             <span class="nx">STATUS</span>              <span class="nx">PORTS</span>                           <span class="nx">NAMES</span>
</span><span class='line'><span class="mi">9</span><span class="nx">f729419e7ca</span>        <span class="nx">my_app</span><span class="o">:</span><span class="nx">latest</span>       <span class="err">&quot;</span><span class="nx">nginx</span> <span class="o">-</span><span class="nx">g</span> <span class="err">&#39;</span><span class="nx">daemon</span> <span class="nx">of</span>   <span class="mi">4</span> <span class="nx">seconds</span> <span class="nx">ago</span>       <span class="nx">Up</span> <span class="mi">3</span> <span class="nx">seconds</span>        <span class="mi">443</span><span class="o">/</span><span class="nx">tcp</span><span class="p">,</span> <span class="mf">0.0</span><span class="p">.</span><span class="mf">0.0</span><span class="o">:</span><span class="mi">8080</span><span class="o">-&gt;</span><span class="mi">80</span><span class="o">/</span><span class="nx">tcp</span>   <span class="nx">my_app_run</span>
</span></code></pre></td></tr></table></div></figure>


<h2>Conclusion</h2>

<p>A copy of this source code is available <a href="https://github.com/jarrettmeyer/getting_into_docker">on Github</a>.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Reliable Database Fixtures with CouchDB]]></title>
    <link href="http://jarrettmeyer.com/blog/2015/02/23/reliable-database-fixtures-with-couchdb/"/>
    <updated>2015-02-23T07:35:18-05:00</updated>
    <id>http://jarrettmeyer.com/blog/2015/02/23/reliable-database-fixtures-with-couchdb</id>
    <content type="html"><![CDATA[<p>My latest project has me working with Apache&rsquo;s <a href="http://couchdb.apache.org">CouchDB</a>. We needed to solve the problem of how to create a working application when we have a dozen developers working around the globe. While CouchDB has no schema to worry about, we do require <a href="http://docs.couchdb.org/en/1.6.1/couchapp/ddocs.html">design documents</a> to produce queries.</p>

<p>These design documents are code, and the map-reduce functions are JavaScript. Like anything that is code, they need to be tracked, versioned, and part of the source. We have made each document it&rsquo;s own file. Each of these documents is stored in a <code>documents</code> folder.</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">// _design_all.js</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="p">{</span>
</span><span class='line'>    <span class="nx">_id</span><span class="o">:</span> <span class="s1">&#39;_design/all&#39;</span><span class="p">,</span>
</span><span class='line'>    <span class="nx">language</span><span class="o">:</span> <span class="s1">&#39;javascript&#39;</span><span class="p">,</span>
</span><span class='line'>    <span class="nx">views</span><span class="o">:</span> <span class="p">{</span>
</span><span class='line'>        <span class="nx">byType</span><span class="o">:</span> <span class="p">{</span>
</span><span class='line'>            <span class="nx">map</span><span class="o">:</span> <span class="kd">function</span> <span class="p">(</span><span class="nx">doc</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>                <span class="nx">emit</span><span class="p">(</span><span class="nx">doc</span><span class="p">.</span><span class="nx">type</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 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">// product_1000.js</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="p">{</span>
</span><span class='line'>    <span class="nx">_id</span><span class="o">:</span> <span class="s1">&#39;product_1000&#39;</span><span class="p">,</span>
</span><span class='line'>    <span class="nx">type</span><span class="o">:</span> <span class="s1">&#39;Product&#39;</span><span class="p">,</span>
</span><span class='line'>    <span class="nx">description</span><span class="o">:</span> <span class="s1">&#39;This is my super-cool product. You should definitely buy it!&#39;</span><span class="p">,</span>
</span><span class='line'>    <span class="nx">timestamp</span><span class="o">:</span> <span class="k">new</span> <span class="nb">Date</span><span class="p">().</span><span class="nx">toISOString</span><span class="p">()</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>There are a few catches to this setup. The biggest being that we need deterministic identifiers. We do have documents that relate to each other, and this only works well when we know the <code>_id</code> values of those documents.</p>

<p>To insert these documents, we use the Node library <a href="https://github.com/flatiron/cradle">Cradle</a>.</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>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="kd">var</span> <span class="nx">cradle</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;cradle&#39;</span><span class="p">);</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">fs</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;fs&#39;</span><span class="p">);</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">path</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;path&#39;</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'><span class="kd">var</span> <span class="nx">couchFiles</span> <span class="o">=</span> <span class="p">[];</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">db</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">cradle</span><span class="p">.</span><span class="nx">Connection</span><span class="p">({</span>
</span><span class='line'>    <span class="nx">host</span><span class="o">:</span> <span class="s1">&#39;http://localhost&#39;</span><span class="p">,</span>
</span><span class='line'>    <span class="nx">port</span><span class="o">:</span> <span class="mi">5984</span><span class="p">,</span>
</span><span class='line'>    <span class="nx">cache</span><span class="o">:</span> <span class="kc">false</span>
</span><span class='line'><span class="p">}).</span><span class="nx">database</span><span class="p">(</span><span class="s1">&#39;my_database&#39;</span><span class="p">);</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">folder</span> <span class="o">=</span> <span class="s1">&#39;./documents&#39;</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>
</span><span class='line'><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s1">&#39;Inserting CouchDB documents...&#39;</span><span class="p">);</span>
</span><span class='line'><span class="nx">fs</span><span class="p">.</span><span class="nx">readdir</span><span class="p">(</span><span class="nx">folder</span><span class="p">,</span> <span class="kd">function</span> <span class="p">(</span><span class="nx">error</span><span class="p">,</span> <span class="nx">files</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="p">{</span>
</span><span class='line'>        <span class="nx">console</span><span class="p">.</span><span class="nx">error</span><span class="p">(</span><span class="nx">error</span><span class="p">);</span>
</span><span class='line'>        <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="p">}</span>
</span><span class='line'>    <span class="nx">couchFiles</span> <span class="o">=</span> <span class="nx">couchFiles</span><span class="p">.</span><span class="nx">concat</span><span class="p">(</span><span class="nx">mapFiles</span><span class="p">(</span><span class="nx">files</span><span class="p">));</span>
</span><span class='line'>    <span class="nx">processNextCouchFile</span><span class="p">();</span>
</span><span class='line'><span class="p">});</span>
</span><span class='line'>
</span><span class='line'>
</span><span class='line'><span class="kd">function</span> <span class="nx">getNextFile</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">nextFile</span> <span class="o">=</span> <span class="nx">couchFiles</span><span class="p">.</span><span class="nx">shift</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">nextFile</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="s1">&#39;Done inserting CouchDB documents.&#39;</span><span class="p">);</span>
</span><span class='line'>        <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">0</span><span class="p">);</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>    <span class="k">return</span> <span class="nx">nextFile</span><span class="p">;</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'>
</span><span class='line'><span class="kd">function</span> <span class="nx">mapFiles</span><span class="p">(</span><span class="nx">files</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">return</span> <span class="nx">files</span><span class="p">.</span><span class="nx">filter</span><span class="p">(</span><span class="kd">function</span> <span class="p">(</span><span class="nx">file</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>        <span class="k">return</span> <span class="nx">path</span><span class="p">.</span><span class="nx">extname</span><span class="p">(</span><span class="nx">file</span><span class="p">).</span><span class="nx">toLowerCase</span><span class="p">()</span> <span class="o">===</span> <span class="s1">&#39;.js&#39;</span><span class="p">;</span>
</span><span class='line'>    <span class="p">}).</span><span class="nx">map</span><span class="p">(</span><span class="kd">function</span> <span class="p">(</span><span class="nx">file</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>        <span class="k">return</span> <span class="nx">path</span><span class="p">.</span><span class="nx">join</span><span class="p">(</span><span class="nx">__dirname</span><span class="p">,</span> <span class="nx">folder</span><span class="p">,</span> <span class="nx">file</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><span class='line'><span class="kd">function</span> <span class="nx">processNextCouchFile</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">nextFile</span> <span class="o">=</span> <span class="nx">getNextFile</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="s1">&#39;    Working with file: &#39;</span><span class="p">,</span> <span class="nx">nextFile</span><span class="p">);</span>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">doc</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="nx">nextFile</span><span class="p">);</span>
</span><span class='line'>    <span class="nx">db</span><span class="p">.</span><span class="nx">save</span><span class="p">(</span><span class="nx">doc</span><span class="p">,</span> <span class="kd">function</span> <span class="p">(</span><span class="nx">error</span><span class="p">,</span> <span class="nx">result</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="p">{</span>
</span><span class='line'>            <span class="nx">console</span><span class="p">.</span><span class="nx">error</span><span class="p">(</span><span class="nx">error</span><span class="p">);</span>
</span><span class='line'>            <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="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="s1">&#39;        Saved document:&#39;</span><span class="p">,</span> <span class="nx">result</span><span class="p">.</span><span class="nx">id</span><span class="p">);</span>
</span><span class='line'>        <span class="nx">processNextCouchFile</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>Before we run our integration tests, we wipe out the database, recreate the database, and run this script. Our tests can run against localhost, with hundreds of predefined documents, testing each of our views in a fraction of a second.</p>

<p>It&rsquo;s CouchDB. Relax!</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[JavaScript Getters, Setters, and Aliases with Object Prototypes]]></title>
    <link href="http://jarrettmeyer.com/blog/2015/01/06/javascript-getters-and-setters-with-object-prototypes/"/>
    <updated>2015-01-06T14:30:18-05:00</updated>
    <id>http://jarrettmeyer.com/blog/2015/01/06/javascript-getters-and-setters-with-object-prototypes</id>
    <content type="html"><![CDATA[<p>Happy 2015, everyone!</p>

<p>I&rsquo;m neck deep in a pile of JavaScript, and I am trying to create aliases. As it turns out, this is relatively easy to accomplish.</p>

<p>Let&rsquo;s look at a sample 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>
<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">MyClass</span> <span class="o">=</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="kd">function</span> <span class="nx">MyClass</span><span class="p">(</span><span class="nx">initialValue</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">value</span> <span class="o">=</span> <span class="o">+</span><span class="nx">initialValue</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><span class='line'><span class="p">})();</span>
</span></code></pre></td></tr></table></div></figure>


<p>Creating an instance and getting/setting <code>value</code> is quite simple. We can create a new instance of <code>MyClass</code> and simply access the value.</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">instance</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">MyClass</span><span class="p">();</span>
</span><span class='line'><span class="nx">instance</span><span class="p">.</span><span class="nx">value</span> <span class="o">=</span> <span class="mi">3</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="s1">&#39;value = &#39;</span> <span class="o">+</span> <span class="nx">instance</span><span class="p">.</span><span class="nx">value</span><span class="p">);</span> <span class="c1">// value = 3</span>
</span></code></pre></td></tr></table></div></figure>


<p>My problem was that I needed to create an alias. It turns out, this is pretty easy to do an object with <code>Object.defineProperty()</code>. I simply give it an object, the name of the getter/setter, and the appropriate functions.</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="nb">Object</span><span class="p">.</span><span class="nx">defineProperty</span><span class="p">(</span><span class="nx">instance</span><span class="p">,</span> <span class="s2">&quot;alias&quot;</span><span class="p">,</span> <span class="p">{</span>
</span><span class='line'>  <span class="nx">get</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">value</span><span class="p">;</span>
</span><span class='line'>  <span class="p">},</span>
</span><span class='line'>  <span class="nx">set</span><span class="o">:</span> <span class="kd">function</span> <span class="p">(</span><span class="nx">x</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">value</span> <span class="o">=</span> <span class="nx">x</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>I can now create change <code>value</code> and read <code>alias</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='javascript'><span class='line'><span class="nx">instance</span><span class="p">.</span><span class="nx">value</span> <span class="o">=</span> <span class="mi">4</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="s1">&#39;value = &#39;</span> <span class="o">+</span> <span class="nx">instance</span><span class="p">.</span><span class="nx">alias</span><span class="p">);</span> <span class="c1">// value = 4</span>
</span></code></pre></td></tr></table></div></figure>


<p>What if we wanted all instances of <code>MyClass</code> to share this alias? That takes just one small trick: instead of using <code>instance</code>, simply use <code>MyClass.prototype</code>. Applying the new property to the prototype means that all instances of that class will be created with the new getter and setter.</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">var</span> <span class="nx">MyClass</span> <span class="o">=</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="kd">function</span> <span class="nx">MyClass</span><span class="p">(</span><span class="nx">initialValue</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">value</span> <span class="o">=</span> <span class="o">+</span><span class="nx">initialValue</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><span class='line'>  <span class="nb">Object</span><span class="p">.</span><span class="nx">defineProperty</span><span class="p">(</span><span class="nx">MyClass</span><span class="p">.</span><span class="nx">prototype</span><span class="p">,</span> <span class="s2">&quot;alias&quot;</span><span class="p">,</span> <span class="p">{</span>
</span><span class='line'>    <span class="nx">get</span><span class="o">:</span> <span class="nx">getAlias</span><span class="p">,</span>
</span><span class='line'>    <span class="nx">set</span><span class="o">:</span> <span class="nx">setAlias</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">MyClass</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>  <span class="kd">function</span> <span class="nx">getAlias</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">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">setAlias</span><span class="p">(</span><span class="nx">x</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">value</span> <span class="o">=</span> <span class="nx">x</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></code></pre></td></tr></table></div></figure>


<p>Now, every new instance of <code>MyClass</code> will have both the <code>value</code> and <code>alias</code> 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>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="kd">var</span> <span class="nx">instance</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">MyClass</span><span class="p">(</span><span class="mi">5</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">instance</span><span class="p">.</span><span class="nx">value</span><span class="p">);</span> <span class="c1">// 5</span>
</span><span class='line'><span class="nx">instance</span><span class="p">.</span><span class="nx">alias</span> <span class="o">+=</span> <span class="mi">2</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">instance</span><span class="p">.</span><span class="nx">value</span><span class="p">);</span> <span class="c1">// 7</span>
</span><span class='line'><span class="nx">instance</span><span class="p">.</span><span class="nx">value</span> <span class="o">+=</span> <span class="mi">3</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">instance</span><span class="p">.</span><span class="nx">alias</span><span class="p">);</span> <span class="c1">// 10</span>
</span></code></pre></td></tr></table></div></figure>

]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Setting Up CouchDB on Ubuntu in Azure]]></title>
    <link href="http://jarrettmeyer.com/blog/2014/12/04/setting-up-couchdb-on-ubuntu-in-azure/"/>
    <updated>2014-12-04T09:28:42-05:00</updated>
    <id>http://jarrettmeyer.com/blog/2014/12/04/setting-up-couchdb-on-ubuntu-in-azure</id>
    <content type="html"><![CDATA[<ol>
<li><p>Create a new Ubuntu 14.04 LTS virtual machine.</p>

<p> <img class="center" src="http://jarrettmeyer.com/images/content/2014/12-dec/new_ubuntu_vm.png"></p></li>
<li><p>Add an endpoint for port 5984.</p>

<p> <img class="center" src="http://jarrettmeyer.com/images/content/2014/12-dec/new_endpoint_5984.png"></p></li>
<li><p>SSH to your newly created machine.</p></li>
<li><p>Update your new machine.</p>

<pre><code class="`"> $ sudo apt-get update
</code></pre></li>
<li><p>Install CouchDB.</p>

<pre><code class="`"> $ sudo apt-get install couchdb
</code></pre></li>
<li><p>Ensure that CouchDB is working.</p>

<pre><code class="`"> $ curl -X GET http://localhost:5984
 {"couchdb":"Welcome", "uuid":"80543311a1c6ed1de302adfc970a6d37", "version":"1.5.0", "vendor":{"name":"Ubuntu", "version":"14.04"}}
</code></pre></li>
<li><p>By default CouchDB gets installed and works only on <code>localhost</code>. We will need to edit CouchDB&rsquo;s configuration file to allow it to work on public ports.</p>

<pre><code class="`"> $ sudo vim /etc/couchdb/default.ini
</code></pre>

<p> Find the line that looks like <code>bind_address = 127.0.0.1</code>. Change that to <code>bind_address = 0.0.0.0</code>.</p></li>
<li><p>Restart CouchDB.</p>

<pre><code class="`"> $ sudo service couchdb restart
 couchdb stop/waiting
 couchdb start/running, process 1627
</code></pre></li>
</ol>


<p>Happy coding!</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Zero Inbox]]></title>
    <link href="http://jarrettmeyer.com/blog/2014/11/06/zero-inbox/"/>
    <updated>2014-11-06T16:20:16-05:00</updated>
    <id>http://jarrettmeyer.com/blog/2014/11/06/zero-inbox</id>
    <content type="html"><![CDATA[<p><img class="center" src="http://jarrettmeyer.com/images/content/2014/11-nov/zero-inbox.png"></p>

<p>I&rsquo;m not joking when I say &ldquo;zero inbox.&rdquo; <em>Note, this screen shot lasted for about
3 minutes before another email came in.</em></p>

<p>You have to work at it each and every day.</p>

<p>The rules are simple. Every time an email comes in, make the following decision.</p>

<ol>
<li>This email is junk. Delete it.</li>
<li>This email is informational. You read it once and are done with it. Delete it.
This includes useful things like, &ldquo;The build server will be taken offline for
two hours tonight so upgrades can be installed.&rdquo; That&rsquo;s nice to know. Next,
please.</li>
<li>This email is informational <strong>and relevant</strong>. Add some helpful tags to your
email. <strong>Do not use folders.</strong> Folders only work when only one thing applies.
But what if something is both a <code>Receipt</code> and belongs to <code>Client X</code>? It needs
two tags. Archive it.</li>
<li>Handle the stuff you can handle the moment it comes in. When you&rsquo;re done with
it, reply, tag it, and move it to Archive.</li>
<li>Anything that you can&rsquo;t handle gets put into the Follow Up folder. The Follow
Up folder is your main work queue. When you done with an item, move it to the
Archive.</li>
</ol>


<p>We all know that you have to make this decision with every piece of mail that you
receive. You can either choose to (a) make these decisions one time or (b) make
these decisions every time you open your Inbox and start sifting through your mail.
If you delay this decision process, then you are just creating a project for
yourself when it comes time to find that one important thing.</p>

<h3>But Jarrett, I still have too much email!</h3>

<p>If you&rsquo;re doing the above and still have too much email, then here are few other
things you need to look into.</p>

<ol>
<li>Email is not an instant chat client. At <a href="http://www.fusionalliance.com">Fusion Alliance</a>,
we use <a href="https://www.hipchat.com/">HipChat</a>. You can create groups and have
one-on-one chatrooms. It&rsquo;s wonderful.</li>
<li>Email in not a file sharing service. But tools like <a href="https://www.dropbox.com">Dropbox</a>,
<a href="https://www.btsync.com/">BTSync</a>, <a href="https://onedrive.live.com/">OneDrive</a>,
<a href="https://www.amazon.com/clouddrive/">Cloud Drive</a>,
<a href="http://products.office.com/en-us/sharepoint">SharePoint</a>, and many others are,
in fact, file sharing services. Create a folder to share with your clients,
project team, or whatever, and put all common documents there. Also, your network
administrators will thank you for getting rid of all those giant attachments.</li>
<li>Use those Unsubscribe links. Find yourself deleting the same junk over and over
again? Maybe take steps to slow the junk.</li>
<li>Use mail rules to your advantage. This can be especially helpful with automatically
adding those tags that we discussed earlier or deleting stuff that you know is
garbage.</li>
<li>Quit it! If you are drowning in email, then you are probably one of the most
unproductive, unreliable, unprepared employees at your job. If you say, &ldquo;I have
too much email to deal with,&rdquo; then someone like me hears, &ldquo;I spend all my time
switching context and jumping from one fire to the next.&rdquo; Seriously, this warrants
a discussion with the appropriate parties. No one can be effective under that
kind of stress. Sometimes, you&rsquo;ve got to stand up for you!</li>
</ol>


<p>I can do it, and so can you!</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Angular Part 5: Testing]]></title>
    <link href="http://jarrettmeyer.com/blog/2014/10/31/angular-part-5-testing/"/>
    <updated>2014-10-31T08:00:00-04:00</updated>
    <id>http://jarrettmeyer.com/blog/2014/10/31/angular-part-5-testing</id>
    <content type="html"><![CDATA[<p>Today is Halloween in the United States. As such, I think we should talk about something scary.</p>

<p><img class="center" src="http://jarrettmeyer.com/images/content/2014/10-oct/jack-o-lantern.jpg"></p>

<p>No, not lions and tigers and bears. Something that drives fear into the hearts of developers: <strong>unit testing</strong>.</p>

<p>Seriously, this is not that difficult. Part of learning any new programming language or framework includes learning how to test that language or framework. This is 2014. If automated unit and integration testing isn&rsquo;t a first-level design concern by now, <strong>you are doing it wrong</strong>. (I&rsquo;m looking at you Microsoft WebAPI.)</p>

<p><a href="https://www.angularjs.org/">Angular</a> makes writing unit tests incredibly easy. JavaScript is fragile enough as-is, so let&rsquo;s always test all of our <code>*.js</code> files. Quasi-futuristic languages like <a href="http://www.typescriptlang.org/">TypeScript</a> or <a href="https://docs.google.com/document/d/11YUzC-1d0V1-Q3V0fQ7KSit97HnZoKVygDxpWzEYW0U/preview?sle=true">AtScript</a> might offer us runtime type checking, but that is still <strong>runtime</strong> checking. That means to thoroughly test your application, you must run through all possible code routes.</p>

<h3>The tools</h3>

<p>This is the list of tools we will be using for this project.</p>

<ul>
<li><a href="https://docs.angularjs.org/api/ng">Angular 1.3.0</a></li>
<li><a href="https://docs.angularjs.org/api/ngMock">Angular-Mocks 1.3.0</a></li>
<li><a href="http://jasmine.github.io/2.0/introduction.html">Jasmine 2.0</a></li>
</ul>


<h3>The application (app.js)</h3>

<p>The application is very easy to define and test.</p>

<p>First we declare it.</p>

<figure class='code'><figcaption><span>app/app.js</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">angular</span><span class="p">.</span><span class="nx">module</span><span class="p">(</span><span class="s2">&quot;myApp&quot;</span><span class="p">,</span> <span class="p">[]);</span>
</span></code></pre></td></tr></table></div></figure>


<p>Then we make sure we can get it.</p>

<figure class='code'><figcaption><span>spec/appSpec.js</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">describe</span><span class="p">(</span><span class="s2">&quot;module: myApp&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;is defined&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">angular</span><span class="p">.</span><span class="nx">module</span><span class="p">(</span><span class="s2">&quot;myApp&quot;</span><span class="p">)).</span><span class="nx">toBeDefined</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></code></pre></td></tr></table></div></figure>


<h3>The point service (point.js)</h3>

<p>The <code>point</code> service is taken from our <a href="http://jarrettmeyer.com/blog/2014/10/30/angular-part-4-creating-a-service/">previous post</a>. It looked like this.</p>

<figure class='code'><figcaption><span>app/services/point.js</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="nx">app</span><span class="p">.</span><span class="nx">factory</span><span class="p">(</span><span class="s2">&quot;point&quot;</span><span class="p">,</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="k">return</span> <span class="kd">function</span> <span class="p">(</span><span class="nx">options</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>
</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><span class='line'>      <span class="kd">var</span> <span class="nx">self</span> <span class="o">=</span> <span class="p">{</span>
</span><span class='line'>        <span class="nx">x</span><span class="o">:</span> <span class="nx">options</span><span class="p">.</span><span class="nx">x</span> <span class="o">||</span> <span class="mi">0</span><span class="p">,</span>
</span><span class='line'>        <span class="nx">y</span><span class="o">:</span> <span class="nx">options</span><span class="p">.</span><span class="nx">y</span> <span class="o">||</span> <span class="mi">0</span>
</span><span class='line'>      <span class="p">};</span>
</span><span class='line'>
</span><span class='line'>      <span class="nx">self</span><span class="p">.</span><span class="nx">distanceTo</span> <span class="o">=</span> <span class="kd">function</span> <span class="p">(</span><span class="nx">other</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>        <span class="kd">var</span> <span class="nx">absXSq</span> <span class="o">=</span> <span class="nx">sqError</span><span class="p">(</span><span class="nx">self</span><span class="p">.</span><span class="nx">x</span><span class="p">,</span> <span class="nx">other</span><span class="p">.</span><span class="nx">x</span><span class="p">);</span>
</span><span class='line'>        <span class="kd">var</span> <span class="nx">absYSq</span> <span class="o">=</span> <span class="nx">sqError</span><span class="p">(</span><span class="nx">self</span><span class="p">.</span><span class="nx">y</span><span class="p">,</span> <span class="nx">other</span><span class="p">.</span><span class="nx">y</span><span class="p">);</span>
</span><span class='line'>        <span class="k">return</span> <span class="nb">Math</span><span class="p">.</span><span class="nx">sqrt</span><span class="p">(</span><span class="nx">absXSq</span> <span class="o">+</span> <span class="nx">absYSq</span><span class="p">);</span>
</span><span class='line'>      <span class="p">};</span>
</span><span class='line'>
</span><span class='line'>      <span class="nx">self</span><span class="p">.</span><span class="nx">toString</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;Point: { &quot;</span> <span class="o">+</span> <span class="nx">self</span><span class="p">.</span><span class="nx">x</span> <span class="o">+</span> <span class="s2">&quot;, &quot;</span> <span class="o">+</span> <span class="nx">self</span><span class="p">.</span><span class="nx">y</span> <span class="o">+</span> <span class="s2">&quot; }&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">sqError</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="nb">Math</span><span class="p">.</span><span class="nx">pow</span><span class="p">(</span><span class="nx">a</span> <span class="o">-</span> <span class="nx">b</span><span class="p">,</span> <span class="mi">2</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">self</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>The unit test below defines what our <code>point</code> service should be able to do.</p>

<figure class='code'><figcaption><span>spec/services/pointSpec.js</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="nx">describe</span><span class="p">(</span><span class="s2">&quot;service: point&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="kd">var</span> <span class="nx">point</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>  <span class="nx">beforeEach</span><span class="p">(</span><span class="nx">module</span><span class="p">(</span><span class="s2">&quot;myApp&quot;</span><span class="p">));</span>
</span><span class='line'>
</span><span class='line'>  <span class="nx">beforeEach</span><span class="p">(</span><span class="nx">inject</span><span class="p">(</span><span class="kd">function</span> <span class="p">(</span><span class="nx">_point_</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="nx">point</span> <span class="o">=</span> <span class="nx">_point_</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;can create a new point object representing the origin&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">pt</span> <span class="o">=</span> <span class="nx">point</span><span class="p">()</span>
</span><span class='line'>    <span class="nx">expect</span><span class="p">(</span><span class="nx">pt</span><span class="p">.</span><span class="nx">x</span><span class="p">).</span><span class="nx">toEqual</span><span class="p">(</span><span class="mi">0</span><span class="p">);</span>
</span><span class='line'>    <span class="nx">expect</span><span class="p">(</span><span class="nx">pt</span><span class="p">.</span><span class="nx">y</span><span class="p">).</span><span class="nx">toEqual</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><span class='line'>  <span class="nx">it</span><span class="p">(</span><span class="s2">&quot;can calculate the distance between two points&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">origin</span> <span class="o">=</span> <span class="nx">point</span><span class="p">();</span>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">pt</span> <span class="o">=</span> <span class="nx">point</span><span class="p">({</span> <span class="nx">x</span><span class="o">:</span> <span class="mi">3</span><span class="p">,</span> <span class="nx">y</span><span class="o">:</span> <span class="mi">4</span> <span class="p">});</span>
</span><span class='line'>    <span class="nx">expect</span><span class="p">(</span><span class="nx">pt</span><span class="p">.</span><span class="nx">distanceTo</span><span class="p">(</span><span class="nx">origin</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><span class='line'>  <span class="nx">it</span><span class="p">(</span><span class="s2">&quot;returns the expected value for toString()&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">point</span><span class="p">({</span> <span class="nx">x</span><span class="o">:</span> <span class="mi">1</span><span class="p">,</span> <span class="nx">y</span><span class="o">:</span> <span class="mi">2</span> <span class="p">}).</span><span class="nx">toString</span><span class="p">()).</span><span class="nx">toEqual</span><span class="p">(</span><span class="s2">&quot;Point: { 1, 2 }&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></code></pre></td></tr></table></div></figure>


<p>The parts to notice are the two <code>beforeEach()</code> functions. The first one loads the module. The second one sets up the service to be tested. The <code>_point_</code> is used by the injector to create the <code>point</code> instance.</p>

<p>Yes, it&rsquo;s a bit magical how the injector works. Basically, any <code>inject()</code> argument that starts with <code>$</code> is an Angular built-in, and any argument that looks like <code>_something_</code> is something you&rsquo;ve written. Beyond the injection magic, the tests are rather straightforward. We can create a new point, calculate the distance between two points, and test its string representation.</p>

<h3>The controller (PointCtrl.js)</h3>

<p>Our <code>PointCtrl</code> is quite small, especially since most of the work is being handled by the <code>point</code> service. <em>That was why we wrote the service in the first place.</em></p>

<figure class='code'><figcaption><span>app/controllers/PointCtrl.js</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">app</span><span class="p">.</span><span class="nx">controller</span><span class="p">(</span><span class="s2">&quot;PointCtrl&quot;</span><span class="p">,</span> <span class="p">[</span>
</span><span class='line'>  <span class="s2">&quot;$scope&quot;</span><span class="p">,</span>
</span><span class='line'>  <span class="s2">&quot;point&quot;</span><span class="p">,</span>
</span><span class='line'>  <span class="kd">function</span> <span class="p">(</span><span class="nx">$scope</span><span class="p">,</span> <span class="nx">point</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>
</span><span class='line'>    <span class="nx">$scope</span><span class="p">.</span><span class="nx">point1</span> <span class="o">=</span> <span class="nx">point</span><span class="p">();</span>
</span><span class='line'>    <span class="nx">$scope</span><span class="p">.</span><span class="nx">point2</span> <span class="o">=</span> <span class="nx">point</span><span class="p">();</span>
</span><span class='line'>
</span><span class='line'>    <span class="nx">$scope</span><span class="p">.</span><span class="nx">getDistance</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">$scope</span><span class="p">.</span><span class="nx">point1</span><span class="p">.</span><span class="nx">distanceTo</span><span class="p">(</span><span class="nx">$scope</span><span class="p">.</span><span class="nx">point2</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">$scope</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>The test for the controller is similarly simple, once you figure out the test setup steps.</p>

<figure class='code'><figcaption><span>spec/controllers/PointCtrlSpec.js</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="nx">describe</span><span class="p">(</span><span class="s2">&quot;controller: PointCtrl&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="kd">var</span> <span class="nx">ctrl</span><span class="p">,</span> <span class="nx">distance</span><span class="p">,</span> <span class="nx">point</span><span class="p">,</span> <span class="nx">scope</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>  <span class="nx">beforeEach</span><span class="p">(</span><span class="nx">module</span><span class="p">(</span><span class="s2">&quot;myApp&quot;</span><span class="p">));</span>
</span><span class='line'>
</span><span class='line'>  <span class="nx">beforeEach</span><span class="p">(</span><span class="nx">inject</span><span class="p">(</span><span class="kd">function</span> <span class="p">(</span><span class="nx">$controller</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="nx">createMockPoint</span><span class="p">();</span>
</span><span class='line'>    <span class="nx">createController</span><span class="p">(</span><span class="nx">$controller</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;assigns point1 and point2&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">scope</span><span class="p">.</span><span class="nx">point1</span><span class="p">).</span><span class="nx">toBeDefined</span><span class="p">();</span>
</span><span class='line'>    <span class="nx">expect</span><span class="p">(</span><span class="nx">scope</span><span class="p">.</span><span class="nx">point2</span><span class="p">).</span><span class="nx">toBeDefined</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;returns the expected value for getDistance()&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">scope</span><span class="p">.</span><span class="nx">getDistance</span><span class="p">()).</span><span class="nx">toEqual</span><span class="p">(</span><span class="nx">distance</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">createController</span><span class="p">(</span><span class="nx">$controller</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="nx">scope</span> <span class="o">=</span> <span class="p">{};</span>
</span><span class='line'>    <span class="nx">ctrl</span> <span class="o">=</span> <span class="nx">$controller</span><span class="p">(</span><span class="s2">&quot;PointCtrl&quot;</span><span class="p">,</span> <span class="p">{</span>
</span><span class='line'>      <span class="s2">&quot;$scope&quot;</span><span class="o">:</span> <span class="nx">scope</span><span class="p">,</span>
</span><span class='line'>      <span class="s2">&quot;point&quot;</span><span class="o">:</span> <span class="nx">point</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">createMockPoint</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>    <span class="nx">distance</span> <span class="o">=</span> <span class="nb">Math</span><span class="p">.</span><span class="nx">random</span><span class="p">()</span> <span class="o">*</span> <span class="mi">100</span><span class="p">;</span>
</span><span class='line'>    <span class="nx">point</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="p">{</span>
</span><span class='line'>        <span class="nx">distanceTo</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">distance</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="p">});</span>
</span></code></pre></td></tr></table></div></figure>


<p>Again, the trick to these tests is understanding the <code>beforeEach()</code> functions. The first one loads the module. The second loads the <code>$controller</code> factory.</p>

<p>You will notice that we create a mock <code>point</code> object and a mock <code>$scope</code> object. I have discussed <a href="http://jarrettmeyer.com/blog/2014/07/18/mocking-a-javascript-constructor">mocking JavaScript objects before</a>, and I follow the same pattern here. Since there is no type system in JavaScript, we only care that the object we create has the same functions and properties as what we use.</p>

<p>How much of a mock do you need? You need as much of the object surface area as the controller has access. For <code>$scope</code>, an object literal (<code>{}</code>) will do, and there is no reason for anything more complicated than this.</p>

<p>The <code>point</code> object is a little more complicated. First, it needs to be a function, so we can call <code>point()</code>. Second, the controller needs access to the <code>distanceTo()</code> function. We will create a stub for this function and return a random value between 0 and 100.</p>

<h3>The final result</h3>

<p>Running all of tests in the browser, we should see the following.</p>

<iframe style="width: 100%; height: 400px" frameborder="0" seamless="seamless" src="http://embed.plnkr.co/l5d9R3i8qgA53y3wVDQV/preview"></iframe>


<h3>The complete series</h3>

<ul>
<li><a href="http://jarrettmeyer.com/blog/2014/10/24/angular-part-1-show-and-hide/">Part 1: Show and Hide</a></li>
<li><a href="http://jarrettmeyer.com/blog/2014/10/28/angular-part-2-moving-to-a-controller/">Part 2: Moving to a Controller</a></li>
<li><a href="http://jarrettmeyer.com/blog/2014/10/29/angular-part-3-dependency-injection/">Part 3: Dependency Injection</a></li>
<li><a href="http://jarrettmeyer.com/blog/2014/10/30/angular-part-4-creating-a-service/">Part 4: Creating a Service</a></li>
<li><a href="http://jarrettmeyer.com/blog/2014/10/31/angular-part-5-testing/">Part 5: Testing</a></li>
</ul>

]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Angular Part 4: Creating a Service]]></title>
    <link href="http://jarrettmeyer.com/blog/2014/10/30/angular-part-4-creating-a-service/"/>
    <updated>2014-10-30T10:24:06-04:00</updated>
    <id>http://jarrettmeyer.com/blog/2014/10/30/angular-part-4-creating-a-service</id>
    <content type="html"><![CDATA[<p>Our last project <a href="http://jarrettmeyer.com/blog/2014/10/29/angular-part-3-dependency-injection/">covered dependency injection</a> in an Angular application. Now, let&rsquo;s show how a service works.</p>

<p>An <a href="https://docs.angularjs.org/guide/services">Angular service</a> is a way to encapsulate business logic so that it can be consumed by controllers and other services. Like any well-written program, functionality that goes together should be put together in small, reusable, testable components. <em>Speaking of testing, that&rsquo;s going to be the next post, so stay tuned.</em></p>

<h3>Demonstration of application</h3>

<p>The application should work similar to the following example.</p>

<iframe style="width: 100%; height: 300px" frameborder="0" seamless="seamless" src="http://embed.plnkr.co/yn07xm5gSpqWAhIJOtap/preview"></iframe>


<h3>Our new service</h3>

<p>We will encapsulate the point object into an Angular service. This service will be called &ldquo;point&rdquo;, and it will have no dependencies. You will notice that this block of code looks almost identical to the <code>point()</code> function from our previous post.</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="nx">angular</span><span class="p">.</span><span class="nx">module</span><span class="p">(</span><span class="s2">&quot;myApp&quot;</span><span class="p">).</span><span class="nx">factory</span><span class="p">(</span><span class="s2">&quot;point&quot;</span><span class="p">,</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="k">return</span> <span class="kd">function</span> <span class="p">(</span><span class="nx">options</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>      <span class="kd">var</span> <span class="nx">self</span> <span class="o">=</span> <span class="p">{</span>
</span><span class='line'>        <span class="nx">x</span><span class="o">:</span> <span class="nx">options</span><span class="p">.</span><span class="nx">x</span><span class="p">,</span>
</span><span class='line'>        <span class="nx">y</span><span class="o">:</span> <span class="nx">options</span><span class="p">.</span><span class="nx">y</span>
</span><span class='line'>      <span class="p">};</span>
</span><span class='line'>      <span class="nx">self</span><span class="p">.</span><span class="nx">distanceTo</span> <span class="o">=</span> <span class="kd">function</span> <span class="p">(</span><span class="nx">other</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>        <span class="kd">var</span> <span class="nx">absXSq</span> <span class="o">=</span> <span class="nx">sqError</span><span class="p">(</span><span class="nx">self</span><span class="p">.</span><span class="nx">x</span><span class="p">,</span> <span class="nx">other</span><span class="p">.</span><span class="nx">x</span><span class="p">);</span>
</span><span class='line'>        <span class="kd">var</span> <span class="nx">absYSq</span> <span class="o">=</span> <span class="nx">sqError</span><span class="p">(</span><span class="nx">self</span><span class="p">.</span><span class="nx">y</span><span class="p">,</span> <span class="nx">other</span><span class="p">.</span><span class="nx">y</span><span class="p">);</span>
</span><span class='line'>        <span class="k">return</span> <span class="nb">Math</span><span class="p">.</span><span class="nx">sqrt</span><span class="p">(</span><span class="nx">absXSq</span> <span class="o">+</span> <span class="nx">absYSq</span><span class="p">);</span>
</span><span class='line'>      <span class="p">};</span>
</span><span class='line'>      <span class="nx">self</span><span class="p">.</span><span class="nx">toString</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;{ &quot;</span> <span class="o">+</span> <span class="nx">self</span><span class="p">.</span><span class="nx">x</span> <span class="o">+</span> <span class="s2">&quot;, &quot;</span> <span class="o">+</span> <span class="nx">self</span><span class="p">.</span><span class="nx">y</span> <span class="o">+</span> <span class="s2">&quot; }&quot;</span><span class="p">;</span>
</span><span class='line'>      <span class="p">};</span>
</span><span class='line'>      <span class="kd">function</span> <span class="nx">sqError</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="nb">Math</span><span class="p">.</span><span class="nx">pow</span><span class="p">(</span><span class="nx">a</span> <span class="o">-</span> <span class="nx">b</span><span class="p">,</span> <span class="mi">2</span><span class="p">);</span>
</span><span class='line'>      <span class="p">}</span>
</span><span class='line'>      <span class="k">return</span> <span class="nx">self</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>By giving our service a unique name, we can now inject it into our controllers as needed.</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="nx">angular</span><span class="p">.</span><span class="nx">module</span><span class="p">(</span><span class="s2">&quot;myApp&quot;</span><span class="p">).</span><span class="nx">controller</span><span class="p">(</span><span class="s2">&quot;PointCtrl&quot;</span><span class="p">,</span> <span class="p">[</span>
</span><span class='line'>  <span class="s2">&quot;$scope&quot;</span><span class="p">,</span>
</span><span class='line'>  <span class="s2">&quot;point&quot;</span><span class="p">,</span>
</span><span class='line'>  <span class="kd">function</span> <span class="p">(</span><span class="nx">$scope</span><span class="p">,</span> <span class="nx">point</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="nx">$scope</span><span class="p">.</span><span class="nx">point1</span> <span class="o">=</span> <span class="nx">point</span><span class="p">({</span> <span class="nx">x</span><span class="o">:</span> <span class="mi">0</span><span class="p">,</span> <span class="nx">y</span><span class="o">:</span> <span class="mi">0</span> <span class="p">});</span>
</span><span class='line'>    <span class="nx">$scope</span><span class="p">.</span><span class="nx">point2</span> <span class="o">=</span> <span class="nx">point</span><span class="p">({</span> <span class="nx">x</span><span class="o">:</span> <span class="mi">0</span><span class="p">,</span> <span class="nx">y</span><span class="o">:</span> <span class="mi">0</span> <span class="p">});</span>
</span><span class='line'>    <span class="nx">$scope</span><span class="p">.</span><span class="nx">getDistance</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">$scope</span><span class="p">.</span><span class="nx">point1</span><span class="p">.</span><span class="nx">distanceTo</span><span class="p">(</span><span class="nx">$scope</span><span class="p">.</span><span class="nx">point2</span><span class="p">);</span>
</span><span class='line'>    <span class="p">};</span>
</span><span class='line'>    <span class="k">return</span> <span class="nx">$scope</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>Adding a service makes our controller much simpler than the previous post. Additionally, our <code>point</code> is now a focused, reusable block of code that can be used anywhere within our application.</p>

<p>It is important to note that all Angular services are lazy <a href="http://en.wikipedia.org/wiki/Singleton_pattern">singletons</a>. Specifically, they are only created when asked for, and only one instance of the function will ever be created. This is great for your application&rsquo;s memory profile.</p>

<h3>The complete series</h3>

<ul>
<li><a href="http://jarrettmeyer.com/blog/2014/10/24/angular-part-1-show-and-hide/">Part 1: Show and Hide</a></li>
<li><a href="http://jarrettmeyer.com/blog/2014/10/28/angular-part-2-moving-to-a-controller/">Part 2: Moving to a Controller</a></li>
<li><a href="http://jarrettmeyer.com/blog/2014/10/29/angular-part-3-dependency-injection/">Part 3: Dependency Injection</a></li>
<li><a href="http://jarrettmeyer.com/blog/2014/10/30/angular-part-4-creating-a-service/">Part 4: Creating a Service</a></li>
<li><a href="http://jarrettmeyer.com/blog/2014/10/31/angular-part-5-testing/">Part 5: Testing</a></li>
</ul>

]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Angular Part 3: Dependency Injection]]></title>
    <link href="http://jarrettmeyer.com/blog/2014/10/29/angular-part-3-dependency-injection/"/>
    <updated>2014-10-29T12:00:00-04:00</updated>
    <id>http://jarrettmeyer.com/blog/2014/10/29/angular-part-3-dependency-injection</id>
    <content type="html"><![CDATA[<p>In my <a href="http://jarrettmeyer.com/blog/2014/10/28/angular-part-2-moving-to-a-controller/">previous post</a>, I showed how a controller is built in Angular. The basic syntax for creating a controller looks like the following.</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">module</span><span class="p">.</span><span class="nx">controller</span><span class="p">(</span><span class="s2">&quot;MyCtrl&quot;</span><span class="p">,</span> <span class="p">[</span>
</span><span class='line'>  <span class="s2">&quot;$scope&quot;</span><span class="p">,</span>
</span><span class='line'>  <span class="kd">function</span> <span class="p">(</span><span class="nx">$scope</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">return</span> <span class="nx">$scope</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>This syntax for creating a JavaScript module is incredibly powerful. By letting Angular handle all of the dependencies, and by treating the scope as yet another object to be injected, the developer needn&rsquo;t ever worry about three of the most difficult concepts in JavaScript: specifically, closures, <code>new</code>, and <code>this</code>.</p>

<h3>The Traditional JavaScript Object</h3>

<p>For a refresher, here&rsquo;s the traditional way to create an object 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>
<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="kd">var</span> <span class="nx">Point</span> <span class="o">=</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="kd">function</span> <span class="nx">Point</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">this</span><span class="p">.</span><span class="nx">x</span> <span class="o">=</span> <span class="nx">options</span><span class="p">.</span><span class="nx">x</span><span class="p">;</span>
</span><span class='line'>    <span class="k">this</span><span class="p">.</span><span class="nx">y</span> <span class="o">=</span> <span class="nx">options</span><span class="p">.</span><span class="nx">y</span><span class="p">;</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>  <span class="nx">Point</span><span class="p">.</span><span class="nx">prototype</span><span class="p">.</span><span class="nx">distanceTo</span> <span class="o">=</span> <span class="kd">function</span> <span class="p">(</span><span class="nx">otherPoint</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">absXSq</span> <span class="o">=</span> <span class="nb">Math</span><span class="p">.</span><span class="nx">pow</span><span class="p">(</span><span class="k">this</span><span class="p">.</span><span class="nx">x</span> <span class="o">-</span> <span class="nx">otherPoint</span><span class="p">.</span><span class="nx">x</span><span class="p">,</span> <span class="mi">2</span><span class="p">);</span>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">absYSq</span> <span class="o">=</span> <span class="nb">Math</span><span class="p">.</span><span class="nx">pow</span><span class="p">(</span><span class="k">this</span><span class="p">.</span><span class="nx">y</span> <span class="o">-</span> <span class="nx">otherPoint</span><span class="p">.</span><span class="nx">y</span><span class="p">,</span> <span class="mi">2</span><span class="p">);</span>
</span><span class='line'>    <span class="k">return</span> <span class="nb">Math</span><span class="p">.</span><span class="nx">sqrt</span><span class="p">(</span><span class="nx">absXSq</span> <span class="o">+</span> <span class="nx">absYSq</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">Point</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>We create a new point in the following manner.</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="kd">var</span> <span class="nx">origin</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">Point</span><span class="p">({</span> <span class="nx">x</span><span class="o">:</span> <span class="mi">0</span><span class="p">,</span> <span class="nx">y</span><span class="o">:</span> <span class="mi">0</span> <span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>


<p>In the above class, <code>this</code> is always the functional enclosure that defines the class. This means that <code>this</code> acts the same as we would expect it in C# or Java. However, it wouldn&rsquo;t take much, just a simple callback, to change the result. Imagine a more complex function that needs to be non-blocking.</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">Point</span><span class="p">.</span><span class="nx">prototype</span><span class="p">.</span><span class="nx">distanceTo</span> <span class="o">=</span> <span class="kd">function</span> <span class="p">(</span><span class="nx">otherPoint</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>  <span class="k">return</span> <span class="nx">setTimeout</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">// Here, any reference to this.x or this.y will cause your</span>
</span><span class='line'>    <span class="c1">// program to fail. Inside the setTimeout callback, this</span>
</span><span class='line'>    <span class="c1">// refers to the global scope.</span>
</span><span class='line'>  <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>Yes, there are ways to get around the above, specifically by learning how <code>bind(this)</code> works, but, in my experience, this is a place where many developers tend to not know what they are doing. <em>Unfortunately, too many JavaScript &ldquo;developers&rdquo; are frequently C# or Java developers who have been asked to add functionality to a web site. They then write mediocre, fragile JavaScript.</em></p>

<h3>An Alternate JavaScript Object</h3>

<p>Instead, let&rsquo;s examine an alternate way to writing our <code>Point</code> class. In this example, we are creating an object literal and attaching functions to this new 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>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="kd">function</span> <span class="nx">point</span><span class="p">(</span><span class="nx">options</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>
</span><span class='line'>  <span class="nx">self</span> <span class="o">=</span> <span class="p">{</span>
</span><span class='line'>    <span class="nx">x</span><span class="o">:</span> <span class="nx">options</span><span class="p">.</span><span class="nx">x</span><span class="p">,</span>
</span><span class='line'>    <span class="nx">y</span><span class="o">:</span> <span class="nx">options</span><span class="p">.</span><span class="nx">y</span>
</span><span class='line'>  <span class="p">};</span>
</span><span class='line'>
</span><span class='line'>  <span class="nx">self</span><span class="p">.</span><span class="nx">distanceTo</span> <span class="o">=</span> <span class="kd">function</span> <span class="p">(</span><span class="nx">otherPoint</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">absXSq</span> <span class="o">=</span> <span class="nb">Math</span><span class="p">.</span><span class="nx">pow</span><span class="p">(</span><span class="nx">self</span><span class="p">.</span><span class="nx">x</span> <span class="o">-</span> <span class="nx">otherPoint</span><span class="p">.</span><span class="nx">x</span><span class="p">,</span> <span class="mi">2</span><span class="p">);</span>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">absYSq</span> <span class="o">=</span> <span class="nb">Math</span><span class="p">.</span><span class="nx">pow</span><span class="p">(</span><span class="nx">self</span><span class="p">.</span><span class="nx">y</span> <span class="o">-</span> <span class="nx">otherPoint</span><span class="p">.</span><span class="nx">y</span><span class="p">,</span> <span class="mi">2</span><span class="p">);</span>
</span><span class='line'>    <span class="k">return</span> <span class="nb">Math</span><span class="p">.</span><span class="nx">sqrt</span><span class="p">(</span><span class="nx">absXSq</span> <span class="o">+</span> <span class="nx">absYSq</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">self</span><span class="p">;</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>No longer do we have to worry about immediate functions, the <code>(function () {})()</code> syntax, <code>this</code>, or even creating a <code>new</code> object. To create a new point in this manner, we simply do the following.</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="kd">var</span> <span class="nx">origin</span> <span class="o">=</span> <span class="nx">point</span><span class="p">({</span> <span class="nx">x</span><span class="o">:</span> <span class="mi">0</span><span class="p">,</span> <span class="nx">y</span><span class="o">:</span> <span class="mi">0</span> <span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>


<h3>Angular Objects</h3>

<p>Angular gets around of all of <code>this</code> (Ha! Ha! Puns!) by injecting the scope object. Anything you wish to expose gets attached to the scope object. Also, the developer never needs to create <code>new</code> objects. The Angular framework does all of that work for you.</p>

<p>Let&rsquo;s create a simple form for displaying the distance between two points.</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='html'><span class='line'><span class="nt">&lt;body</span> <span class="na">ng-app=</span><span class="s">&quot;myApp&quot;</span><span class="nt">&gt;</span>
</span><span class='line'>
</span><span class='line'>  <span class="nt">&lt;div</span> <span class="na">ng-controller=</span><span class="s">&quot;PointCtrl&quot;</span><span class="nt">&gt;</span>
</span><span class='line'>    <span class="nt">&lt;p&gt;</span>
</span><span class='line'>      <span class="nt">&lt;label&gt;</span>x1<span class="nt">&lt;/label&gt;</span>
</span><span class='line'>      <span class="nt">&lt;input</span> <span class="na">type=</span><span class="s">&quot;number&quot;</span> <span class="na">ng-model=</span><span class="s">&quot;x1&quot;</span><span class="nt">/&gt;</span>
</span><span class='line'>      <span class="nt">&lt;label&gt;</span>y1<span class="nt">&lt;/label&gt;</span>
</span><span class='line'>      <span class="nt">&lt;input</span> <span class="na">type=</span><span class="s">&quot;number&quot;</span> <span class="na">ng-model=</span><span class="s">&quot;y1&quot;</span><span class="nt">/&gt;</span>
</span><span class='line'>    <span class="nt">&lt;/p&gt;</span>
</span><span class='line'>    <span class="nt">&lt;p&gt;</span>
</span><span class='line'>      <span class="nt">&lt;label&gt;</span>x2<span class="nt">&lt;/label&gt;</span>
</span><span class='line'>      <span class="nt">&lt;input</span> <span class="na">type=</span><span class="s">&quot;number&quot;</span> <span class="na">ng-model=</span><span class="s">&quot;x2&quot;</span><span class="nt">/&gt;</span>
</span><span class='line'>      <span class="nt">&lt;label&gt;</span>y2<span class="nt">&lt;/label&gt;</span>
</span><span class='line'>      <span class="nt">&lt;input</span> <span class="na">type=</span><span class="s">&quot;number&quot;</span> <span class="na">ng-model=</span><span class="s">&quot;y2&quot;</span><span class="nt">/&gt;</span>
</span><span class='line'>    <span class="nt">&lt;/p&gt;</span>
</span><span class='line'>    <span class="nt">&lt;p&gt;</span>
</span><span class='line'>      <span class="nt">&lt;label&gt;</span>Distance<span class="nt">&lt;/label&gt;</span>
</span><span class='line'>      <span class="nt">&lt;span</span> <span class="na">ng-bind=</span><span class="s">&quot;getDistance()&quot;</span><span class="nt">&gt;&lt;/span&gt;</span>
</span><span class='line'>    <span class="nt">&lt;/p&gt;</span>
</span><span class='line'>  <span class="nt">&lt;/div&gt;</span>
</span><span class='line'>
</span><span class='line'><span class="nt">&lt;/body&gt;</span>
</span></code></pre></td></tr></table></div></figure>


<p>Our controller will look something like the following.</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="nx">angular</span><span class="p">.</span><span class="nx">module</span><span class="p">(</span><span class="s2">&quot;myApp&quot;</span><span class="p">).</span><span class="nx">controller</span><span class="p">(</span><span class="s2">&quot;PointCtrl&quot;</span><span class="p">,</span> <span class="p">[</span>
</span><span class='line'>  <span class="s2">&quot;$scope&quot;</span><span class="p">,</span>
</span><span class='line'>  <span class="kd">function</span> <span class="p">(</span><span class="nx">$scope</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>
</span><span class='line'>    <span class="nx">$scope</span><span class="p">.</span><span class="nx">x1</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
</span><span class='line'>    <span class="nx">$scope</span><span class="p">.</span><span class="nx">x2</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
</span><span class='line'>    <span class="nx">$scope</span><span class="p">.</span><span class="nx">y1</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
</span><span class='line'>    <span class="nx">$scope</span><span class="p">.</span><span class="nx">y2</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>    <span class="kd">function</span> <span class="nx">squareError</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="nb">Math</span><span class="p">.</span><span class="nx">pow</span><span class="p">(</span><span class="nx">a</span> <span class="o">-</span> <span class="nx">b</span><span class="p">,</span> <span class="mi">2</span><span class="p">);</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="nx">$scope</span><span class="p">.</span><span class="nx">getDistance</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">absXSq</span> <span class="o">=</span> <span class="nx">squareError</span><span class="p">(</span><span class="nx">$scope</span><span class="p">.</span><span class="nx">x1</span><span class="p">,</span> <span class="nx">$scope</span><span class="p">.</span><span class="nx">x2</span><span class="p">);</span>
</span><span class='line'>      <span class="kd">var</span> <span class="nx">absYSq</span> <span class="o">=</span> <span class="nx">squareError</span><span class="p">(</span><span class="nx">$scope</span><span class="p">.</span><span class="nx">y1</span><span class="p">,</span> <span class="nx">$scope</span><span class="p">.</span><span class="nx">y2</span><span class="p">);</span>
</span><span class='line'>      <span class="k">return</span> <span class="nb">Math</span><span class="p">.</span><span class="nx">sqrt</span><span class="p">(</span><span class="nx">absXSq</span> <span class="o">+</span> <span class="nx">absYSq</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">$scope</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>Together, the above HTML and JavaScript should give us something like this.</p>

<iframe style="width: 100%; height: 300px" frameborder="0" seamless="seamless" src="http://embed.plnkr.co/NSkzVg6MkRwA4g5O7lRp/preview"></iframe>


<p>As mentioned previously, anything that gets attached to <code>$scope</code> is publicly accessible. The <code>squareError()</code> function is not available publicly. There is no binding trick that the developer can use to attach the function to any Angular directive.</p>

<p>Finally, let&rsquo;s look at the format of the controller definition.</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">module</span><span class="p">.</span><span class="nx">controller</span><span class="p">(</span><span class="nb">String</span><span class="p">,</span> <span class="nb">Array</span><span class="p">);</span>
</span></code></pre></td></tr></table></div></figure>


<p>The <code>String</code> is the name of the controller. The <code>Array</code> is the names of the dependencies with the last element of the array being the definition of the controller. Dependencies that start with a <code>$</code> are built-ins for Angular &mdash; <a href="https://docs.angularjs.org/api/ng/service">there are several</a>.</p>

<h3>Conclusion</h3>

<p>I recently watched <a href="https://www.youtube.com/watch?v=bo36MrBfTk4">Douglas Crockford talk about writing JavaScript</a> without using <code>new</code> or <code>this</code>. At first I was quite taken aback. How the hell am I supposed to write JS without objects? As you can see, we can still create plenty of objects, those objects have attributes, attach functions to those objects, and even have private function encapsulation without ever using <code>new</code> or <code>this</code>.</p>

<ul>
<li>Learn more about <a href="https://docs.angularjs.org/guide/scope">scope in Angular</a>.</li>
<li>Learn more about <a href="https://docs.angularjs.org/guide/services">services in Angular</a>.</li>
</ul>


<h3>The complete series</h3>

<ul>
<li><a href="http://jarrettmeyer.com/blog/2014/10/24/angular-part-1-show-and-hide/">Part 1: Show and Hide</a></li>
<li><a href="http://jarrettmeyer.com/blog/2014/10/28/angular-part-2-moving-to-a-controller/">Part 2: Moving to a Controller</a></li>
<li><a href="http://jarrettmeyer.com/blog/2014/10/29/angular-part-3-dependency-injection/">Part 3: Dependency Injection</a></li>
<li><a href="http://jarrettmeyer.com/blog/2014/10/30/angular-part-4-creating-a-service/">Part 4: Creating a Service</a></li>
<li><a href="http://jarrettmeyer.com/blog/2014/10/31/angular-part-5-testing/">Part 5: Testing</a></li>
</ul>

]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Angular Part 2: Moving to a Controller]]></title>
    <link href="http://jarrettmeyer.com/blog/2014/10/28/angular-part-2-moving-to-a-controller/"/>
    <updated>2014-10-28T08:00:00-04:00</updated>
    <id>http://jarrettmeyer.com/blog/2014/10/28/angular-part-2-moving-to-a-controller</id>
    <content type="html"><![CDATA[<p>In <a href="http://jarrettmeyer.com/blog/2014/10/24/angular-part-1-show-and-hide/">Part 1</a>, we showed how easy
it is to add functionality to a website with <a href="https://angularjs.org/">AngularJS</a>,
and compared that to how much work would be necessary to do the same thing using
<a href="https://jquery.com">jQuery</a> alone.</p>

<p>We did have a little bit of logic in our views, though, and that&rsquo;s not ideal. That
logic was testing for specific values for our form fields.</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">// Showing the form field</span>
</span><span class='line'><span class="nx">ng</span><span class="o">-</span><span class="nx">show</span><span class="o">=</span><span class="s2">&quot;favoriteColor === &#39;Other&#39;&quot;</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// Requiring the form field</span>
</span><span class='line'><span class="nx">ng</span><span class="o">-</span><span class="nx">require</span><span class="o">=</span><span class="s2">&quot;favoriteColor === &#39;Other&#39;&quot;</span>
</span></code></pre></td></tr></table></div></figure>


<p>In my opinion, even something as simple as a test for equality is view logic, and
we should do what we can to move that out of the view. Ideally, we want something
that looks more 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>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="c1">// Showing the form field</span>
</span><span class='line'><span class="nx">ng</span><span class="o">-</span><span class="nx">show</span><span class="o">=</span><span class="s2">&quot;showOtherField()&quot;</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// Requiring the form field</span>
</span><span class='line'><span class="nx">ng</span><span class="o">-</span><span class="nx">require</span><span class="o">=</span><span class="s2">&quot;requireOtherField()&quot;</span>
</span></code></pre></td></tr></table></div></figure>


<p>Moving that logic is not difficult. In Angular, this kind of thing is handled by
the <a href="https://docs.angularjs.org/guide/controller">controller</a>.</p>

<p>Before we can write a controller, we first need a module. Defining a module takes
the signature <code>angular.module(String, Array)</code>. The string is the name of the module,
and the array is the list of dependencies required by the module. Below, we define
a module named <code>myApp</code>, followed by an array of dependencies. In this case, we do
not have any dependencies, so we just have 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='javascript'><span class='line'><span class="k">if</span> <span class="p">(</span><span class="nb">window</span><span class="p">.</span><span class="nx">app</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>  <span class="k">throw</span> <span class="nb">Error</span><span class="p">(</span><span class="s2">&quot;window.app is already defined.&quot;</span><span class="p">);</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'><span class="nb">window</span><span class="p">.</span><span class="nx">app</span> <span class="o">=</span> <span class="nx">angular</span><span class="p">.</span><span class="nx">module</span><span class="p">(</span><span class="s2">&quot;myApp&quot;</span><span class="p">,</span> <span class="p">[]);</span>
</span></code></pre></td></tr></table></div></figure>


<p>Now that we&rsquo;ve defined our module, let&rsquo;s define our controller. We get our module
from the Angular registry and add a controller to it. Defining a controller takes
the signature <code>module.controller(String, Array)</code>.</p>

<p>The array is the list of dependencies followed by the definition of the controller.
Our controller does have a <code>$scope</code> dependencies. <code>$scope</code> is Angular&rsquo;s way of not
having to deal with JavaScript&rsquo;s <code>this</code> object. Anything that we want to expose,
we add to the <code>$scope</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>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="nx">angular</span><span class="p">.</span><span class="nx">module</span><span class="p">(</span><span class="s2">&quot;myApp&quot;</span><span class="p">)</span>
</span><span class='line'><span class="p">.</span><span class="nx">controller</span><span class="p">(</span><span class="s2">&quot;ColorFormCtrl&quot;</span><span class="p">,</span> <span class="p">[</span>
</span><span class='line'>  <span class="s2">&quot;$scope&quot;</span><span class="p">,</span>
</span><span class='line'>  <span class="kd">function</span> <span class="p">(</span><span class="nx">$scope</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>
</span><span class='line'>    <span class="cm">/**</span>
</span><span class='line'><span class="cm">     * Return true if the submit button should be disabled.</span>
</span><span class='line'><span class="cm">     */</span>
</span><span class='line'>    <span class="nx">$scope</span><span class="p">.</span><span class="nx">disableSubmit</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">$scope</span><span class="p">.</span><span class="nx">form</span><span class="p">.</span><span class="nx">$pristine</span> <span class="o">||</span> <span class="nx">$scope</span><span class="p">.</span><span class="nx">form</span><span class="p">.</span><span class="nx">$invalid</span><span class="p">;</span>
</span><span class='line'>    <span class="p">};</span>
</span><span class='line'>
</span><span class='line'>    <span class="cm">/**</span>
</span><span class='line'><span class="cm">     * Return true if the &quot;Other&quot; field is required.</span>
</span><span class='line'><span class="cm">     */</span>
</span><span class='line'>    <span class="nx">$scope</span><span class="p">.</span><span class="nx">requireOtherField</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">$scope</span><span class="p">.</span><span class="nx">favoriteColor</span> <span class="o">===</span> <span class="s2">&quot;Other&quot;</span><span class="p">;</span>
</span><span class='line'>    <span class="p">};</span>
</span><span class='line'>
</span><span class='line'>    <span class="cm">/**</span>
</span><span class='line'><span class="cm">     * Return true if the &quot;Other&quot; field should be displayed.</span>
</span><span class='line'><span class="cm">     */</span>
</span><span class='line'>    <span class="nx">$scope</span><span class="p">.</span><span class="nx">showOtherField</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">$scope</span><span class="p">.</span><span class="nx">favoriteColor</span> <span class="o">===</span> <span class="s2">&quot;Other&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">$scope</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>Let&rsquo;s take look at updated HTML.</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='html'><span class='line'><span class="nt">&lt;html</span> <span class="na">ng-app=</span><span class="s">&quot;myApp&quot;</span><span class="nt">&gt;</span>
</span><span class='line'><span class="nt">&lt;head</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;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>Angular Demo<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</span> <span class="na">ng-controller=</span><span class="s">&quot;ColorFormCtrl&quot;</span><span class="nt">&gt;</span>
</span><span class='line'><span class="nt">&lt;form</span> <span class="na">method=</span><span class="s">&quot;post&quot;</span> <span class="na">action=</span><span class="s">&quot;#&quot;</span> <span class="na">name=</span><span class="s">&quot;form&quot;</span><span class="nt">&gt;</span>
</span><span class='line'>  <span class="nt">&lt;div&gt;</span>
</span><span class='line'>    <span class="nt">&lt;label&gt;</span>What is your favorite color?<span class="nt">&lt;/label&gt;</span>
</span><span class='line'>    <span class="nt">&lt;select</span> <span class="na">name=</span><span class="s">&quot;favoriteColor&quot;</span> <span class="na">ng-model=</span><span class="s">&quot;favoriteColor&quot;</span> <span class="na">required=</span><span class="s">&quot;required&quot;</span><span class="nt">&gt;</span>
</span><span class='line'>      <span class="nt">&lt;option&gt;&lt;/option&gt;</span>
</span><span class='line'>      <span class="nt">&lt;option&gt;</span>Red<span class="nt">&lt;/option&gt;</span>
</span><span class='line'>      <span class="nt">&lt;option&gt;</span>Blue<span class="nt">&lt;/option&gt;</span>
</span><span class='line'>      <span class="nt">&lt;option&gt;</span>Other<span class="nt">&lt;/option&gt;</span>
</span><span class='line'>    <span class="nt">&lt;/select&gt;</span>
</span><span class='line'>  <span class="nt">&lt;/div&gt;</span>
</span><span class='line'>  <span class="nt">&lt;div</span> <span class="na">ng-show=</span><span class="s">&quot;showOtherField()&quot;</span><span class="nt">&gt;</span>
</span><span class='line'>    <span class="nt">&lt;label&gt;</span>Favorite color (other)<span class="nt">&lt;/label&gt;</span>
</span><span class='line'>    <span class="nt">&lt;input</span> <span class="na">type=</span><span class="s">&quot;text&quot;</span> <span class="na">name=</span><span class="s">&quot;favoriteColorOther&quot;</span> <span class="na">ng-model=</span><span class="s">&quot;favoriteColorOther&quot;</span> <span class="na">ng-required=</span><span class="s">&quot;requireOtherField()&quot;</span><span class="nt">/&gt;</span>
</span><span class='line'>  <span class="nt">&lt;/div&gt;</span>
</span><span class='line'>  <span class="nt">&lt;div&gt;</span>
</span><span class='line'>    <span class="nt">&lt;button</span> <span class="na">type=</span><span class="s">&quot;submit&quot;</span> <span class="na">ng-disabled=</span><span class="s">&quot;disableSubmit()&quot;</span><span class="nt">&gt;</span>
</span><span class='line'>      Submit
</span><span class='line'>    <span class="nt">&lt;/button&gt;</span>
</span><span class='line'>  <span class="nt">&lt;/div&gt;</span>
</span><span class='line'><span class="nt">&lt;/form&gt;</span>
</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>We added our module&rsquo;s name to the <code>ng-app="myApp"</code> directive. We added our controller
as part of the <code>ng-controller="ColorFormCtrl"</code> directive. We then moved all of our
page logic to a controller.</p>

<h3>The complete series</h3>

<ul>
<li><a href="http://jarrettmeyer.com/blog/2014/10/24/angular-part-1-show-and-hide/">Part 1: Show and Hide</a></li>
<li><a href="http://jarrettmeyer.com/blog/2014/10/28/angular-part-2-moving-to-a-controller/">Part 2: Moving to a Controller</a></li>
<li><a href="http://jarrettmeyer.com/blog/2014/10/29/angular-part-3-dependency-injection/">Part 3: Dependency Injection</a></li>
<li><a href="http://jarrettmeyer.com/blog/2014/10/30/angular-part-4-creating-a-service/">Part 4: Creating a Service</a></li>
<li><a href="http://jarrettmeyer.com/blog/2014/10/31/angular-part-5-testing/">Part 5: Testing</a></li>
</ul>

]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Angular Part 1: Show and Hide]]></title>
    <link href="http://jarrettmeyer.com/blog/2014/10/24/angular-part-1-show-and-hide/"/>
    <updated>2014-10-24T06:35:08-04:00</updated>
    <id>http://jarrettmeyer.com/blog/2014/10/24/angular-part-1-show-and-hide</id>
    <content type="html"><![CDATA[<p>This week, I have been diving headfirst into <a href="https://angularjs.org/">AngularJS</a>.
I am amazed at how much one can accomplish with very little code. In this example,
I want to show and hide various parts of a form based on what selections the user
makes elsewhere. That&rsquo;s a pretty simple thing to do with <a href="https://jquery.com/">jQuery</a>.
It&rsquo;s even easier with AngularJS.</p>

<p>First, let&rsquo;s show our base markup. This is the bare minimum to get our page to 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>
<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='html'><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;title&gt;</span>Angular Demo<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 class="nt">&lt;form</span> <span class="na">method=</span><span class="s">&quot;post&quot;</span> <span class="na">action=</span><span class="s">&quot;#&quot;</span><span class="nt">&gt;</span>
</span><span class='line'>    <span class="nt">&lt;div&gt;</span>
</span><span class='line'>      <span class="nt">&lt;label&gt;</span>What is your favorite color?<span class="nt">&lt;/label&gt;</span>
</span><span class='line'>      <span class="nt">&lt;select</span> <span class="na">name=</span><span class="s">&quot;favoriteColor&quot;</span><span class="nt">&gt;</span>
</span><span class='line'>        <span class="nt">&lt;option&gt;&lt;/option&gt;</span>
</span><span class='line'>        <span class="nt">&lt;option&gt;</span>Red<span class="nt">&lt;/option&gt;</span>
</span><span class='line'>        <span class="nt">&lt;option&gt;</span>Blue<span class="nt">&lt;/option&gt;</span>
</span><span class='line'>        <span class="nt">&lt;option&gt;</span>Other<span class="nt">&lt;/option&gt;</span>
</span><span class='line'>      <span class="nt">&lt;/select&gt;</span>
</span><span class='line'>    <span class="nt">&lt;/div&gt;</span>
</span><span class='line'>    <span class="nt">&lt;div&gt;</span>
</span><span class='line'>      <span class="nt">&lt;label&gt;</span>Favorite color (other)<span class="nt">&lt;/label&gt;</span>
</span><span class='line'>      <span class="nt">&lt;input</span> <span class="na">type=</span><span class="s">&quot;text&quot;</span> <span class="na">name=</span><span class="s">&quot;favoriteColorOther&quot;</span><span class="nt">/&gt;</span>
</span><span class='line'>    <span class="nt">&lt;/div&gt;</span>
</span><span class='line'>    <span class="nt">&lt;div&gt;</span>
</span><span class='line'>      <span class="nt">&lt;button</span> <span class="na">type=</span><span class="s">&quot;submit&quot;</span><span class="nt">&gt;</span>
</span><span class='line'>        Submit
</span><span class='line'>      <span class="nt">&lt;/button&gt;</span>
</span><span class='line'>    <span class="nt">&lt;/div&gt;</span>
</span><span class='line'>  <span class="nt">&lt;/form&gt;</span>
</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>The above HTML will render as follows.</p>

<p><img class="center" src="http://jarrettmeyer.com/images/content/2014/10-oct/angular-1-1.png" title="&#34;Angular 1-1&#34;" alt="&#34;Angular 1-1&#34;"></p>

<p>If we already know jQuery, we know that we need to add a little more to our markup
to make it play nice with jQuery.</p>

<ol>
<li>Add an ID to our select box.</li>
<li>Add an ID to our wrapper <code>div</code> tag for our &ldquo;Other&rdquo; input.</li>
<li>Hide the &ldquo;Other&rdquo; form field by default.</li>
<li>Write a little bit of jQuery.</li>
</ol>


<figure 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='html'><span class='line'><span class="c">&lt;!-- Update select --&gt;</span>
</span><span class='line'><span class="nt">&lt;select</span> <span class="na">name=</span><span class="s">&quot;favoriteColor&quot;</span> <span class="na">id=</span><span class="s">&quot;favoriteColor&quot;</span><span class="nt">&gt;</span>
</span><span class='line'>
</span><span class='line'><span class="c">&lt;!-- Update div, add inline style --&gt;</span>
</span><span class='line'><span class="nt">&lt;div</span> <span class="na">id=</span><span class="s">&quot;form-field-favoriteColorOther&quot;</span> <span class="na">style=</span><span class="s">&quot;display: none;&quot;</span><span class="nt">&gt;</span>
</span><span class='line'>
</span><span class='line'><span class="c">&lt;!-- Write a little script --&gt;</span>
</span><span class='line'><span class="nt">&lt;script </span><span class="na">type=</span><span class="s">&quot;text/javascript&quot;</span> <span class="na">src=</span><span class="s">&quot;//ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js&quot;</span><span class="nt">&gt;&lt;/script&gt;</span>
</span><span class='line'><span class="nt">&lt;script </span><span class="na">type=</span><span class="s">&quot;text/javascript&quot;</span><span class="nt">&gt;</span>
</span><span class='line'>  <span class="nx">$</span><span class="p">(</span><span class="s2">&quot;#favoriteColor&quot;</span><span class="p">).</span><span class="nx">on</span><span class="p">(</span><span class="s2">&quot;change&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="k">if</span> <span class="p">(</span><span class="nx">$</span><span class="p">(</span><span class="s2">&quot;#favoriteColor&quot;</span><span class="p">).</span><span class="nx">val</span><span class="p">()</span> <span class="o">===</span> <span class="s2">&quot;Other&quot;</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>      <span class="nx">$</span><span class="p">(</span><span class="s2">&quot;#form-field-favoriteColorOther&quot;</span><span class="p">).</span><span class="nx">show</span><span class="p">();</span>
</span><span class='line'>    <span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
</span><span class='line'>      <span class="nx">$</span><span class="p">(</span><span class="s2">&quot;#form-field-favoriteColorOther&quot;</span><span class="p">).</span><span class="nx">hide</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="nt">&lt;/script&gt;</span>
</span></code></pre></td></tr></table></div></figure>


<p>That&rsquo;s really not too bad. Let&rsquo;s however, add a few more requirements.</p>

<ol>
<li>The Favorite Color option needs to be required.</li>
<li>The Other field needs to be required if Other is selected.</li>
<li>Don&rsquo;t let the user submit an invalid form.</li>
</ol>


<p>HTML 5 gives us some of this, but we still run into walls. We&rsquo;re going to have to
add a disabled attribute to the button. We&rsquo;re going to have to validate our form
with another library (or roll our own). We need to add <code>required</code> to the select
box. We need to add <code>required</code> to our text box, but only if &ldquo;Other&rdquo; is selected.</p>

<p>The program flow should look like this.</p>

<p>This is the default state of the form.</p>

<p><img class="center" src="http://jarrettmeyer.com/images/content/2014/10-oct/angular-1-2a.png" title="&#34;Angular 1-2a&#34;" alt="&#34;Angular 1-2a&#34;"></p>

<p>User selects an option that is not &ldquo;Other&rdquo;. Everything is good. Enable the submit
button.</p>

<p><img class="center" src="http://jarrettmeyer.com/images/content/2014/10-oct/angular-1-2b.png" title="&#34;Angular 1-2b&#34;" alt="&#34;Angular 1-2b&#34;"></p>

<p>User select &ldquo;Other&rdquo;. Show a text box and disable the submit button.</p>

<p><img class="center" src="http://jarrettmeyer.com/images/content/2014/10-oct/angular-1-2c.png" title="&#34;Angular 1-2c&#34;" alt="&#34;Angular 1-2c&#34;"></p>

<p>User enters a value in the text box. Everything is good again. Enable the submit
button.</p>

<p><img class="center" src="http://jarrettmeyer.com/images/content/2014/10-oct/angular-1-2d.png" title="&#34;Angular 1-2d&#34;" alt="&#34;Angular 1-2d&#34;"></p>

<p>Again, none of this is particularly difficult, but you can imagine how all of this
blows up when a page gets to be of a certain complexity. Let&rsquo;s see what AngularJS
has to offer.</p>

<ol>
<li>Add <code>ng-model</code> tags to the form fields that we need to expose to angular.  That&rsquo;s
both of them.</li>
<li>Add <code>ng-required</code> to any field that is dynamically required.</li>
<li>Add <code>ng-disabled</code> to any field that is dynamically disabled.</li>
<li>Wire it all together.</li>
</ol>


<p>Let&rsquo;s look at our AngularJS markup</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='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</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;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>Angular Demo<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</span> <span class="na">ng-app=</span><span class="s">&quot;&quot;</span><span class="nt">&gt;</span>
</span><span class='line'>  <span class="nt">&lt;form</span> <span class="na">method=</span><span class="s">&quot;post&quot;</span> <span class="na">action=</span><span class="s">&quot;#&quot;</span> <span class="na">name=</span><span class="s">&quot;form&quot;</span><span class="nt">&gt;</span>
</span><span class='line'>    <span class="nt">&lt;div&gt;</span>
</span><span class='line'>      <span class="nt">&lt;label&gt;</span>What is your favorite color?<span class="nt">&lt;/label&gt;</span>
</span><span class='line'>      <span class="nt">&lt;select</span> <span class="na">name=</span><span class="s">&quot;favoriteColor&quot;</span> <span class="na">ng-model=</span><span class="s">&quot;favoriteColor&quot;</span> <span class="na">required</span><span class="nt">&gt;</span>
</span><span class='line'>        <span class="nt">&lt;option&gt;&lt;/option&gt;</span>
</span><span class='line'>        <span class="nt">&lt;option&gt;</span>Red<span class="nt">&lt;/option&gt;</span>
</span><span class='line'>        <span class="nt">&lt;option&gt;</span>Blue<span class="nt">&lt;/option&gt;</span>
</span><span class='line'>        <span class="nt">&lt;option&gt;</span>Other<span class="nt">&lt;/option&gt;</span>
</span><span class='line'>      <span class="nt">&lt;/select&gt;</span>
</span><span class='line'>    <span class="nt">&lt;/div&gt;</span>
</span><span class='line'>    <span class="nt">&lt;div</span> <span class="na">ng-show=</span><span class="s">&quot;favoriteColor === &#39;Other&#39;&quot;</span><span class="nt">&gt;</span>
</span><span class='line'>      <span class="nt">&lt;label&gt;</span>Favorite color (other)<span class="nt">&lt;/label&gt;</span>
</span><span class='line'>      <span class="nt">&lt;input</span> <span class="na">type=</span><span class="s">&quot;text&quot;</span> <span class="na">name=</span><span class="s">&quot;favoriteColorOther&quot;</span> <span class="na">ng-model=</span><span class="s">&quot;favoriteColorOther&quot;</span> <span class="na">ng-required=</span><span class="s">&quot;favoriteColor === &#39;Other&#39;&quot;</span><span class="nt">/&gt;</span>
</span><span class='line'>    <span class="nt">&lt;/div&gt;</span>
</span><span class='line'>    <span class="nt">&lt;div&gt;</span>
</span><span class='line'>      <span class="nt">&lt;button</span> <span class="na">type=</span><span class="s">&quot;submit&quot;</span> <span class="na">ng-disabled=</span><span class="s">&quot;form.$invalid&quot;</span><span class="nt">&gt;</span>
</span><span class='line'>        Submit
</span><span class='line'>      <span class="nt">&lt;/button&gt;</span>
</span><span class='line'>    <span class="nt">&lt;/div&gt;</span>
</span><span class='line'>  <span class="nt">&lt;/form&gt;</span>
</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>Let&rsquo;s compare our jQuery markup with our AngularJS markup.</p>

<ol>
<li>The <code>body</code> tag now has an <code>ng-app=""</code> attribute. This is what tells Angular that
it should work.</li>
<li>We have added a <code>name="form"</code> attribute to our form. By giving the form a name,
it can be accessed by Angular. This access can be seen on the submit button,
with the <code>form.$invalid</code> variable.</li>
<li>We have added <code>ng-model="..."</code> to both of our input fields. This exposes the form
fields to Angular.</li>
<li>We have added a <code>required</code> HTML5 attribute to our <code>select</code>.</li>
<li>We have added <code>ng-show="favoriteColor === 'Other'"</code> to our <code>div</code> tag that wraps our
text box. This means that the field will only be shown if the expression is truthy.</li>
<li>We added an <code>ng-required</code> attribute to our text box. This means the field will
be required if the expression is truthy.</li>
<li>Finally, we added an <code>ng-disabled</code> attribute to our button. This means that the
button will be disabled if the expression is truthy.</li>
</ol>


<p>Now, let&rsquo;s show the JavaScript we need to write to make all this magic happen.</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="c1">// Boo!</span>
</span></code></pre></td></tr></table></div></figure>


<p>Yep. We&rsquo;re done. Zero lines of JavaScript. Yeah, I could get used to this.</p>

<h3>The complete series</h3>

<ul>
<li><a href="http://jarrettmeyer.com/blog/2014/10/24/angular-part-1-show-and-hide/">Part 1: Show and Hide</a></li>
<li><a href="http://jarrettmeyer.com/blog/2014/10/28/angular-part-2-moving-to-a-controller/">Part 2: Moving to a Controller</a></li>
<li><a href="http://jarrettmeyer.com/blog/2014/10/29/angular-part-3-dependency-injection/">Part 3: Dependency Injection</a></li>
<li><a href="http://jarrettmeyer.com/blog/2014/10/30/angular-part-4-creating-a-service/">Part 4: Creating a Service</a></li>
<li><a href="http://jarrettmeyer.com/blog/2014/10/31/angular-part-5-testing/">Part 5: Testing</a></li>
</ul>

]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Oops! How To Permanently Delete a File from Git]]></title>
    <link href="http://jarrettmeyer.com/blog/2014/08/07/oops-how-to-permanently-delete-a-file-from-git/"/>
    <updated>2014-08-07T08:00:00-04:00</updated>
    <id>http://jarrettmeyer.com/blog/2014/08/07/oops-how-to-permanently-delete-a-file-from-git</id>
    <content type="html"><![CDATA[<blockquote><p>I accidentally added an uninitialized (appended) SQL Server backup file, a <code>*.bak</code>, to source control and pushed it. Now, no one can fetch a clean copy of the source because of out-of-memory errors. How do I fix this?</p></blockquote>

<figure class='code'><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=''><span class='line'>git filter-branch --tree-filter 'git rm -r -f --ignore-unmatch *.bak' HEAD</span></code></pre></td></tr></table></div></figure>


<p>This will take a while to run, as it goes through every commit in your project and deletes the file. When you&rsquo;re done, you&rsquo;ll need to push the file to your remote.</p>

<figure class='code'><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=''><span class='line'>git push origin master --force</span></code></pre></td></tr></table></div></figure>


<p>You&rsquo;ll need the <code>--force</code> flag because this is not a fast-forward commit.</p>

<ul>
<li><a href="http://dalibornasevic.com/posts/2-permanently-remove-files-and-folders-from-a-git-repository">Permanently remove files and folders from a git repository</a></li>
<li><a href="http://git-scm.com/docs/git-filter-branch">Git filter-branch documentation</a></li>
</ul>

]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Getting Started with MathJax]]></title>
    <link href="http://jarrettmeyer.com/blog/2014/08/06/getting-started-with-mathjax/"/>
    <updated>2014-08-06T10:47:19-04:00</updated>
    <id>http://jarrettmeyer.com/blog/2014/08/06/getting-started-with-mathjax</id>
    <content type="html"><![CDATA[<p>I&rsquo;ve spent the past few days getting myself reacquainted with TeX and familiarizing myself with <a href="http://www.mathjax.org/">MathJax</a>. As it turns out, it is quite easy to get MathJax working in Octopress.</p>

<ol>
<li>Open <code>source/_includes/custom/head.html</code>.</li>
<li>Add the a JavaScript source: <code>//cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-MML-AM_HTMLorMML</code>.</li>
<li>Start typing your TeX.</li>
<li>In your <code>Gemfile</code>, make sure you are using at least <a href="https://github.com/davidfstr/rdiscount">RDiscount</a> version 2.1. <code>gem 'rdiscount', '~&gt; 2.1'</code></li>
<li>In your <code>_config.yml</code> file, disable automatic superscripts by adding <code>- no_superscript</code> to your RDiscount configuration.</li>
</ol>


<p>The last two are quite important. Without those two steps, it looks like RDiscount will turn <code>x^2</code> into <code>x&lt;sup&gt;2&lt;/sup&gt;</code>. This will get displayed as x<sup>2</sup>. That will break the MathJax processor.</p>

<p>Let&rsquo;s start by demonstrating a simple inline equation, like \( y = mx + c \). This is simple enough by including the inline text: <code>\\( y = mx + c \\)</code>.</p>

<p>To enter full equations, like the one below, use the following syntax.</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>
</pre></td><td class='code'><pre><code class=''><span class='line'>\begin{equation}
</span><span class='line'>x = \dfrac{ -b \pm \sqrt{ b^2 - 4ac } }{ 2a }
</span><span class='line'>\end{equation}</span></code></pre></td></tr></table></div></figure>


<p>The above code will render as the following equation.</p>

<p>\begin{equation}
x = \dfrac{ -b \pm \sqrt{ b^2 - 4ac } }{ 2a }
\end{equation}</p>

<p>Happy mathing!</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Mocking a JavaScript Constructor]]></title>
    <link href="http://jarrettmeyer.com/blog/2014/07/18/mocking-a-javascript-constructor/"/>
    <updated>2014-07-18T07:27:05-04:00</updated>
    <id>http://jarrettmeyer.com/blog/2014/07/18/mocking-a-javascript-constructor</id>
    <content type="html"><![CDATA[<p><img class="center" src="http://jarrettmeyer.com/images/content/2014/07-jul/youre_mocking_me_arent_you.png" title="&#34;You're mocking me, aren't you?&#34;" alt="&#34;You're mocking me, aren't you?&#34;"></p>

<p>JavaScript, and dynamic languages in general, make it extremely easy to mock out functions. This greatly reduces the need for all the extra programming junk (interfaces, adapters, wrappers, factories, etc.) that gets in the way of us solving our problems. <a href="http://jarrettmeyer.com/blog/2014/07/11/a-pox-on-static-languages">We add tons of extra layers</a> in the name of test isolation and object independence that plainly isn&rsquo;t necessary in the dynamic languages world.</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="c1">// lib/Point.js</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">Point</span> <span class="o">=</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="kd">function</span> <span class="nx">Point</span><span class="p">(</span><span class="nx">x</span><span class="p">,</span> <span class="nx">y</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">x</span> <span class="o">=</span> <span class="nx">x</span><span class="p">;</span>
</span><span class='line'>    <span class="k">this</span><span class="p">.</span><span class="nx">y</span> <span class="o">=</span> <span class="nx">y</span><span class="p">;</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>  <span class="nx">Point</span><span class="p">.</span><span class="nx">prototype</span><span class="p">.</span><span class="nx">distanceTo</span> <span class="o">=</span> <span class="kd">function</span><span class="p">(</span><span class="nx">point</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">dx</span> <span class="o">=</span> <span class="k">this</span><span class="p">.</span><span class="nx">x</span> <span class="o">-</span> <span class="nx">point</span><span class="p">.</span><span class="nx">x</span><span class="p">;</span>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">dy</span> <span class="o">=</span> <span class="k">this</span><span class="p">.</span><span class="nx">y</span> <span class="o">-</span> <span class="nx">point</span><span class="p">.</span><span class="nx">y</span><span class="p">;</span>
</span><span class='line'>    <span class="k">return</span> <span class="nb">Math</span><span class="p">.</span><span class="nx">sqrt</span><span class="p">(</span><span class="nx">dx</span> <span class="o">*</span> <span class="nx">dx</span> <span class="o">+</span> <span class="nx">dy</span> <span class="o">*</span> <span class="nx">dy</span><span class="p">);</span>
</span><span class='line'>  <span class="p">};</span>
</span><span class='line'>
</span><span class='line'>  <span class="nx">Point</span><span class="p">.</span><span class="nx">origin</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">new</span> <span class="nx">Point</span><span class="p">(</span><span class="mi">0</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><span class='line'>  <span class="k">return</span> <span class="nx">Point</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'><span class="p">}).</span><span class="nx">call</span><span class="p">(</span><span class="k">this</span><span class="p">);</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="nx">Point</span><span class="p">;</span>
</span></code></pre></td></tr></table></div></figure>


<p>We&rsquo;ve defined a very simple class, and it has all of the parts that we need to demonstrate how mocking works.</p>

<p>First, let&rsquo;s define some simple tests. I&rsquo;m using <a href="http://jasmine.github.io/">Jasmine</a> and Node. (See <a href="https://github.com/mhevery/jasmine-node">jasmine-node</a> for a command line version of Jasmine.) These tests fully describe the basic functionality 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>
<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/PointSpec.js</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">Point</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s2">&quot;../lib/Point&quot;</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;Point&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="kd">var</span> <span class="nx">point</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">point</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">Point</span><span class="p">(</span><span class="mi">3</span><span class="p">,</span> <span class="mi">4</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;can return the distance to the origin&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">distance</span> <span class="o">=</span> <span class="nx">point</span><span class="p">.</span><span class="nx">distanceTo</span><span class="p">(</span><span class="nx">Point</span><span class="p">.</span><span class="nx">origin</span><span class="p">());</span>
</span><span class='line'>    <span class="nx">expect</span><span class="p">(</span><span class="nx">distance</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><span class='line'>  <span class="nx">it</span><span class="p">(</span><span class="s2">&quot;returns the expected value when constructing an origin&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">origin</span> <span class="o">=</span> <span class="nx">Point</span><span class="p">.</span><span class="nx">origin</span><span class="p">();</span>
</span><span class='line'>    <span class="nx">expect</span><span class="p">(</span><span class="nx">origin</span><span class="p">.</span><span class="nx">x</span><span class="p">).</span><span class="nx">toEqual</span><span class="p">(</span><span class="mi">0</span><span class="p">);</span>
</span><span class='line'>    <span class="nx">expect</span><span class="p">(</span><span class="nx">origin</span><span class="p">.</span><span class="nx">y</span><span class="p">).</span><span class="nx">toEqual</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><span class='line'>  <span class="nx">it</span><span class="p">(</span><span class="s2">&quot;returns the expected values for x and y&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">point</span><span class="p">.</span><span class="nx">x</span><span class="p">).</span><span class="nx">toEqual</span><span class="p">(</span><span class="mi">3</span><span class="p">);</span>
</span><span class='line'>    <span class="nx">expect</span><span class="p">(</span><span class="nx">point</span><span class="p">.</span><span class="nx">y</span><span class="p">).</span><span class="nx">toEqual</span><span class="p">(</span><span class="mi">4</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></code></pre></td></tr></table></div></figure>


<h3>Mocking an instance function.</h3>

<p>The <code>distanceTo()</code> function exists on the instance of <code>Point</code>. It&rsquo;s incredibly easy to mock out. Functions are first-class members in JavaScript, so we can simply redefine the function in the unit test. In this example, we simply redefine the function to return 0.</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">describe</span><span class="p">(</span><span class="s2">&quot;Point with stubbed distanceTo() function&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="kd">var</span> <span class="nx">point</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">point</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">Point</span><span class="p">(</span><span class="mi">3</span><span class="p">,</span> <span class="mi">4</span><span class="p">);</span>
</span><span class='line'>    <span class="nx">point</span><span class="p">.</span><span class="nx">distanceTo</span> <span class="o">=</span> <span class="kd">function</span> <span class="p">(</span><span class="nx">point</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>      <span class="k">return</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><span class='line'>
</span><span class='line'>  <span class="nx">it</span><span class="p">(</span><span class="s2">&quot;returns 0 via stub&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">distance</span> <span class="o">=</span> <span class="nx">point</span><span class="p">.</span><span class="nx">distanceTo</span><span class="p">(</span><span class="k">new</span> <span class="nx">Point</span><span class="p">(</span><span class="mi">10</span><span class="p">,</span> <span class="mi">10</span><span class="p">));</span>
</span><span class='line'>    <span class="nx">expect</span><span class="p">(</span><span class="nx">distance</span><span class="p">).</span><span class="nx">toEqual</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><span class='line'><span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>


<h3>Mocking a class function.</h3>

<p>The <code>origin()</code> function is a class function that returns the point {0, 0}. Let&rsquo;s suppose we need to define a different origin. That&rsquo;s easy 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>
</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;Point with stubbed origin() function&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="kd">var</span> <span class="nx">point</span><span class="p">,</span> <span class="nx">temp</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">temp</span> <span class="o">=</span> <span class="nx">Point</span><span class="p">.</span><span class="nx">origin</span><span class="p">;</span> <span class="c1">// Save the definition for later.</span>
</span><span class='line'>    <span class="nx">Point</span><span class="p">.</span><span class="nx">origin</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">new</span> <span class="nx">Point</span><span class="p">(</span><span class="mi">1</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="nx">point</span> <span class="o">=</span> <span class="nx">Point</span><span class="p">.</span><span class="nx">origin</span><span class="p">();</span>
</span><span class='line'>  <span class="p">});</span>
</span><span class='line'>
</span><span class='line'>  <span class="nx">afterEach</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">Point</span><span class="p">.</span><span class="nx">origin</span> <span class="o">=</span> <span class="nx">temp</span><span class="p">;</span> <span class="c1">// Restore the original definition.</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;has the expected values for x and y&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">point</span><span class="p">.</span><span class="nx">x</span><span class="p">).</span><span class="nx">toEqual</span><span class="p">(</span><span class="mi">1</span><span class="p">);</span>
</span><span class='line'>    <span class="nx">expect</span><span class="p">(</span><span class="nx">point</span><span class="p">.</span><span class="nx">y</span><span class="p">).</span><span class="nx">toEqual</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><span class='line'><span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>


<p>In this case, we need to store the original definition of <code>origin()</code> in the <code>temp</code> variable. In <code>beforeEach()</code>, we will override the <code>origin()</code> function. In <code>afterEach()</code>, we will restore it to its former glory.</p>

<h3>Mocking the class constructor.</h3>

<p>Of the three, mocking the constructor takes a little more insight, but the activity is functionally the same. We are going to create a new class and copy all of the necessary functionality to the new class. We do this by copying over the <code>prototype</code> of the original point. We also need to explicitly copy over the <code>origin()</code> function, since class functions are not part of the <code>prototype</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>
</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;Point with stubbed constructor&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="kd">var</span> <span class="nx">MockPoint</span> <span class="o">=</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">function</span> <span class="nx">MockPoint</span><span class="p">(</span><span class="nx">x</span><span class="p">,</span> <span class="nx">y</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">x</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
</span><span class='line'>      <span class="k">this</span><span class="p">.</span><span class="nx">y</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="k">return</span> <span class="nx">MockPoint</span><span class="p">;</span>
</span><span class='line'>  <span class="p">}).</span><span class="nx">call</span><span class="p">(</span><span class="k">this</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>  <span class="c1">// Apply all functions from Point to MockPoint. Also copy the</span>
</span><span class='line'>  <span class="c1">// origin() function to MockPoint.</span>
</span><span class='line'>  <span class="nx">MockPoint</span><span class="p">.</span><span class="nx">prototype</span> <span class="o">=</span> <span class="nx">Point</span><span class="p">.</span><span class="nx">prototype</span><span class="p">;</span>
</span><span class='line'>  <span class="nx">MockPoint</span><span class="p">.</span><span class="nx">origin</span> <span class="o">=</span> <span class="nx">Point</span><span class="p">.</span><span class="nx">origin</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">point</span><span class="p">,</span> <span class="nx">temp</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">temp</span> <span class="o">=</span> <span class="nx">Point</span><span class="p">;</span> <span class="c1">// Save the definition for later.</span>
</span><span class='line'>    <span class="nx">Point</span> <span class="o">=</span> <span class="nx">MockPoint</span><span class="p">;</span>
</span><span class='line'>  <span class="p">});</span>
</span><span class='line'>
</span><span class='line'>  <span class="nx">afterEach</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">Point</span> <span class="o">=</span> <span class="nx">temp</span><span class="p">;</span> <span class="c1">// Restore the original definition.</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;calculates distance correctly&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">distance</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">Point</span><span class="p">(</span><span class="mi">3</span><span class="p">,</span> <span class="mi">4</span><span class="p">).</span><span class="nx">distanceTo</span><span class="p">(</span><span class="k">new</span> <span class="nx">Point</span><span class="p">(</span><span class="mi">6</span><span class="p">,</span> <span class="mi">7</span><span class="p">));</span>
</span><span class='line'>    <span class="nx">expect</span><span class="p">(</span><span class="nx">distance</span><span class="p">).</span><span class="nx">toEqual</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><span class='line'>  <span class="nx">it</span><span class="p">(</span><span class="s2">&quot;can stub out the constructor&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">point</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">Point</span><span class="p">(</span><span class="mi">4</span><span class="p">,</span> <span class="mi">5</span><span class="p">);</span>
</span><span class='line'>    <span class="nx">expect</span><span class="p">(</span><span class="nx">point</span><span class="p">.</span><span class="nx">x</span><span class="p">).</span><span class="nx">toEqual</span><span class="p">(</span><span class="mi">0</span><span class="p">);</span>
</span><span class='line'>    <span class="nx">expect</span><span class="p">(</span><span class="nx">point</span><span class="p">.</span><span class="nx">y</span><span class="p">).</span><span class="nx">toEqual</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><span class='line'>  <span class="nx">it</span><span class="p">(</span><span class="s2">&quot;leaves the origin() function unchanged&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">point</span> <span class="o">=</span> <span class="nx">Point</span><span class="p">.</span><span class="nx">origin</span><span class="p">();</span>
</span><span class='line'>    <span class="nx">expect</span><span class="p">(</span><span class="nx">point</span><span class="p">.</span><span class="nx">x</span><span class="p">).</span><span class="nx">toEqual</span><span class="p">(</span><span class="mi">0</span><span class="p">);</span>
</span><span class='line'>    <span class="nx">expect</span><span class="p">(</span><span class="nx">point</span><span class="p">.</span><span class="nx">y</span><span class="p">).</span><span class="nx">toEqual</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><span class='line'><span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>


<p>The pattern is the same. Create a copy. Redefine the function. (The constructor is just another function, just treated a little differently.) Do your tests. Restore the original definition.</p>

<p>I hope this clears up some of the issues around mocking JavaScript objects. This can be done easily with the language and require no additional 3rd party libraries.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[A Pox on Static Languages]]></title>
    <link href="http://jarrettmeyer.com/blog/2014/07/11/a-pox-on-static-languages/"/>
    <updated>2014-07-11T08:00:00-04:00</updated>
    <id>http://jarrettmeyer.com/blog/2014/07/11/a-pox-on-static-languages</id>
    <content type="html"><![CDATA[<p>It&rsquo;s no secret that I am tired of .NET, C#, and static language stupidity.</p>

<p>My curent project went in for a code review, and I&rsquo;m going to share the before snippet. This is a simple part of the project, containing no business logic &mdash; it&rsquo;s just a way to check the status to make sure that the server is 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>
<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='csharp'><span class='line'><span class="k">public</span> <span class="k">class</span> <span class="nc">Status</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>  <span class="k">public</span> <span class="nf">Status</span><span class="p">()</span>
</span><span class='line'>  <span class="p">{</span>
</span><span class='line'>    <span class="n">ServerTime</span> <span class="p">=</span> <span class="n">Clock</span><span class="p">.</span><span class="n">Instance</span><span class="p">.</span><span class="n">UtcNow</span><span class="p">;</span>
</span><span class='line'>    <span class="n">Timestamp</span> <span class="p">=</span> <span class="n">Clock</span><span class="p">.</span><span class="n">Instance</span><span class="p">.</span><span class="n">UtcNow</span><span class="p">.</span><span class="n">ToEpoch</span><span class="p">();</span>
</span><span class='line'>    <span class="n">Version</span> <span class="p">=</span> <span class="n">GetVersionString</span><span class="p">();</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">public</span> <span class="n">DateTime</span> <span class="n">ServerTime</span> <span class="p">{</span> <span class="k">get</span><span class="p">;</span> <span class="k">set</span><span class="p">;</span> <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">public</span> <span class="kt">long</span> <span class="n">Timestamp</span> <span class="p">{</span> <span class="k">get</span><span class="p">;</span> <span class="k">set</span><span class="p">;</span> <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">public</span> <span class="kt">string</span> <span class="n">Version</span> <span class="p">{</span> <span class="k">get</span><span class="p">;</span> <span class="k">set</span><span class="p">;</span> <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">private</span> <span class="k">static</span> <span class="kt">string</span> <span class="nf">GetVersionString</span><span class="p">()</span>
</span><span class='line'>  <span class="p">{</span>
</span><span class='line'>    <span class="kt">var</span> <span class="n">version</span> <span class="p">=</span> <span class="n">Assembly</span><span class="p">.</span><span class="n">GetExecutingAssembly</span><span class="p">().</span><span class="n">GetName</span><span class="p">().</span><span class="n">Version</span><span class="p">;</span>
</span><span class='line'>    <span class="kt">var</span> <span class="n">versionString</span> <span class="p">=</span> <span class="kt">string</span><span class="p">.</span><span class="n">Format</span><span class="p">(</span><span class="s">&quot;{0}.{1}&quot;</span><span class="p">,</span> <span class="n">version</span><span class="p">.</span><span class="n">Build</span><span class="p">,</span> <span class="n">version</span><span class="p">.</span><span class="n">Revision</span><span class="p">);</span>
</span><span class='line'>    <span class="k">return</span> <span class="n">versionString</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">public</span> <span class="k">class</span> <span class="nc">StatusController</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>  <span class="k">public</span> <span class="n">Status</span> <span class="nf">Get</span><span class="p">()</span>
</span><span class='line'>  <span class="p">{</span>
</span><span class='line'>    <span class="k">return</span> <span class="k">new</span> <span class="nf">Status</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&rsquo;s all the relevant code in this particular example. Here is the reviewers comment.</p>

<blockquote><p>Factor all of the work out of the Status class&rsquo;s constructor. Treat Status as a DTO. Put unit tests around the new factory to ensure it is properly initializing Status.</p></blockquote>

<p><em>Damn.</em> The problem with that above review is that (1) it is a lot more code to write for such a simple thing, and (2) I completely agree that&rsquo;s how it should be done in C# (and probably other static languages, too). From a testing and code design point of view, the above comment represents all of the best practices that good code should follow. It keeps the result object as a plain DTO. It makes sure that the controller is responsible for nothing beyond negotiation. <strong>The reviewer&rsquo;s comment is valid and accepted for work.</strong></p>

<p><em>If I sound too put off by this, please realize that this is less than 30 minutes of work for me to do. This is much more about my distaste with the current state of static language patterns than my critique of the code reviewer.</em></p>

<p>So, let&rsquo;s start by adding a factory, moving the initialization logic to the factory. We are using Ninject, so we&rsquo;ll also need to be sure to register this with our IoC 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>
<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='csharp'><span class='line'><span class="k">public</span> <span class="k">interface</span> <span class="n">IStatusFactory</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>  <span class="n">Status</span> <span class="nf">Create</span><span class="p">();</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="k">public</span> <span class="k">class</span> <span class="nc">StatusFactoryImpl</span> <span class="p">:</span> <span class="n">IStatusFactory</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>  <span class="k">public</span> <span class="n">Status</span> <span class="nf">Create</span><span class="p">()</span>
</span><span class='line'>  <span class="p">{</span>
</span><span class='line'>    <span class="k">return</span> <span class="k">new</span> <span class="n">Status</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>      <span class="n">ServerTime</span> <span class="p">=</span> <span class="n">Clock</span><span class="p">.</span><span class="n">Instance</span><span class="p">.</span><span class="n">UtcNow</span><span class="p">,</span>
</span><span class='line'>      <span class="n">Timestamp</span> <span class="p">=</span> <span class="n">Clock</span><span class="p">.</span><span class="n">Instance</span><span class="p">.</span><span class="n">UtcNow</span><span class="p">.</span><span class="n">ToEpoch</span><span class="p">(),</span>
</span><span class='line'>      <span class="n">Version</span> <span class="p">=</span> <span class="n">GetVersionString</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">private</span> <span class="k">static</span> <span class="kt">string</span> <span class="nf">GetVersionString</span><span class="p">()</span>
</span><span class='line'>  <span class="p">{</span>
</span><span class='line'>    <span class="kt">var</span> <span class="n">version</span> <span class="p">=</span> <span class="n">Assembly</span><span class="p">.</span><span class="n">GetExecutingAssembly</span><span class="p">().</span><span class="n">GetName</span><span class="p">().</span><span class="n">Version</span><span class="p">;</span>
</span><span class='line'>    <span class="kt">var</span> <span class="n">versionString</span> <span class="p">=</span> <span class="kt">string</span><span class="p">.</span><span class="n">Format</span><span class="p">(</span><span class="s">&quot;{0}.{1}&quot;</span><span class="p">,</span> <span class="n">version</span><span class="p">.</span><span class="n">Build</span><span class="p">,</span> <span class="n">version</span><span class="p">.</span><span class="n">Revision</span><span class="p">);</span>
</span><span class='line'>    <span class="k">return</span> <span class="n">versionString</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">// In our registration...</span>
</span><span class='line'><span class="n">Kernel</span><span class="p">.</span><span class="n">Bind</span><span class="p">&lt;</span><span class="n">IStatusFactory</span><span class="p">&gt;().</span><span class="n">To</span><span class="p">&lt;</span><span class="n">StatusFactoryImpl</span><span class="p">&gt;().</span><span class="n">InRequestScope</span><span class="p">();</span>
</span></code></pre></td></tr></table></div></figure>


<p>We also need to modify our existing <code>StatusController</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>
</pre></td><td class='code'><pre><code class='csharp'><span class='line'><span class="k">public</span> <span class="k">class</span> <span class="nc">StatusController</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>  <span class="k">private</span> <span class="k">readonly</span> <span class="n">IStatusFactory</span> <span class="n">statusFactory</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">public</span> <span class="nf">StatusController</span><span class="p">(</span><span class="n">IStatusFactory</span> <span class="n">statusFactory</span><span class="p">)</span>
</span><span class='line'>  <span class="p">{</span>
</span><span class='line'>    <span class="k">if</span> <span class="p">(</span><span class="n">statusFactory</span> <span class="p">==</span> <span class="k">null</span><span class="p">)</span>
</span><span class='line'>      <span class="k">throw</span> <span class="k">new</span> <span class="nf">ArgumentNullException</span><span class="p">(</span><span class="s">&quot;statusFactory&quot;</span><span class="p">);</span>
</span><span class='line'>    <span class="k">this</span><span class="p">.</span><span class="n">statusFactory</span> <span class="p">=</span> <span class="n">statusFactory</span><span class="p">;</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">public</span> <span class="n">Status</span> <span class="nf">Get</span><span class="p">()</span>
</span><span class='line'>  <span class="p">{</span>
</span><span class='line'>    <span class="kt">var</span> <span class="n">status</span> <span class="p">=</span> <span class="n">statusFactory</span><span class="p">.</span><span class="n">Create</span><span class="p">();</span>
</span><span class='line'>    <span class="k">return</span> <span class="n">status</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>Finally, let&rsquo;s modify the <code>Status</code> object, removing the logic from the constructor.</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='csharp'><span class='line'><span class="k">public</span> <span class="k">class</span> <span class="nc">Status</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>  <span class="k">public</span> <span class="n">DateTime</span> <span class="n">ServerTime</span> <span class="p">{</span> <span class="k">get</span><span class="p">;</span> <span class="k">set</span><span class="p">;</span> <span class="p">}</span>
</span><span class='line'>  <span class="k">public</span> <span class="kt">long</span> <span class="n">Timestamp</span> <span class="p">{</span> <span class="k">get</span><span class="p">;</span> <span class="k">set</span><span class="p">;</span> <span class="p">}</span>
</span><span class='line'>  <span class="k">public</span> <span class="kt">string</span> <span class="n">Version</span> <span class="p">{</span> <span class="k">get</span><span class="p">;</span> <span class="k">set</span><span class="p">;</span> <span class="p">}</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>Finally, we need to modify our <code>StatusControllerTests</code> file to get all of our tests to pass. We will introduce a mock object to the controller&rsquo;s constructor.</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='csharp'><span class='line'><span class="k">public</span> <span class="k">class</span> <span class="nc">StatusControllerTests</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>  <span class="k">private</span> <span class="n">StatusController</span> <span class="n">controller</span><span class="p">;</span>
</span><span class='line'>  <span class="k">private</span> <span class="n">Mock</span><span class="p">&lt;</span><span class="n">IStatusFactory</span><span class="p">&gt;</span> <span class="n">mockStatusFactory</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'><span class="na">  [SetUp]</span>
</span><span class='line'>  <span class="k">public</span> <span class="k">void</span> <span class="nf">Before_each_test</span><span class="p">()</span>
</span><span class='line'>  <span class="p">{</span>
</span><span class='line'>    <span class="n">mockStatusFactory</span> <span class="p">=</span> <span class="k">new</span> <span class="n">Mock</span><span class="p">&lt;</span><span class="n">IStatusFactory</span><span class="p">&gt;();</span>
</span><span class='line'>    <span class="n">mockStatusFactory</span><span class="p">.</span><span class="n">Setup</span><span class="p">(</span><span class="n">x</span> <span class="p">=&gt;</span> <span class="n">x</span><span class="p">.</span><span class="n">Create</span><span class="p">()).</span><span class="n">Returns</span><span class="p">(</span><span class="k">new</span> <span class="n">Status</span><span class="p">());</span>
</span><span class='line'>    <span class="n">controller</span> <span class="p">=</span> <span class="k">new</span> <span class="n">StatusController</span><span class="p">(</span><span class="n">mockStatusFactory</span><span class="p">.</span><span class="n">Object</span><span class="p">);</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>  <span class="cm">/* snip */</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>All of this is easier how? The answer, obviously, is that this isn&rsquo;t easier. I&rsquo;m not even convinced that it is cleaner, even if it is more clearly separating concerns.</p>

<p>Total changes?</p>

<ul>
<li>6 files modified (Status, StatusController, StatusControllerTests, StatusTests, plus two .csproj files)</li>
<li>3 files added (IStatusFactory, StatusFactoryImpl, StatusFactoryImplTests)</li>
</ul>


<p>Ugh.</p>

<h3>Reconciling with Ruby on Rails</h3>

<p>How would I write the exact same thing in Ruby on Rails, and have the exact same level of testability (including mocking), etc.?</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">Status</span>
</span><span class='line'>  <span class="kp">attr_reader</span> <span class="ss">:server_time</span><span class="p">,</span> <span class="ss">:timestamp</span><span class="p">,</span> <span class="ss">:version</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">def</span> <span class="nf">initialize</span>
</span><span class='line'>    <span class="vi">@server_time</span> <span class="o">=</span> <span class="no">Time</span><span class="o">.</span><span class="n">now</span>
</span><span class='line'>    <span class="vi">@timestamp</span> <span class="o">=</span> <span class="vi">@server_time</span><span class="o">.</span><span class="n">to_i</span>
</span><span class='line'>    <span class="vi">@version</span> <span class="o">=</span> <span class="no">Application</span><span class="o">::</span><span class="no">VERSION</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">StatusController</span> <span class="o">&lt;</span> <span class="no">ApplicationController</span>
</span><span class='line'>  <span class="k">def</span> <span class="nf">index</span>
</span><span class='line'>    <span class="vi">@status</span> <span class="o">=</span> <span class="no">Status</span><span class="o">.</span><span class="n">new</span>
</span><span class='line'>    <span class="n">render</span> <span class="ss">json</span><span class="p">:</span> <span class="vi">@status</span><span class="p">,</span> <span class="ss">status</span><span class="p">:</span> <span class="ss">:ok</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>Wait. Doesn&rsquo;t that look like the original code? Yes, it does. Thanks to Ruby&rsquo;s basic <code>attr_reader</code>, I can quickly create the attributes for a class with very little code. The Ruby version is so much shorter because there is no reason to add extra layers (interfaces, factories) for the sake of object independence and testability in the dynamic objects world. We never require an actual type in dynamic languages, just something that conforms to the contract.</p>

<p>This is just another reason why I love Ruby. I can get more done faster, less typing, more clarity, and the same (or even better testability) than anything C# even comes close to accomplishing.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[The Easiest WebAPI Authorization Tutorial Ever]]></title>
    <link href="http://jarrettmeyer.com/blog/2014/01/15/the-easiest-webapi-authorization-tutorial-ever/"/>
    <updated>2014-01-15T08:00:00-05:00</updated>
    <id>http://jarrettmeyer.com/blog/2014/01/15/the-easiest-webapi-authorization-tutorial-ever</id>
    <content type="html"><![CDATA[<p>So, it took a lot of scouring of the internets, but I was finally able to piece together the bare minimum necessary to create your own authoritization client in <a href="http://www.asp.net/web-api">WebAPI</a>.</p>

<h3>Step 1: Create a DelegatingHandler</h3>

<p>The <code>DelegatingHandler</code> is a class that will be attached to all requests coming into your API. This is going to be the easiest authorization handler ever. Here are the rules.</p>

<blockquote><ol>
<li>If there is a token, any token at all, the request is valid.</li>
<li>Otherwise, the request is unauthorized.</li>
</ol>
</blockquote>

<p>Yes, this is simple. In reality, you&rsquo;d want to check the value of the token against something, at the very least a local database. That is left as an exercise for the reader.</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>
</pre></td><td class='code'><pre><code class='csharp'><span class='line'><span class="k">public</span> <span class="k">class</span> <span class="nc">AuthorizationHeaderHandler</span> <span class="p">:</span> <span class="n">DelegatingHandler</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>  <span class="k">private</span> <span class="kt">string</span> <span class="n">authorizationParameter</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">public</span> <span class="kt">bool</span> <span class="n">HasAuthorizationParameter</span>
</span><span class='line'>  <span class="p">{</span>
</span><span class='line'>    <span class="k">get</span> <span class="p">{</span> <span class="k">return</span> <span class="n">authorizationParameter</span> <span class="p">!=</span> <span class="k">null</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="k">protected</span> <span class="k">override</span> <span class="n">Task</span><span class="p">&lt;</span><span class="n">HttpResponseMessage</span><span class="p">&gt;</span> <span class="n">SendAsync</span><span class="p">(</span><span class="n">HttpRequestMessage</span> <span class="n">request</span><span class="p">,</span> <span class="n">CancellationToken</span> <span class="n">cancellationToken</span><span class="p">)</span>
</span><span class='line'>  <span class="p">{</span>
</span><span class='line'>    <span class="n">ParseAuthorizationHeader</span><span class="p">(</span><span class="n">request</span><span class="p">);</span>
</span><span class='line'>    <span class="k">if</span> <span class="p">(</span><span class="n">HasAuthorizationParameter</span><span class="p">)</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>      <span class="n">ConfigureClaimsIdentity</span><span class="p">();</span>
</span><span class='line'>      <span class="k">return</span> <span class="k">base</span><span class="p">.</span><span class="n">SendAsync</span><span class="p">(</span><span class="n">request</span><span class="p">,</span> <span class="n">cancellationToken</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="nf">ConfigureUnauthorizedRequest</span><span class="p">();</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">void</span> <span class="nf">ConfigureClaimsIdentity</span><span class="p">()</span>
</span><span class='line'>  <span class="p">{</span>
</span><span class='line'>    <span class="kt">var</span> <span class="n">claims</span> <span class="p">=</span> <span class="k">new</span> <span class="n">List</span><span class="p">&lt;</span><span class="n">Claim</span><span class="p">&gt;();</span>
</span><span class='line'>    <span class="c1">// Ideally, you&#39;d add some claims here.</span>
</span><span class='line'>    <span class="kt">var</span> <span class="n">claimsIdentity</span> <span class="p">=</span> <span class="k">new</span> <span class="n">ClaimsIdentity</span><span class="p">(</span><span class="n">claims</span><span class="p">);</span>
</span><span class='line'>    <span class="n">Thread</span><span class="p">.</span><span class="n">CurrentPrincipal</span> <span class="p">=</span> <span class="k">new</span> <span class="n">ClaimsPrincipal</span><span class="p">(</span><span class="n">claimsIdentity</span><span class="p">);</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">private</span> <span class="n">Task</span><span class="p">&lt;</span><span class="n">HttpResponseMessage</span><span class="p">&gt;</span> <span class="n">ConfigureUnauthorizedRequest</span><span class="p">()</span>
</span><span class='line'>  <span class="p">{</span>
</span><span class='line'>    <span class="kt">var</span> <span class="n">response</span> <span class="p">=</span> <span class="k">new</span> <span class="n">HttpResponseMessage</span><span class="p">(</span><span class="n">HttpStatusCode</span><span class="p">.</span><span class="n">Unauthorized</span><span class="p">);</span>
</span><span class='line'>    <span class="kt">var</span> <span class="n">taskCompletionSource</span> <span class="p">=</span> <span class="k">new</span> <span class="n">TaskCompletionSource</span><span class="p">&lt;</span><span class="n">HttpResponseMessage</span><span class="p">&gt;();</span>
</span><span class='line'>    <span class="n">taskCompletionSource</span><span class="p">.</span><span class="n">SetResult</span><span class="p">(</span><span class="n">response</span><span class="p">);</span>
</span><span class='line'>    <span class="k">return</span> <span class="n">taskCompletionSource</span><span class="p">.</span><span class="n">Task</span><span class="p">;</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">void</span> <span class="nf">ParseAuthorizationHeader</span><span class="p">(</span><span class="n">HttpRequestMessage</span> <span class="n">request</span><span class="p">)</span>
</span><span class='line'>  <span class="p">{</span>
</span><span class='line'>    <span class="k">if</span> <span class="p">(</span><span class="n">request</span><span class="p">.</span><span class="n">Headers</span> <span class="p">==</span> <span class="k">null</span> <span class="p">||</span> <span class="n">request</span><span class="p">.</span><span class="n">Headers</span><span class="p">.</span><span class="n">Authorization</span> <span class="p">==</span> <span class="k">null</span> <span class="p">||</span> <span class="n">request</span><span class="p">.</span><span class="n">Headers</span><span class="p">.</span><span class="n">Authorization</span><span class="p">.</span><span class="n">Parameter</span> <span class="p">==</span> <span class="k">null</span><span class="p">)</span>
</span><span class='line'>      <span class="k">return</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>    <span class="n">authorizationParameter</span> <span class="p">=</span> <span class="n">request</span><span class="p">.</span><span class="n">Headers</span><span class="p">.</span><span class="n">Authorization</span><span class="p">.</span><span class="n">Parameter</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>Step 2: Wire Your Handler to Your Configuration</h3>

<p>Somewhere, you probably have a class that sets up your WebAPI configuration. You need to add this line to your configuration.</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='csharp'><span class='line'><span class="k">private</span> <span class="k">static</span> <span class="k">void</span> <span class="nf">ConfigureMessageHandlers</span><span class="p">(</span><span class="n">HttpConfiguration</span> <span class="n">config</span><span class="p">)</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>  <span class="n">config</span><span class="p">.</span><span class="n">MessageHandlers</span><span class="p">.</span><span class="n">Add</span><span class="p">(</span><span class="k">new</span> <span class="n">AuthorizationHeaderHandler</span><span class="p">());</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<h3>Step 3: Add an Authorization Header to Your Requests</h3>

<p>For this to work, you&rsquo;ll need to add an authorization header to all of your requests. It needs to be in the following format.</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='csharp'><span class='line'><span class="n">Authorization</span><span class="p">:</span> <span class="p">&lt;</span><span class="n">scheme</span><span class="p">&gt;</span> <span class="p">&lt;</span><span class="n">parameter</span><span class="p">&gt;</span>
</span></code></pre></td></tr></table></div></figure>


<p>Here&rsquo;s a sample. (No don&rsquo;t actually use this token. It&rsquo;s just the SHA256 hash of <code>Hello, World!</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='csharp'><span class='line'><span class="n">Authorization</span><span class="p">:</span> <span class="n">Token</span> <span class="n">DFFD6021BB2BD5B0AF676290809EC3A53191DD81C7F70A4B28688A362182986F</span>
</span></code></pre></td></tr></table></div></figure>


<h3>Step 4: Test With and Without an Authorization Header</h3>

<p>Fire up <a href="http://fiddler2.com">Fiddler</a>. Let&rsquo;s create a request without an authorization header.</p>

<p>The request.</p>

<p><img class="center" src="http://jarrettmeyer.com/images/content/2014/01/webapi-request-without-auth-header.png"></p>

<p>The reponse. We can see the <code>401 Unauthorized</code> coming back from the server.</p>

<p><img class="center" src="http://jarrettmeyer.com/images/content/2014/01/webapi-response-without-auth-header.png"></p>

<p>Now, let&rsquo;s look at the same request with an authorization header.</p>

<p><img class="center" src="http://jarrettmeyer.com/images/content/2014/01/webapi-request-with-auth-header.png"></p>

<p>The response. Now with more <code>200 OK</code>.</p>

<p><img class="center" src="http://jarrettmeyer.com/images/content/2014/01/webapi-response-with-auth-header.png"></p>

<p>We&rsquo;re successfully grabbing the token from the request. Everything else is left as an exercise for the reader!</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Unit Testing an MVC Authorize Attribute]]></title>
    <link href="http://jarrettmeyer.com/blog/2014/01/14/unit-testing-an-mvc-authorize-attribute/"/>
    <updated>2014-01-14T08:00:00-05:00</updated>
    <id>http://jarrettmeyer.com/blog/2014/01/14/unit-testing-an-mvc-authorize-attribute</id>
    <content type="html"><![CDATA[<p>When working with unit tests, I usually consider it a code smell when you have more fixture setup than production code. Today, I ran into just that condition.</p>

<p>This class has been written for a while, but it wasn&rsquo;t covered by any tests. I decided to change that. First, I&rsquo;ll show you the class. <a href="https://github.com/jarrettmeyer/portfolio-mvc/blob/master/src/Portfolio/Lib/SessionBasedAuthorizeAttibute.cs">The class under question</a> is called <code>SessionBasedAuthorizeAttribute</code>. It looks to the ASP.NET session to get the username, instead of relying on a forms 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>
<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='csharp'><span class='line'><span class="k">public</span> <span class="k">class</span> <span class="nc">SessionBasedAuthorizeAttibute</span> <span class="p">:</span> <span class="n">AuthorizeAttribute</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>  <span class="k">protected</span> <span class="k">override</span> <span class="kt">bool</span> <span class="nf">AuthorizeCore</span><span class="p">(</span><span class="n">HttpContextBase</span> <span class="n">httpContext</span><span class="p">)</span>
</span><span class='line'>  <span class="p">{</span>
</span><span class='line'>    <span class="c1">// If the session object has not yet been created, then there is nothing</span>
</span><span class='line'>    <span class="c1">// we can do with this authorization.</span>
</span><span class='line'>    <span class="k">if</span> <span class="p">(</span><span class="n">httpContext</span><span class="p">.</span><span class="n">Session</span> <span class="p">==</span> <span class="k">null</span><span class="p">)</span>
</span><span class='line'>      <span class="k">return</span> <span class="k">false</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>    <span class="n">IHttpSessionAdapter</span> <span class="n">httpSessionAdapter</span> <span class="p">=</span> <span class="n">HttpSessionAdapter</span><span class="p">.</span><span class="n">Deserialize</span><span class="p">(</span><span class="n">httpContext</span><span class="p">.</span><span class="n">Session</span><span class="p">);</span>
</span><span class='line'>    <span class="k">if</span> <span class="p">(</span><span class="n">httpSessionAdapter</span><span class="p">.</span><span class="n">IsAuthenticated</span><span class="p">)</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>      <span class="n">SetHttpContextUser</span><span class="p">(</span><span class="n">httpContext</span><span class="p">,</span> <span class="n">httpSessionAdapter</span><span class="p">);</span>
</span><span class='line'>      <span class="k">return</span> <span class="k">true</span><span class="p">;</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>    <span class="k">else</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>      <span class="k">return</span> <span class="k">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="k">private</span> <span class="k">static</span> <span class="k">void</span> <span class="nf">SetHttpContextUser</span><span class="p">(</span><span class="n">HttpContextBase</span> <span class="n">httpContext</span><span class="p">,</span> <span class="n">IHttpSessionAdapter</span> <span class="n">httpSession</span><span class="p">)</span>
</span><span class='line'>  <span class="p">{</span>
</span><span class='line'>    <span class="kt">var</span> <span class="n">mediator</span> <span class="p">=</span> <span class="n">Mediator</span><span class="p">.</span><span class="n">Instance</span><span class="p">;</span>
</span><span class='line'>    <span class="kt">var</span> <span class="n">query</span> <span class="p">=</span> <span class="k">new</span> <span class="n">UserByUsernameQuery</span><span class="p">(</span><span class="n">httpSession</span><span class="p">.</span><span class="n">Username</span><span class="p">);</span>
</span><span class='line'>    <span class="kt">var</span> <span class="n">user</span> <span class="p">=</span> <span class="n">mediator</span><span class="p">.</span><span class="n">Request</span><span class="p">(</span><span class="n">query</span><span class="p">);</span>
</span><span class='line'>    <span class="n">httpContext</span><span class="p">.</span><span class="n">User</span> <span class="p">=</span> <span class="n">user</span> <span class="p">??</span> <span class="k">new</span> <span class="n">Guest</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>Writing your own <code>AuthorizeAttibute</code> isn&rsquo;t difficult. It&rsquo;s just a few lines, really, to pull a value from session, fetch a user from the database, and set the user. But what about unit testing?</p>

<p><a href="https://github.com/jarrettmeyer/portfolio-mvc/blob/master/src/Portfolio.Tests/Lib/SessionBasedAuthorizeAttribute_Tests.cs">Here&rsquo;s the result</a>.</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>
</pre></td><td class='code'><pre><code class='csharp'><span class='line'><span class="na">[TestFixture]</span>
</span><span class='line'><span class="k">public</span> <span class="k">class</span> <span class="nc">SessionBasedAuthorizeAttribute_Tests</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>  <span class="k">private</span> <span class="n">AuthorizeAttribute</span> <span class="n">attribute</span><span class="p">;</span>
</span><span class='line'>  <span class="k">private</span> <span class="n">AuthorizationContext</span> <span class="n">authorizationContext</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'><span class="na">  [SetUp]</span>
</span><span class='line'>  <span class="k">public</span> <span class="k">void</span> <span class="nf">Before_each_test</span><span class="p">()</span>
</span><span class='line'>  <span class="p">{</span>
</span><span class='line'>    <span class="n">attribute</span> <span class="p">=</span> <span class="k">new</span> <span class="n">SessionBasedAuthorizeAttibute</span><span class="p">();</span>
</span><span class='line'>
</span><span class='line'>    <span class="kt">var</span> <span class="n">controller</span> <span class="p">=</span> <span class="k">new</span> <span class="n">FakeController</span><span class="p">();</span>
</span><span class='line'>    <span class="n">MvcTest</span><span class="p">.</span><span class="n">SetupControllerContext</span><span class="p">(</span><span class="n">controller</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>    <span class="n">authorizationContext</span> <span class="p">=</span> <span class="k">new</span> <span class="n">AuthorizationContext</span><span class="p">();</span>
</span><span class='line'>    <span class="n">authorizationContext</span><span class="p">.</span><span class="n">Controller</span> <span class="p">=</span> <span class="n">controller</span><span class="p">;</span>
</span><span class='line'>    <span class="n">authorizationContext</span><span class="p">.</span><span class="n">HttpContext</span> <span class="p">=</span> <span class="n">controller</span><span class="p">.</span><span class="n">HttpContext</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>    <span class="kt">var</span> <span class="n">controllerDescriptor</span> <span class="p">=</span> <span class="k">new</span> <span class="n">ReflectedControllerDescriptor</span><span class="p">(</span><span class="k">typeof</span><span class="p">(</span><span class="n">FakeController</span><span class="p">));</span>
</span><span class='line'>    <span class="kt">var</span> <span class="n">method</span> <span class="p">=</span> <span class="k">typeof</span><span class="p">(</span><span class="n">FakeController</span><span class="p">).</span><span class="n">GetMethod</span><span class="p">(</span><span class="s">&quot;Nothing&quot;</span><span class="p">);</span>
</span><span class='line'>    <span class="n">authorizationContext</span><span class="p">.</span><span class="n">ActionDescriptor</span> <span class="p">=</span> <span class="k">new</span> <span class="n">ReflectedActionDescriptor</span><span class="p">(</span><span class="n">method</span><span class="p">,</span> <span class="s">&quot;Nothing&quot;</span><span class="p">,</span> <span class="n">controllerDescriptor</span><span class="p">);</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="na">  [Test]</span>
</span><span class='line'>  <span class="k">public</span> <span class="k">void</span> <span class="nf">Fails_when_session_is_not_authenticated</span><span class="p">()</span>
</span><span class='line'>  <span class="p">{</span>
</span><span class='line'>    <span class="n">SetupSession</span><span class="p">(</span><span class="k">false</span><span class="p">);</span>
</span><span class='line'>    <span class="n">Authorize</span><span class="p">();</span>
</span><span class='line'>    <span class="n">AssertUnauthorized</span><span class="p">();</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="na">  [Test]</span>
</span><span class='line'>  <span class="k">public</span> <span class="k">void</span> <span class="nf">Fails_when_session_is_null</span><span class="p">()</span>
</span><span class='line'>  <span class="p">{</span>
</span><span class='line'>    <span class="n">Mock</span><span class="p">.</span><span class="n">Get</span><span class="p">(</span><span class="n">authorizationContext</span><span class="p">.</span><span class="n">HttpContext</span><span class="p">).</span><span class="n">SetupGet</span><span class="p">(</span><span class="n">x</span> <span class="p">=&gt;</span> <span class="n">x</span><span class="p">.</span><span class="n">Session</span><span class="p">).</span><span class="n">Returns</span><span class="p">((</span><span class="n">HttpSessionStateBase</span><span class="p">)</span><span class="k">null</span><span class="p">);</span>
</span><span class='line'>    <span class="n">Authorize</span><span class="p">();</span>
</span><span class='line'>    <span class="n">AssertUnauthorized</span><span class="p">();</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="na">  [Test]</span>
</span><span class='line'>  <span class="k">public</span> <span class="k">void</span> <span class="nf">Succeeds_when_session_is_authenticated</span><span class="p">()</span>
</span><span class='line'>  <span class="p">{</span>
</span><span class='line'>    <span class="n">SetupSession</span><span class="p">(</span><span class="k">true</span><span class="p">);</span>
</span><span class='line'>    <span class="n">SetupServices</span><span class="p">();</span>
</span><span class='line'>    <span class="n">Authorize</span><span class="p">();</span>
</span><span class='line'>    <span class="n">AssertSuccess</span><span class="p">();</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">void</span> <span class="nf">AssertSuccess</span><span class="p">()</span>
</span><span class='line'>  <span class="p">{</span>
</span><span class='line'>    <span class="kt">var</span> <span class="n">user</span> <span class="p">=</span> <span class="n">authorizationContext</span><span class="p">.</span><span class="n">HttpContext</span><span class="p">.</span><span class="n">User</span><span class="p">;</span>
</span><span class='line'>    <span class="n">user</span><span class="p">.</span><span class="n">Should</span><span class="p">().</span><span class="n">BeOfType</span><span class="p">&lt;</span><span class="n">User</span><span class="p">&gt;();</span>
</span><span class='line'>    <span class="n">user</span><span class="p">.</span><span class="n">Identity</span><span class="p">.</span><span class="n">IsAuthenticated</span><span class="p">.</span><span class="n">Should</span><span class="p">().</span><span class="n">BeTrue</span><span class="p">();</span>
</span><span class='line'>    <span class="n">user</span><span class="p">.</span><span class="n">Identity</span><span class="p">.</span><span class="n">Name</span><span class="p">.</span><span class="n">Should</span><span class="p">().</span><span class="n">Be</span><span class="p">(</span><span class="s">&quot;tester&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">private</span> <span class="k">void</span> <span class="nf">AssertUnauthorized</span><span class="p">()</span>
</span><span class='line'>  <span class="p">{</span>
</span><span class='line'>    <span class="n">authorizationContext</span><span class="p">.</span><span class="n">Result</span><span class="p">.</span><span class="n">Should</span><span class="p">().</span><span class="n">BeOfType</span><span class="p">&lt;</span><span class="n">HttpUnauthorizedResult</span><span class="p">&gt;();</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">void</span> <span class="nf">Authorize</span><span class="p">()</span>
</span><span class='line'>  <span class="p">{</span>
</span><span class='line'>    <span class="n">attribute</span><span class="p">.</span><span class="n">OnAuthorization</span><span class="p">(</span><span class="n">authorizationContext</span><span class="p">);</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">void</span> <span class="nf">SetupServices</span><span class="p">()</span>
</span><span class='line'>  <span class="p">{</span>
</span><span class='line'>    <span class="kt">var</span> <span class="n">mediator</span> <span class="p">=</span> <span class="k">new</span> <span class="n">Mock</span><span class="p">&lt;</span><span class="n">IMediator</span><span class="p">&gt;();</span>
</span><span class='line'>    <span class="n">mediator</span><span class="p">.</span><span class="n">Setup</span><span class="p">(</span><span class="n">x</span> <span class="p">=&gt;</span> <span class="n">x</span><span class="p">.</span><span class="n">Request</span><span class="p">(</span><span class="n">It</span><span class="p">.</span><span class="n">IsAny</span><span class="p">&lt;</span><span class="n">UserByUsernameQuery</span><span class="p">&gt;())).</span><span class="n">Returns</span><span class="p">(</span><span class="k">new</span> <span class="n">User</span> <span class="p">{</span> <span class="n">Username</span> <span class="p">=</span> <span class="s">&quot;tester&quot;</span> <span class="p">});</span>
</span><span class='line'>    <span class="n">Mediator</span><span class="p">.</span><span class="n">Instance</span> <span class="p">=</span> <span class="n">mediator</span><span class="p">.</span><span class="n">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">private</span> <span class="k">void</span> <span class="nf">SetupSession</span><span class="p">(</span><span class="kt">bool</span> <span class="n">isAuthorized</span> <span class="p">=</span> <span class="k">true</span><span class="p">)</span>
</span><span class='line'>  <span class="p">{</span>
</span><span class='line'>    <span class="kt">var</span> <span class="n">mockContext</span> <span class="p">=</span> <span class="n">Mock</span><span class="p">.</span><span class="n">Get</span><span class="p">(</span><span class="n">authorizationContext</span><span class="p">.</span><span class="n">HttpContext</span><span class="p">);</span>
</span><span class='line'>    <span class="kt">var</span> <span class="n">mockSession</span> <span class="p">=</span> <span class="k">new</span> <span class="n">Mock</span><span class="p">&lt;</span><span class="n">HttpSessionStateBase</span><span class="p">&gt;();</span>
</span><span class='line'>    <span class="n">mockSession</span><span class="p">.</span><span class="n">SetupGet</span><span class="p">(</span><span class="n">x</span> <span class="p">=&gt;</span> <span class="n">x</span><span class="p">[</span><span class="s">&quot;IsAuthenticated&quot;</span><span class="p">]).</span><span class="n">Returns</span><span class="p">(</span><span class="n">isAuthorized</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>    <span class="c1">// Return the mock.</span>
</span><span class='line'>    <span class="n">mockContext</span><span class="p">.</span><span class="n">SetupGet</span><span class="p">(</span><span class="n">x</span> <span class="p">=&gt;</span> <span class="n">x</span><span class="p">.</span><span class="n">Session</span><span class="p">).</span><span class="n">Returns</span><span class="p">(</span><span class="n">mockSession</span><span class="p">.</span><span class="n">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">internal</span> <span class="k">class</span> <span class="nc">FakeController</span> <span class="p">:</span> <span class="n">Controller</span>
</span><span class='line'>  <span class="p">{</span>
</span><span class='line'>    <span class="k">public</span> <span class="n">ActionResult</span> <span class="nf">Nothing</span><span class="p">()</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>      <span class="k">return</span> <span class="k">new</span> <span class="nf">EmptyResult</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>By the way, there&rsquo;s even more setup code that happens as a part of the <code>MvcTest.SetupControllerContext()</code> method call, but I had already written that for another purpose.</p>

<h3>13 lines of production code. 25 lines of fixture setup.</h3>

<p>It turns out, that&rsquo;s much more difficult, because we are relying on a lot of the inner guts of MVC. I had to pull up the source code for the <code>OnAuthorize</code> method to see what all the <code>NullReferenceException</code>s were. When mocking out the <code>HttpContext</code>, you also have to mock out the <code>Session</code> (knew that) and <code>Items</code> (didn&rsquo;t know that) properties. There are also some <code>ActionDescriptor</code> values that must be set for <code>OnAuthorize</code> to work, and I have never worked with those classes before, either.</p>

<p>I suppose the first conclusion is to praise the powers at Microsoft for <a href="http://aspnetwebstack.codeplex.com">open sourcing the MVC framework</a>. Without access to the source, I would have never been able to write these tests. Even with the source, the terrible nature of the <code>NullReferenceException</code> made this much more difficult than it ought to be. Any time you have a chain of <code>w.x.y.z</code>, finding which of those threw the exception becomes a total PITA. Yeah, I know. The <a href="http://en.wikipedia.org/wiki/Law_of_Demeter">Law of Demeter</a> is in play, too.</p>

<p><em>Check out <a href="http://jarrettmeyer.com/blog/2013/12/30/learning-code-contracts/">Code Contracts</a>. It makes this kind of in-code documentation much easier.</em></p>

<p>The second conclusion is the value of this kind of test. I&rsquo;ve already had one coworker respond with, &ldquo;this is where I begin to question the value add of unit testing.&rdquo; I kinda have to agree with him. This was a hard test to write, even though the production code itself was quite easy. On one extreme, <a href="http://butunclebob.com/ArticleS.UncleBob.AgilePeopleStillDontGetIt">some people</a> say that if it is important enough to write, then it is important enough to test. I think I agree with that sentiment. I believe in the value of testing. I&rsquo;m just not sure what I could have done to make this testing easier and still remain within the bounds set by the MVC framework.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[BCrypt Is Slow]]></title>
    <link href="http://jarrettmeyer.com/blog/2014/01/13/bcrypt-is-slow/"/>
    <updated>2014-01-13T06:23:23-05:00</updated>
    <id>http://jarrettmeyer.com/blog/2014/01/13/bcrypt-is-slow</id>
    <content type="html"><![CDATA[<p>For some reason, this just made my day.</p>

<p><img class="center" src="http://jarrettmeyer.com/images/content/2014/01/bcrypt-is-slow.png"></p>

<p>See those yellow dots? That&rsquo;s <a href="http://www.ncrunch.net">NCrunch</a> telling me that these tests are slow. It&rsquo;s <a href="http://en.wikipedia.org/wiki/Bcrypt">BCrypt</a>. It&rsquo;s supposed to be slow! That&rsquo;s the whole point of using BCrypt. If you&rsquo;re storing passwords, it&rsquo;s the only hashing algorithm you should be using.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[JavaScript Objects]]></title>
    <link href="http://jarrettmeyer.com/blog/2014/01/08/javascript-objects/"/>
    <updated>2014-01-08T08:00:00-05:00</updated>
    <id>http://jarrettmeyer.com/blog/2014/01/08/javascript-objects</id>
    <content type="html"><![CDATA[<p>This is always a good topic to review. There are just too many developers who don&rsquo;t know what they are doing when it comes to writing <em>good</em> JavaScript. The code for this project has been <a href="https://github.com/jarrettmeyer/speaker.js">published to Github</a>.</p>

<h3>Understanding Scope</h3>

<p>The first thing we must understand is how variables are scoped in JavaScript. When it comes to JS: there&rsquo;s only one rule.</p>

<blockquote><p>Variables are scoped to the function that defines them.</p></blockquote>

<p>There&rsquo;s no concept of block scope like in C# or Java. This means that we&rsquo;re going to make use of something called a functional closure.</p>

<h3>The Specs</h3>

<p>Specs are a wonderful way of defining how a class should work. Don&rsquo;t tell me this is <a href="http://en.wikipedia.org/wiki/Big_Design_Up_Front">BDUF</a> or not how <a href="http://en.wikipedia.org/wiki/Test-driven_development">TDD</a> is supposed to work. Both of these methodologies would say to only write one test, then write the code. Repeat until you are finished. This is why I refuse to strictly follow a dogma. If you know the specs up front, then write the specs.</p>

<p>The following tests are written with the <a href="http://pivotal.github.io/jasmine/">Jasmine</a> unit testing framework.</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">describe</span><span class="p">(</span><span class="s2">&quot;Speaker&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;can be instantiated&quot;</span><span class="p">);</span>                     <span class="c1">// 1.</span>
</span><span class='line'>  <span class="nx">it</span><span class="p">(</span><span class="s2">&quot;has a name attribute&quot;</span><span class="p">);</span>                    <span class="c1">// 2.</span>
</span><span class='line'>  <span class="nx">it</span><span class="p">(</span><span class="s2">&quot;can change the name in the constructor&quot;</span><span class="p">);</span>  <span class="c1">// 3.</span>
</span><span class='line'>  <span class="nx">it</span><span class="p">(</span><span class="s2">&quot;returns the expected message&quot;</span><span class="p">);</span>            <span class="c1">// 4.</span>
</span><span class='line'>  <span class="nx">it</span><span class="p">(</span><span class="s2">&quot;adds the message to an output buffer&quot;</span><span class="p">);</span>    <span class="c1">// 5.</span>
</span><span class='line'>  <span class="nx">it</span><span class="p">(</span><span class="s2">&quot;counts the number of times spoken&quot;</span><span class="p">);</span>       <span class="c1">// 6.</span>
</span><span class='line'>  <span class="nx">it</span><span class="p">(</span><span class="s2">&quot;counts the number of things said&quot;</span><span class="p">);</span>        <span class="c1">// 7.</span>
</span><span class='line'>
</span><span class='line'><span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>


<h3>Declaring the Constructor</h3>

<figure 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">var</span> <span class="nx">Speaker</span> <span class="o">=</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="kd">function</span> <span class="nx">Speaker</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="k">return</span> <span class="nx">Speaker</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>Yes, we had to type the name of the class three times and the word <code>function</code> twice. I&rsquo;m sorry.</p>

<h3>The Functional Closure</h3>

<p>The above code example is a functional closure. The more you work with good JavaScript, the more you&rsquo;ll see this pattern. <em>Yes, it&rsquo;s a lot of character noise. I&rsquo;m sorry Ruby developers.</em></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="p">(</span><span class="kd">function</span><span class="p">(){})();</span>
</span></code></pre></td></tr></table></div></figure>


<p>The above line creates an anonymous function that is executed immediately. In this example, we are creating a new <code>Speaker</code> function and then returning that function. The functional closure will let us hide variables that we don&rsquo;t want exposed outside of class.</p>

<p>This will let us create new instances of our <code>Speaker</code> 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='javascript'><span class='line'><span class="kd">var</span> <span class="nx">speaker</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">Speaker</span><span class="p">();</span> <span class="c1">// Passes #1.</span>
</span></code></pre></td></tr></table></div></figure>


<h3>Objects Are Instances of Functions</h3>

<p>What syntax makes <code>function Speaker()</code> any different from <code>function speaker()</code>? Nothing at all. The only reason that we are capitalizing <code>Speaker</code> is by convention of those who have come before us.</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">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="k">typeof</span> <span class="nx">Speaker</span><span class="p">);</span>   <span class="c1">// returns &quot;function&quot;</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">speaker</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">Speaker</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="k">typeof</span> <span class="nx">speaker</span><span class="p">);</span>   <span class="c1">// returns &quot;object&quot;</span>
</span></code></pre></td></tr></table></div></figure>


<h3>Adding Properties</h3>

<p>We also think our speaker should have a name. I like to know to whom I am speaking.</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="kd">var</span> <span class="nx">Speaker</span> <span class="o">=</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="kd">function</span> <span class="nx">Speaker</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">name</span> <span class="o">=</span> <span class="s2">&quot;Ann&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">Speaker</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>We can now test that the speaker really does have a <code>name</code> attribute 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='javascript'><span class='line'><span class="nx">it</span><span class="p">(</span><span class="s2">&quot;has a name attribute&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">speaker</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">Speaker</span><span class="p">();</span>
</span><span class='line'>  <span class="nx">expect</span><span class="p">(</span><span class="nx">speaker</span><span class="p">.</span><span class="nx">name</span><span class="p">).</span><span class="nx">toBe</span><span class="p">(</span><span class="s2">&quot;Ann&quot;</span><span class="p">);</span> <span class="c1">// Passes #2.</span>
</span><span class='line'><span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>


<h3>Constructor Options</h3>

<p>We should get used to using an options object in our JavaScript. Instead of having an explicit list of arguments, we instead accept a single options object as a method parameter. Remembering that JavaScript does not have a compiler, this allows us to be very clear about the expected inputs to our methods.</p>

<p>Having an options parameter also lets us set some defaults. Both <a href="http://jquery.com">jQuery</a> and <a href="http://underscorejs.org">Underscore</a> have an <code>extend</code> method that let us map settings. They both do the exact same thing. For no particular reason, I&rsquo;m choosing Underscore over jQuery.</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">var</span> <span class="nx">Speaker</span> <span class="o">=</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="kd">var</span> <span class="nx">defaults</span> <span class="o">=</span> <span class="p">{</span>
</span><span class='line'>    <span class="nx">name</span><span class="o">:</span> <span class="s2">&quot;Ann&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">Speaker</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">this</span><span class="p">.</span><span class="nx">options</span> <span class="o">=</span> <span class="nx">_</span><span class="p">.</span><span class="nx">extend</span><span class="p">({},</span> <span class="nx">defaults</span><span class="p">,</span> <span class="nx">options</span><span class="p">);</span>
</span><span class='line'>    <span class="k">this</span><span class="p">.</span><span class="nx">name</span> <span class="o">=</span> <span class="k">this</span><span class="p">.</span><span class="nx">options</span><span class="p">.</span><span class="nx">name</span><span class="p">;</span> <span class="c1">// Passes #3.</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">Speaker</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>So, by default, our speaker will be named &ldquo;Ann,&rdquo; but we can still change it by adding a name attribute to our <code>options</code> argument.</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="kd">var</span> <span class="nx">speaker</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">Speaker</span><span class="p">({</span> <span class="nx">name</span><span class="o">:</span> <span class="s2">&quot;Bonnie&quot;</span> <span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>


<p>Also, notice that the defaults are private to the functional closure. There is no way to access these defaults from outside the <code>Speaker</code> object. While we can access <code>speaker.options.name</code>, we cannot, in any way, access <code>speaker.defaults</code>.</p>

<h3>Adding a Functional Prototype</h3>

<p>To expose a public function, we need to use the prototype attribute.</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="kd">var</span> <span class="nx">Speaker</span> <span class="o">=</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="kd">var</span> <span class="nx">defaults</span> <span class="o">=</span> <span class="p">{</span>
</span><span class='line'>    <span class="nx">name</span><span class="o">:</span> <span class="s2">&quot;Ann&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">Speaker</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">this</span><span class="p">.</span><span class="nx">options</span> <span class="o">=</span> <span class="nx">_</span><span class="p">.</span><span class="nx">extend</span><span class="p">({},</span> <span class="nx">defaults</span><span class="p">,</span> <span class="nx">options</span><span class="p">);</span>
</span><span class='line'>    <span class="k">this</span><span class="p">.</span><span class="nx">name</span> <span class="o">=</span> <span class="k">this</span><span class="p">.</span><span class="nx">options</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">Speaker</span><span class="p">.</span><span class="nx">prototype</span><span class="p">.</span><span class="nx">say</span> <span class="o">=</span> <span class="kd">function</span><span class="p">(</span><span class="nx">toSay</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">message</span> <span class="o">=</span> <span class="s1">&#39;&quot;&#39;</span> <span class="o">+</span> <span class="nx">toSay</span> <span class="o">+</span> <span class="s1">&#39;,&quot; said &#39;</span> <span class="o">+</span> <span class="k">this</span><span class="p">.</span><span class="nx">name</span> <span class="o">+</span> <span class="s1">&#39;.&#39;</span><span class="p">;</span>
</span><span class='line'>    <span class="k">return</span> <span class="nx">message</span><span class="p">;</span> <span class="c1">// Passes #4.</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">Speaker</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>


<h3>Duck Typing</h3>

<p>I&rsquo;m not going to get into duck typing today. A lot has already been said by developers much smarter than I. Check out Eric Lippert&rsquo;s <a href="http://ericlippert.com/2014/01/02/what-is-duck-typing/">post</a> and Phil Haack&rsquo;s <a href="http://haacked.com/archive/2014/01/04/duck-typing/">first</a> and <a href="http://haacked.com/archive/2014/01/06/quack-like-a-duck/">second</a> posts. Instead, here&rsquo;s the short, short version&hellip;</p>

<blockquote><p>I&rsquo;m going to call something - a method or property - and you had better just &ldquo;work.&rdquo;</p></blockquote>

<p>That&rsquo;s all we are going to do with the output buffer in this case. I&rsquo;m going to call a <code>.write()</code> method. I don&rsquo;t care what you give me, but I&rsquo;m going to call that method.</p>

<p>We&rsquo;re going to go back to our constructor here.</p>

<ul>
<li>AlertBuffer: Writes to <code>window.alert</code>.</li>
<li>ConsoleBuffer: Writes to <code>console.log</code>.</li>
<li>MemoryBuffer: Writes to an internal array.</li>
</ul>


<p>I wrote all three versions. They are available in the repository linked above. Here&rsquo;s the code for the <code>MemoryBuffer</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>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="kd">var</span> <span class="nx">MemoryBuffer</span> <span class="o">=</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">function</span> <span class="nx">MemoryBuffer</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">messages</span> <span class="o">=</span> <span class="p">[];</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'>  <span class="nx">MemoryBuffer</span><span class="p">.</span><span class="nx">prototype</span><span class="p">.</span><span class="nx">write</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="k">this</span><span class="p">.</span><span class="nx">messages</span><span class="p">.</span><span class="nx">push</span><span class="p">(</span><span class="nx">message</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>We&rsquo;ll set our buffer in the constructor of <code>Speaker</code>. We&rsquo;ll go ahead and default to the <code>MemoryBuffer</code>. If you want the <code>MemoryBuffer</code>, then leave it alone. If not, then give us a new buffer when you create your <code>Speaker</code> instance.</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">var</span> <span class="nx">Speaker</span> <span class="o">=</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="kd">var</span> <span class="nx">defaults</span> <span class="o">=</span> <span class="p">{</span>
</span><span class='line'>    <span class="nx">buffer</span><span class="o">:</span> <span class="k">new</span> <span class="nx">MemoryBuffer</span><span class="p">(),</span>
</span><span class='line'>    <span class="nx">name</span><span class="o">:</span> <span class="s2">&quot;Ann&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">Speaker</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">this</span><span class="p">.</span><span class="nx">options</span> <span class="o">=</span> <span class="nx">_</span><span class="p">.</span><span class="nx">extend</span><span class="p">({},</span> <span class="nx">defaults</span><span class="p">,</span> <span class="nx">options</span><span class="p">);</span>
</span><span class='line'>    <span class="k">this</span><span class="p">.</span><span class="nx">name</span> <span class="o">=</span> <span class="k">this</span><span class="p">.</span><span class="nx">options</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">Speaker</span><span class="p">.</span><span class="nx">prototype</span><span class="p">.</span><span class="nx">say</span> <span class="o">=</span> <span class="kd">function</span><span class="p">(</span><span class="nx">toSay</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">message</span> <span class="o">=</span> <span class="s1">&#39;&quot;&#39;</span> <span class="o">+</span> <span class="nx">toSay</span> <span class="o">+</span> <span class="s1">&#39;,&quot; said &#39;</span> <span class="o">+</span> <span class="k">this</span><span class="p">.</span><span class="nx">name</span> <span class="o">+</span> <span class="s1">&#39;.&#39;</span><span class="p">;</span>
</span><span class='line'>    <span class="k">this</span><span class="p">.</span><span class="nx">options</span><span class="p">.</span><span class="nx">buffer</span><span class="p">.</span><span class="nx">write</span><span class="p">(</span><span class="nx">message</span><span class="p">);</span> <span class="c1">// Passes #5.</span>
</span><span class='line'>    <span class="k">return</span> <span class="nx">message</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">Speaker</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>


<h3>Creating a Private Function</h3>

<p>Now we want to create a private function. This function needs to be exposed to the <code>Speaker</code> instance, but not outside of the instance. We can&rsquo;t use a prototype for this, so how do we accomplish this? Answer: we just create a method inside of the function. This will scope it locally, preventing it from being exposed.</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>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="kd">var</span> <span class="nx">Speaker</span> <span class="o">=</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="kd">var</span> <span class="nx">defaults</span> <span class="o">=</span> <span class="p">{</span>
</span><span class='line'>    <span class="nx">buffer</span><span class="o">:</span> <span class="k">new</span> <span class="nx">MemoryBuffer</span><span class="p">(),</span>
</span><span class='line'>    <span class="nx">name</span><span class="o">:</span> <span class="s2">&quot;Ann&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">Speaker</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">this</span><span class="p">.</span><span class="nx">options</span> <span class="o">=</span> <span class="nx">_</span><span class="p">.</span><span class="nx">extend</span><span class="p">({},</span> <span class="nx">defaults</span><span class="p">,</span> <span class="nx">options</span><span class="p">);</span>
</span><span class='line'>    <span class="k">this</span><span class="p">.</span><span class="nx">name</span> <span class="o">=</span> <span class="k">this</span><span class="p">.</span><span class="nx">options</span><span class="p">.</span><span class="nx">name</span><span class="p">;</span>
</span><span class='line'>    <span class="k">this</span><span class="p">.</span><span class="nx">thingsSaid</span> <span class="o">=</span> <span class="p">[];</span>
</span><span class='line'>    <span class="k">this</span><span class="p">.</span><span class="nx">timesSpoken</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><span class='line'>  <span class="nx">Speaker</span><span class="p">.</span><span class="nx">prototype</span><span class="p">.</span><span class="nx">say</span> <span class="o">=</span> <span class="kd">function</span><span class="p">(</span><span class="nx">toSay</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">message</span> <span class="o">=</span> <span class="s1">&#39;&quot;&#39;</span> <span class="o">+</span> <span class="nx">toSay</span> <span class="o">+</span> <span class="s1">&#39;,&quot; said &#39;</span> <span class="o">+</span> <span class="k">this</span><span class="p">.</span><span class="nx">name</span> <span class="o">+</span> <span class="s1">&#39;.&#39;</span><span class="p">;</span>
</span><span class='line'>    <span class="k">this</span><span class="p">.</span><span class="nx">options</span><span class="p">.</span><span class="nx">buffer</span><span class="p">.</span><span class="nx">write</span><span class="p">(</span><span class="nx">message</span><span class="p">);</span>
</span><span class='line'>    <span class="nx">addToThingsSaid</span><span class="p">(</span><span class="k">this</span><span class="p">,</span> <span class="nx">toSay</span><span class="p">);</span>
</span><span class='line'>    <span class="k">this</span><span class="p">.</span><span class="nx">timesSpoken</span> <span class="o">+=</span> <span class="mi">1</span><span class="p">;</span> <span class="c1">// Passes #7.</span>
</span><span class='line'>    <span class="k">return</span> <span class="nx">message</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">addToThingsSaid</span><span class="p">(</span><span class="nx">speaker</span><span class="p">,</span> <span class="nx">toSay</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">_</span><span class="p">.</span><span class="nx">contains</span><span class="p">(</span><span class="nx">speaker</span><span class="p">.</span><span class="nx">thingsSaid</span><span class="p">,</span> <span class="nx">toSay</span><span class="p">))</span> <span class="p">{</span>
</span><span class='line'>      <span class="nx">speaker</span><span class="p">.</span><span class="nx">thingsSaid</span><span class="p">.</span><span class="nx">push</span><span class="p">(</span><span class="nx">toSay</span><span class="p">);</span> <span class="c1">// Passes #6.</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">Speaker</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>With that, we will now pass all of our specs.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Relying on Unreliable IDs]]></title>
    <link href="http://jarrettmeyer.com/blog/2014/01/03/relying-on-unreliable-ids/"/>
    <updated>2014-01-03T11:45:32-05:00</updated>
    <id>http://jarrettmeyer.com/blog/2014/01/03/relying-on-unreliable-ids</id>
    <content type="html"><![CDATA[<p>Relying on IDs means that we are checking that a value set by the database. This may be an autoincrementing value &mdash; a SQL Server identity or an Oracle sequence.</p>

<h3>Why This Happens?</h3>

<p>This anti-pattern occurs because it is thought to be easier to hard code values into the software than to make changes to the database schema. When the schema is wrong, fix it!</p>

<h3>Example: Include/Exclude by Value</h3>

<p>In this case, this particular department is a virtual department, not a real department, and we don&rsquo;t want it displayed in this particular UI screen.</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='csharp'><span class='line'><span class="kt">var</span> <span class="n">departments</span> <span class="p">=</span> <span class="n">departmentRepository</span><span class="p">.</span><span class="n">Where</span><span class="p">(</span><span class="n">d</span> <span class="p">=&gt;</span> <span class="n">d</span><span class="p">.</span><span class="n">ID</span> <span class="p">!=</span> <span class="m">6</span><span class="p">).</span><span class="n">ToList</span><span class="p">();</span>
</span></code></pre></td></tr></table></div></figure>


<p>However, in this program, the ID column is a SQL Server identity. The value of 6 was assigned to the row in the developer&rsquo;s environment. However, there are three more environments to consider: QA, Staging, and Production.</p>

<p>There are two anti-patterns to this approach.</p>

<ol>
<li>It assumes that data will be entered in the exact same order. It also assumes that if there was a mistake before, the mistake would be repeated, since a failed insert will increment the identity.</li>
<li>It assumes there will never be another department that we wish to exclude.</li>
</ol>


<h4>Solution: alter the schema to reflect the intent</h4>

<p>The solution is to alter the database to reflect this 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>
</pre></td><td class='code'><pre><code class='sql'><span class='line'><span class="k">ALTER</span> <span class="k">TABLE</span> <span class="p">[</span><span class="n">departments</span><span class="p">]</span> <span class="k">ADD</span> <span class="p">[</span><span class="n">exclude_from_user_management_ui</span><span class="p">]</span> <span class="nb">BIT</span> <span class="k">NOT</span> <span class="k">NULL</span> <span class="k">DEFAULT</span> <span class="p">(</span><span class="mi">0</span><span class="p">);</span>
</span><span class='line'><span class="k">UPDATE</span> <span class="p">[</span><span class="n">departments</span><span class="p">]</span> <span class="k">SET</span> <span class="p">[</span><span class="n">exclude_from_user_management_ui</span><span class="p">]</span> <span class="o">=</span> <span class="mi">1</span> <span class="k">WHERE</span> <span class="p">[</span><span class="n">id</span><span class="p">]</span> <span class="o">=</span> <span class="mi">6</span><span class="p">;</span>
</span></code></pre></td></tr></table></div></figure>


<p>The application code is now extremely easy to understand, and there is no reliance on &ldquo;magic&rdquo; values.</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='csharp'><span class='line'><span class="kt">var</span> <span class="n">departments</span> <span class="p">=</span> <span class="n">departmentRepository</span><span class="p">.</span><span class="n">Where</span><span class="p">(</span><span class="n">d</span> <span class="p">=&gt;</span> <span class="n">d</span><span class="p">.</span><span class="n">ExcludeFromUserManagementUI</span> <span class="p">==</span> <span class="k">false</span><span class="p">).</span><span class="n">ToList</span><span class="p">();</span>
</span></code></pre></td></tr></table></div></figure>


<h3>Example: Setting a Default Value</h3>

<p>In this example, we are using a value to reflect that something should have a default setting.</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='csharp'><span class='line'><span class="kt">var</span> <span class="n">task</span> <span class="p">=</span> <span class="k">new</span> <span class="n">Task</span><span class="p">();</span>
</span><span class='line'><span class="n">task</span><span class="p">.</span><span class="n">Description</span> <span class="p">=</span> <span class="s">&quot;Be more awesome!&quot;</span><span class="p">;</span>
</span><span class='line'><span class="n">task</span><span class="p">.</span><span class="n">Status</span> <span class="p">=</span> <span class="n">statuses</span><span class="p">.</span><span class="n">First</span><span class="p">(</span><span class="n">s</span> <span class="p">=&gt;</span> <span class="n">s</span><span class="p">.</span><span class="n">ID</span> <span class="p">==</span> <span class="s">&quot;new&quot;</span><span class="p">);</span>
</span><span class='line'><span class="n">task</span><span class="p">.</span><span class="n">CreatedAt</span> <span class="p">=</span> <span class="n">DateTime</span><span class="p">.</span><span class="n">UtcNow</span><span class="p">;</span>
</span></code></pre></td></tr></table></div></figure>


<p>Again, this assumes that the &ldquo;new&rdquo; status will always be present. If you, ask the developer have complete control over the environments and deployments, then this <strong>does</strong> work. Also, you&rsquo;re luckier than I, since I have never been at a client where I have complete control over deployments.</p>

<h4>Solution: alter the schema to reflect the intent</h4>

<figure 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='sql'><span class='line'><span class="k">ALTER</span> <span class="k">TABLE</span> <span class="p">[</span><span class="n">statuses</span><span class="p">]</span> <span class="k">ADD</span> <span class="p">[</span><span class="n">is_default</span><span class="p">]</span> <span class="nb">BIT</span> <span class="k">NOT</span> <span class="k">NULL</span> <span class="k">DEFAULT</span> <span class="p">(</span><span class="mi">0</span><span class="p">);</span>
</span><span class='line'><span class="k">UPDATE</span> <span class="k">TABLE</span> <span class="p">[</span><span class="n">statuses</span><span class="p">]</span> <span class="k">SET</span> <span class="p">[</span><span class="n">is_default</span><span class="p">]</span> <span class="o">=</span> <span class="mi">1</span> <span class="k">WHERE</span> <span class="p">[</span><span class="n">id</span><span class="p">]</span> <span class="o">=</span> <span class="s1">&#39;new&#39;</span><span class="p">;</span>
</span></code></pre></td></tr></table></div></figure>


<p>The application code is similarly trivial.</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='csharp'><span class='line'><span class="kt">var</span> <span class="n">task</span> <span class="p">=</span> <span class="k">new</span> <span class="n">Task</span><span class="p">();</span>
</span><span class='line'><span class="n">task</span><span class="p">.</span><span class="n">Description</span> <span class="p">=</span> <span class="s">&quot;Be more awesome!&quot;</span><span class="p">;</span>
</span><span class='line'><span class="n">task</span><span class="p">.</span><span class="n">Status</span> <span class="p">=</span> <span class="n">statuses</span><span class="p">.</span><span class="n">First</span><span class="p">(</span><span class="n">s</span> <span class="p">=&gt;</span> <span class="n">s</span><span class="p">.</span><span class="n">IsDefault</span><span class="p">);</span>
</span><span class='line'><span class="n">task</span><span class="p">.</span><span class="n">CreatedAt</span> <span class="p">=</span> <span class="n">DateTime</span><span class="p">.</span><span class="n">UtcNow</span><span class="p">;</span>
</span></code></pre></td></tr></table></div></figure>


<p>Now, whether the query for <code>.IsDefault</code> should be a call to <code>.First()</code> or <code>.Single()</code> is an argument I don&rsquo;t really want to get into. Ideally, it is probably correct that only one value can ever be the default value. However, I&rsquo;ve been places where I don&rsquo;t have any control over those particular administration screens, and the code quality is rather dubious. In that case, I chose the <code>.First()</code> method because I didn&rsquo;t want my code to break because of another developer&rsquo;s poor decisions.</p>

<p><em>Yes, I realize my code will still break if there are no default statuses.</em> The <code>[status_id]</code> column in the database is not nullable, so <code>.FirstOrDefault()</code> is just prolonging the issue.</p>

<p><strong>Lesson Learned:</strong> Don&rsquo;t rely on magic.</p>

<h3>See Also</h3>

<ul>
<li><a href="http://jarrettmeyer.com/post/3327407457/custom-rules-in-a-shared-application">Custom Rules in a Shared Application</a></li>
</ul>

]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[DRYing Up Controller Actions With Responders]]></title>
    <link href="http://jarrettmeyer.com/blog/2014/01/02/drying-up-controller-actions-with-responders/"/>
    <updated>2014-01-02T08:00:00-05:00</updated>
    <id>http://jarrettmeyer.com/blog/2014/01/02/drying-up-controller-actions-with-responders</id>
    <content type="html"><![CDATA[<p>I read a few books over the long weekend. One of those books was <a href="http://pragprog.com/book/jvrails2/crafting-rails-4-applications">Crafting Rails 4 Applications</a> by Jos&eacute; Valim. I&rsquo;m going to say that this is a pretty advanced book on Rails, since it really digs into the Rails framework internals, especially when it comes to overriding the default functionality.</p>

<p>One of the topics is how to DRY up your controllers by writing custom responders. That got me thinking. Can we do the same thing in .NET?</p>

<h3>The &ldquo;Before&rdquo;</h3>

<p>I have two controllers in my <a href="https://github.com/jarrettmeyer/portfolio-mvc">Portfolio application</a>: a <code>TagsController</code> and a <code>TasksController</code>. These controllers contain the following lines.</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='csharp'><span class='line'><span class="c1">// In TasksController</span>
</span><span class='line'><span class="na">[HttpDelete]</span>
</span><span class='line'><span class="k">public</span> <span class="n">ActionResult</span> <span class="nf">Delete</span><span class="p">(</span><span class="n">DeleteTaskCommand</span> <span class="n">command</span><span class="p">)</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>  <span class="kt">var</span> <span class="n">task</span> <span class="p">=</span> <span class="n">mediator</span><span class="p">.</span><span class="n">Send</span><span class="p">(</span><span class="n">command</span><span class="p">);</span>
</span><span class='line'>  <span class="kt">var</span> <span class="n">message</span> <span class="p">=</span> <span class="kt">string</span><span class="p">.</span><span class="n">Format</span><span class="p">(</span><span class="s">&quot;Successfully deleted task: {0}&quot;</span><span class="p">,</span> <span class="n">task</span><span class="p">.</span><span class="n">Title</span><span class="p">);</span>
</span><span class='line'>  <span class="k">this</span><span class="p">.</span><span class="n">Flash</span><span class="p">(</span><span class="s">&quot;success&quot;</span><span class="p">,</span> <span class="n">message</span><span class="p">);</span>
</span><span class='line'>  <span class="k">return</span> <span class="nf">Json</span><span class="p">(</span><span class="k">new</span> <span class="p">{</span> <span class="n">success</span> <span class="p">=</span> <span class="k">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">// In TagsController</span>
</span><span class='line'><span class="na">[HttpDelete]</span>
</span><span class='line'><span class="k">public</span> <span class="n">ActionResult</span> <span class="nf">Delete</span><span class="p">(</span><span class="n">DeleteTagCommand</span> <span class="n">command</span><span class="p">)</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>  <span class="kt">var</span> <span class="n">tag</span> <span class="p">=</span> <span class="n">mediator</span><span class="p">.</span><span class="n">Send</span><span class="p">(</span><span class="n">command</span><span class="p">);</span>
</span><span class='line'>  <span class="kt">var</span> <span class="n">message</span> <span class="p">=</span> <span class="kt">string</span><span class="p">.</span><span class="n">Format</span><span class="p">(</span><span class="s">&quot;Successfully deleted tag: {0}&quot;</span><span class="p">,</span> <span class="n">tag</span><span class="p">.</span><span class="n">Description</span><span class="p">));</span>
</span><span class='line'>  <span class="k">this</span><span class="p">.</span><span class="n">Flash</span><span class="p">(</span><span class="s">&quot;success&quot;</span><span class="p">,</span> <span class="n">message</span><span class="p">);</span>
</span><span class='line'>  <span class="k">return</span> <span class="nf">Json</span><span class="p">(</span><span class="k">new</span> <span class="p">{</span> <span class="n">success</span> <span class="p">=</span> <span class="k">true</span> <span class="p">});</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>That is some pretty similar code. In fact, that&rsquo;s about as un-DRY as you can get. One might say that&rsquo;s going to happen if you try to create some sort of standard in what your controllers and actions should look like.</p>

<h3>Delete Is Easy</h3>

<p>Notice that <code>[HttpDelete]</code> attribute on our <code>Delete()</code> methods? That means that the only way these methods are ever going to be called is via XHR. Currently, no browsers can create a <code>DELETE</code> request without the support of JavaScript. That means that our controller pattern has no reason to be complicated.</p>

<h3>The DeleteResponder</h3>

<p>It&rsquo;s pretty obvious what we&rsquo;re trying to achieve here, so let&rsquo;s start by creating a branch and stubbing out some tests.</p>

<pre><code>&gt; git checkout -b responder-spike
</code></pre>

<p>Writing out your tests first is a good way to define a spec, so let&rsquo;s do that. We can already tell what happens in our controller action, and we want our responder to mimic this behavior.</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='csharp'><span class='line'><span class="k">public</span> <span class="k">class</span> <span class="nc">DeleteResponderTests</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>  <span class="k">private</span> <span class="n">DeleteResponder</span> <span class="n">deleteResponder</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'><span class="na">  [SetUp]</span>
</span><span class='line'>  <span class="k">public</span> <span class="k">void</span> <span class="nf">Before_each_test</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="na">  [Test]</span>
</span><span class='line'>  <span class="k">public</span> <span class="k">void</span> <span class="nf">It_should_send_a_request_to_the_mediator</span><span class="p">()</span>
</span><span class='line'>  <span class="p">{</span>
</span><span class='line'>    <span class="n">Assert</span><span class="p">.</span><span class="n">Fail</span><span class="p">();</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="na">  [Test]</span>
</span><span class='line'>  <span class="k">public</span> <span class="k">void</span> <span class="nf">It_should_add_a_successful_flash_message</span><span class="p">()</span>
</span><span class='line'>  <span class="p">{</span>
</span><span class='line'>    <span class="n">Assert</span><span class="p">.</span><span class="n">Fail</span><span class="p">();</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="na">  [Test]</span>
</span><span class='line'>  <span class="k">public</span> <span class="k">void</span> <span class="nf">It_should_have_an_expected_JSON_result</span><span class="p">()</span>
</span><span class='line'>  <span class="p">{</span>
</span><span class='line'>    <span class="n">Assert</span><span class="p">.</span><span class="n">Fail</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>What is our responder going to look like? I have a good idea what I think it should look like up front.</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='csharp'><span class='line'><span class="k">public</span> <span class="k">class</span> <span class="nc">DeleteResponder</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>  <span class="k">private</span> <span class="k">readonly</span> <span class="n">ApplicationController</span> <span class="n">controller</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">public</span> <span class="nf">DeleteResponder</span><span class="p">(</span><span class="n">ApplicationController</span> <span class="n">controller</span><span class="p">)</span>
</span><span class='line'>  <span class="p">{</span>
</span><span class='line'>    <span class="k">if</span> <span class="p">(</span><span class="n">controller</span> <span class="p">==</span> <span class="k">null</span><span class="p">)</span> <span class="k">throw</span> <span class="k">new</span> <span class="n">ArgumentNullException</span><span class="p">(</span><span class="s">&quot;controller&quot;</span><span class="p">);</span>
</span><span class='line'>    <span class="k">this</span><span class="p">.</span><span class="n">controller</span> <span class="p">=</span> <span class="n">controller</span><span class="p">;</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">public</span> <span class="n">ActionResult</span> <span class="n">RespondWith</span><span class="p">&lt;</span><span class="n">T</span><span class="p">&gt;(</span><span class="n">IMediator</span> <span class="n">mediator</span><span class="p">,</span> <span class="n">ICommand</span><span class="p">&lt;</span><span class="n">T</span><span class="p">&gt;</span> <span class="n">command</span><span class="p">)</span>
</span><span class='line'>  <span class="p">{</span>
</span><span class='line'>    <span class="k">throw</span> <span class="k">new</span> <span class="nf">NotImplementedException</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>The easiest part is to send the command to the mediator. We can write that test fairly easily. We&rsquo;re also going to need a fake controller.</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='csharp'><span class='line'><span class="k">public</span> <span class="k">class</span> <span class="nc">DeleteResponderTests</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>  <span class="k">private</span> <span class="n">ICommand</span><span class="p">&lt;</span><span class="kt">object</span><span class="p">&gt;</span> <span class="n">command</span><span class="p">;</span>
</span><span class='line'>  <span class="k">private</span> <span class="n">DeleteResponder</span> <span class="n">deleteResponder</span><span class="p">;</span>
</span><span class='line'>  <span class="k">private</span> <span class="n">Mock</span><span class="p">&lt;</span><span class="n">IMediator</span><span class="p">&gt;</span> <span class="n">mockMediator</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'><span class="na">  [SetUp]</span>
</span><span class='line'>  <span class="k">public</span> <span class="k">void</span> <span class="nf">Before_each_test</span><span class="p">()</span>
</span><span class='line'>  <span class="p">{</span>
</span><span class='line'>    <span class="n">mockMediator</span> <span class="p">=</span> <span class="k">new</span> <span class="n">Mock</span><span class="p">&lt;</span><span class="n">IMediator</span><span class="p">&gt;</span> <span class="p">{</span> <span class="n">DefaultValue</span> <span class="p">=</span> <span class="n">DefaultValue</span><span class="p">.</span><span class="n">Mock</span> <span class="p">};</span>
</span><span class='line'>    <span class="n">deleteResponder</span> <span class="p">=</span> <span class="k">new</span> <span class="n">DeleteResponder</span><span class="p">(</span><span class="k">new</span> <span class="n">FakeController</span><span class="p">());</span>
</span><span class='line'>    <span class="n">command</span> <span class="p">=</span> <span class="k">new</span> <span class="n">FakeCommand</span><span class="p">();</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="na">  [Test]</span>
</span><span class='line'>  <span class="k">public</span> <span class="k">void</span> <span class="nf">It_should_send_a_command_to_the_mediator</span><span class="p">()</span>
</span><span class='line'>  <span class="p">{</span>
</span><span class='line'>    <span class="n">deleteResponder</span><span class="p">.</span><span class="n">RespondWith</span><span class="p">(</span><span class="n">mockMediator</span><span class="p">.</span><span class="n">Object</span><span class="p">,</span> <span class="n">command</span><span class="p">);</span>
</span><span class='line'>    <span class="n">mockMediator</span><span class="p">.</span><span class="n">Verify</span><span class="p">(</span><span class="n">x</span> <span class="p">=&gt;</span> <span class="n">x</span><span class="p">.</span><span class="n">Send</span><span class="p">(</span><span class="n">command</span><span class="p">));</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">class</span> <span class="nc">FakeCommand</span> <span class="p">:</span> <span class="n">ICommand</span><span class="p">&lt;</span><span class="kt">object</span><span class="p">&gt;</span> <span class="p">{</span> <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">class</span> <span class="nc">FakeController</span> <span class="p">:</span> <span class="n">Controller</span> <span class="p">{</span> <span class="p">}</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>This command implementation is extremely 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>
</pre></td><td class='code'><pre><code class='csharp'><span class='line'><span class="k">public</span> <span class="n">ActionResult</span> <span class="n">RespondWith</span><span class="p">&lt;</span><span class="n">T</span><span class="p">&gt;(</span><span class="n">IMediator</span> <span class="n">mediator</span><span class="p">,</span> <span class="n">ICommand</span><span class="p">&lt;</span><span class="n">T</span><span class="p">&gt;</span> <span class="n">command</span><span class="p">)</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>  <span class="n">mediator</span><span class="p">.</span><span class="n">Send</span><span class="p">(</span><span class="n">command</span><span class="p">);</span>
</span><span class='line'>  <span class="k">return</span> <span class="k">null</span><span class="p">;</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>Next, we want to make sure that the JSON result is returned appropriately.</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='csharp'><span class='line'><span class="na">[Test]</span>
</span><span class='line'><span class="k">public</span> <span class="k">void</span> <span class="nf">It_should_have_an_expected_JSON_result</span><span class="p">()</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>  <span class="kt">var</span> <span class="n">result</span> <span class="p">=</span> <span class="n">deleteResponder</span><span class="p">.</span><span class="n">RespondWith</span><span class="p">(</span><span class="n">mockMediator</span><span class="p">.</span><span class="n">Object</span><span class="p">,</span> <span class="n">command</span><span class="p">);</span>
</span><span class='line'>  <span class="kt">var</span> <span class="n">jsonResult</span> <span class="p">=</span> <span class="n">MvcTest</span><span class="p">.</span><span class="n">HasExpectedActionResult</span><span class="p">&lt;</span><span class="n">JsonResult</span><span class="p">&gt;(</span><span class="n">result</span><span class="p">);</span>
</span><span class='line'>  <span class="kt">var</span> <span class="n">objectDictionary</span> <span class="p">=</span> <span class="n">jsonResult</span><span class="p">.</span><span class="n">Data</span><span class="p">.</span><span class="n">ToDictionary</span><span class="p">();</span>
</span><span class='line'>  <span class="n">Assert</span><span class="p">.</span><span class="n">IsTrue</span><span class="p">(</span><span class="n">objectDictionary</span><span class="p">[</span><span class="s">&quot;success&quot;</span><span class="p">]);</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>This implementation is also fairly 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>
<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='csharp'><span class='line'><span class="k">public</span> <span class="n">ActionResult</span> <span class="n">RespondWith</span><span class="p">&lt;</span><span class="n">T</span><span class="p">&gt;(</span><span class="n">IMediator</span> <span class="n">mediator</span><span class="p">,</span> <span class="n">ICommand</span><span class="p">&lt;</span><span class="n">T</span><span class="p">&gt;</span> <span class="n">command</span><span class="p">)</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>  <span class="n">mediator</span><span class="p">.</span><span class="n">Send</span><span class="p">(</span><span class="n">command</span><span class="p">);</span>
</span><span class='line'>  <span class="kt">var</span> <span class="n">jsonResult</span> <span class="p">=</span> <span class="k">new</span> <span class="n">JsonResult</span><span class="p">();</span>
</span><span class='line'>  <span class="n">jsonResult</span><span class="p">.</span><span class="n">Data</span> <span class="p">=</span> <span class="k">new</span>
</span><span class='line'>  <span class="p">{</span>
</span><span class='line'>    <span class="n">success</span> <span class="p">=</span> <span class="k">true</span>
</span><span class='line'>  <span class="p">};</span>
</span><span class='line'>  <span class="k">return</span> <span class="n">jsonResult</span><span class="p">;</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>The only remaining piece is how we add the flash message. I&rsquo;m actually going to leave this piece alone. If you want to see how I did it, then check out my version of the <a href="https://github.com/jarrettmeyer/portfolio-mvc/blob/master/src/Portfolio/Lib/DeleteResponder.cs">DeleteResponder</a>.</p>

<h3>The &ldquo;After&rdquo;</h3>

<p>Our <code>TagsController</code> and <code>TasksController</code> now look like the following:</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='csharp'><span class='line'><span class="c1">// TagsController</span>
</span><span class='line'><span class="na">[HttpDelete]</span>
</span><span class='line'><span class="k">public</span> <span class="n">ActionResult</span> <span class="nf">Delete</span><span class="p">(</span><span class="n">DeleteTagCommand</span> <span class="n">command</span><span class="p">)</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>  <span class="k">return</span> <span class="k">new</span> <span class="nf">DeleteResponder</span><span class="p">(</span><span class="k">this</span><span class="p">)</span>
</span><span class='line'>      <span class="p">.</span><span class="n">RespondWith</span><span class="p">(</span><span class="n">mediator</span><span class="p">,</span> <span class="n">command</span><span class="p">);</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// TasksController</span>
</span><span class='line'><span class="na">[HttpDelete]</span>
</span><span class='line'><span class="k">public</span> <span class="n">ActionResult</span> <span class="nf">Delete</span><span class="p">(</span><span class="n">DeleteTaskCommand</span> <span class="n">command</span><span class="p">)</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>  <span class="k">return</span> <span class="k">new</span> <span class="nf">DeleteResponder</span><span class="p">(</span><span class="k">this</span><span class="p">)</span>
</span><span class='line'>      <span class="p">.</span><span class="n">RespondWith</span><span class="p">(</span><span class="n">mediator</span><span class="p">,</span> <span class="n">command</span><span class="p">);</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>Eight total lines of code become two total lines of code, and the common functionality is moved to a utility class.</p>

<p>Also, just because the delete is easy, that doesn&rsquo;t mean that everything has to be difficult. Your controllers should be rather thin. They invoke a service. They do a query. They return an <code>ActionResult</code>. This responder pattern can be applied to any form post.</p>
]]></content>
  </entry>
  
</feed>
