<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
 
 <title>testomatic - thinking about building things</title>
 <link href="http://testomatic.co.uk/atom.xml" rel="self"/>
 <link href="http://testomatic.co.uk/"/>
 <updated>2010-03-26T17:51:45+00:00</updated>
 <id>http://testomatic.co.uk/</id>
 <author>
   <name>testomatic</name>
 </author>

 
	
	 <entry>
	   <title>SessionRecord for demonstrating persistence</title>
	   <link href="http://testomatic.co.uk/posts/2010/03/20/session-record-for-demonstrating-persistence/"/>
	   <updated>2010-03-20T00:00:00+00:00</updated>
	   <id>http://testomatic.co.uk/posts/2010/03/20/session-record-for-demonstrating-persistence/</id>
	   <content type="html">&lt;p&gt;I recently needed a simple model type object with CRUD operations and persistence to demonstrate some new PHP controller and routing software. Setting up the persistence layer in a database seemed to involve a lot of overhead, assuming that anyone wanting to run the demo has the time and privileges involved. It is also a shared repository of data - the demo will allow people to create, update and delete whatever they like - which may cause some issues.&lt;/p&gt;

&lt;p&gt;Instead of using a database for the persistence I instead decided to store the data in a session variable. This mitigates any setup required and allows users to add and edit the data in their own personal sandbox. SessionRecord is a simple wrapper around storing data in the user&amp;#8217;s session, it provides familiar methods for CRUD operations on your models.&lt;/p&gt;

&lt;p&gt;It requires PHP 5.3 as it makes use of late static binding and a few lambdas here and there. It provides &amp;#8230;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Simple data fixture set up&lt;/li&gt;

&lt;li&gt;Per user persistence of data&lt;/li&gt;

&lt;li&gt;Usual record type model finders, getters, setters, save, delete functionality&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The code is on Github at &lt;a href='http://github.com/testomatic/examples/tree/master/php/SessionRecord/'&gt;http://github.com/testomatic/examples/tree/master/php/SessionRecord/&lt;/a&gt;&lt;/p&gt;

&lt;h2 id='creating_a_model_with_sessionrecord'&gt;Creating a model with SessionRecord&lt;/h2&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='php'&gt;&lt;span class='cp'&gt;&amp;lt;?php&lt;/span&gt; 
    
    &lt;span class='k'&gt;require&lt;/span&gt; &lt;span class='s1'&gt;&amp;#39;SessionRecord.php&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
    
    &lt;span class='sd'&gt;/**&lt;/span&gt;
&lt;span class='sd'&gt;     * Create a Book model type, $_namespace is used to store data in the session, &lt;/span&gt;
&lt;span class='sd'&gt;     * think of it as an SQL table name :)&lt;/span&gt;
&lt;span class='sd'&gt;     */&lt;/span&gt;
    &lt;span class='k'&gt;class&lt;/span&gt; &lt;span class='nc'&gt;Book&lt;/span&gt; &lt;span class='k'&gt;extends&lt;/span&gt; &lt;span class='nx'&gt;SessionRecord&lt;/span&gt;
    &lt;span class='p'&gt;{&lt;/span&gt;
        &lt;span class='k'&gt;protected&lt;/span&gt; &lt;span class='k'&gt;static&lt;/span&gt; &lt;span class='nv'&gt;$_namespace&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='s1'&gt;&amp;#39;books&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
    &lt;span class='p'&gt;}&lt;/span&gt;
    
    &lt;span class='sd'&gt;/** &lt;/span&gt;
&lt;span class='sd'&gt;     * You can init some data, this will happen the first time &lt;/span&gt;
&lt;span class='sd'&gt;     * the $_SESSION object is created&lt;/span&gt;
&lt;span class='sd'&gt;     */&lt;/span&gt;
    &lt;span class='nx'&gt;Book&lt;/span&gt;&lt;span class='o'&gt;::&lt;/span&gt;&lt;span class='na'&gt;init&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;
        &lt;span class='k'&gt;array&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;
            &lt;span class='k'&gt;array&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;
                &lt;span class='s1'&gt;&amp;#39;title&amp;#39;&lt;/span&gt;  &lt;span class='o'&gt;=&amp;gt;&lt;/span&gt; &lt;span class='s1'&gt;&amp;#39;Cider with Rosie&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt;
                &lt;span class='s1'&gt;&amp;#39;author&amp;#39;&lt;/span&gt; &lt;span class='o'&gt;=&amp;gt;&lt;/span&gt; &lt;span class='s1'&gt;&amp;#39;Laurie Lee&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt;
                &lt;span class='s1'&gt;&amp;#39;id&amp;#39;&lt;/span&gt;     &lt;span class='o'&gt;=&amp;gt;&lt;/span&gt; &lt;span class='m'&gt;1&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt;
            &lt;span class='p'&gt;),&lt;/span&gt;
            &lt;span class='k'&gt;array&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;
                &lt;span class='s1'&gt;&amp;#39;title&amp;#39;&lt;/span&gt;  &lt;span class='o'&gt;=&amp;gt;&lt;/span&gt; &lt;span class='s1'&gt;&amp;#39;Lord of the Flies&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt;
                &lt;span class='s1'&gt;&amp;#39;author&amp;#39;&lt;/span&gt; &lt;span class='o'&gt;=&amp;gt;&lt;/span&gt; &lt;span class='s1'&gt;&amp;#39;William Golding&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt;  
                &lt;span class='s1'&gt;&amp;#39;id&amp;#39;&lt;/span&gt;     &lt;span class='o'&gt;=&amp;gt;&lt;/span&gt; &lt;span class='m'&gt;2&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt;                              
            &lt;span class='p'&gt;)&lt;/span&gt;                           
        &lt;span class='p'&gt;)&lt;/span&gt;   
    &lt;span class='p'&gt;);&lt;/span&gt;
    
    &lt;span class='sd'&gt;/**&lt;/span&gt;
&lt;span class='sd'&gt;     * We then have some of the usual finder type functionality &lt;/span&gt;
&lt;span class='sd'&gt;     */&lt;/span&gt;
    &lt;span class='nv'&gt;$books&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='nx'&gt;Book&lt;/span&gt;&lt;span class='o'&gt;::&lt;/span&gt;&lt;span class='na'&gt;findAll&lt;/span&gt;&lt;span class='p'&gt;();&lt;/span&gt;                         &lt;span class='c1'&gt;// array() of objects&lt;/span&gt;
    &lt;span class='nv'&gt;$books&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='nx'&gt;Book&lt;/span&gt;&lt;span class='o'&gt;::&lt;/span&gt;&lt;span class='na'&gt;findAllBy&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s1'&gt;&amp;#39;author&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='s1'&gt;&amp;#39;Laurie Lee&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt; &lt;span class='c1'&gt;// array() of objects by Laurie Lee&lt;/span&gt;
    &lt;span class='nv'&gt;$book&lt;/span&gt;  &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='nx'&gt;Book&lt;/span&gt;&lt;span class='o'&gt;::&lt;/span&gt;&lt;span class='na'&gt;findFirstBy&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s1'&gt;&amp;#39;id&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='s1'&gt;&amp;#39;1&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;            &lt;span class='c1'&gt;// object with id 1 or false&lt;/span&gt;
        
    &lt;span class='sd'&gt;/**&lt;/span&gt;
&lt;span class='sd'&gt;     * You can create a new Book which gets stored to $_SESSION and assigned an ID&lt;/span&gt;
&lt;span class='sd'&gt;     */&lt;/span&gt;
    &lt;span class='nv'&gt;$book&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='nx'&gt;Book&lt;/span&gt;&lt;span class='o'&gt;::&lt;/span&gt;&lt;span class='na'&gt;create&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='k'&gt;array&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s1'&gt;&amp;#39;title&amp;#39;&lt;/span&gt; &lt;span class='o'&gt;=&amp;gt;&lt;/span&gt; &lt;span class='s1'&gt;&amp;#39;A Moment of War&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='s1'&gt;&amp;#39;author&amp;#39;&lt;/span&gt; &lt;span class='o'&gt;=&amp;gt;&lt;/span&gt; &lt;span class='s1'&gt;&amp;#39;Laurie Lee&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;));&lt;/span&gt;
    &lt;span class='nv'&gt;$book&lt;/span&gt;&lt;span class='o'&gt;-&amp;gt;&lt;/span&gt;&lt;span class='na'&gt;id&lt;/span&gt; &lt;span class='c1'&gt;// 3&lt;/span&gt;
    
    &lt;span class='sd'&gt;/**&lt;/span&gt;
&lt;span class='sd'&gt;     * You can modify and save a Book&lt;/span&gt;
&lt;span class='sd'&gt;     */&lt;/span&gt;
    &lt;span class='nv'&gt;$book&lt;/span&gt;&lt;span class='o'&gt;-&amp;gt;&lt;/span&gt;&lt;span class='na'&gt;title&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='s1'&gt;&amp;#39;As I Walked Out One Midsummer Morning&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
    &lt;span class='nv'&gt;$book&lt;/span&gt;&lt;span class='o'&gt;-&amp;gt;&lt;/span&gt;&lt;span class='na'&gt;save&lt;/span&gt;&lt;span class='p'&gt;();&lt;/span&gt;
    
    &lt;span class='sd'&gt;/**&lt;/span&gt;
&lt;span class='sd'&gt;     * Or delete it from the storage &lt;/span&gt;
&lt;span class='sd'&gt;     */&lt;/span&gt;
    &lt;span class='nv'&gt;$book&lt;/span&gt;&lt;span class='o'&gt;-&amp;gt;&lt;/span&gt;&lt;span class='na'&gt;delete&lt;/span&gt;&lt;span class='p'&gt;();&lt;/span&gt;
    
    &lt;span class='sd'&gt;/**&lt;/span&gt;
&lt;span class='sd'&gt;     * And if you want to clear all the data in $_SESSION&lt;/span&gt;
&lt;span class='sd'&gt;     */&lt;/span&gt;
    &lt;span class='nx'&gt;Book&lt;/span&gt;&lt;span class='o'&gt;::&lt;/span&gt;&lt;span class='na'&gt;reset&lt;/span&gt;&lt;span class='p'&gt;();&lt;/span&gt;
    
&lt;span class='cp'&gt;?&amp;gt;&lt;/span&gt;&lt;span class='x' /&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;</content>
	 </entry>
	
 
	
	 <entry>
	   <title>Useful UNIX shell commands</title>
	   <link href="http://testomatic.co.uk/posts/2010/03/17/useful-unix-shell-commands/"/>
	   <updated>2010-03-17T00:00:00+00:00</updated>
	   <id>http://testomatic.co.uk/posts/2010/03/17/useful-unix-shell-commands/</id>
	   <content type="html">&lt;p&gt;It&amp;#8217;s great to be able to harnessing the power of the unix shell, here&amp;#8217;s some favourite commands &amp;#8230;&lt;/p&gt;

&lt;h2 id='id1'&gt;&lt;code&gt;uptime&lt;/code&gt;&lt;/h2&gt;

&lt;p&gt;How long has your system been running for? If you hate the power switch as much as me there&amp;#8217;s a perverse enjoyment in this one. Currently on 24 days as I type, good old macbook!&lt;/p&gt;

&lt;h2 id='id2'&gt;&lt;code&gt;history&lt;/code&gt;&lt;/h2&gt;

&lt;p&gt;List all your recent command history. This is great if you pipe to &lt;code&gt;grep&lt;/code&gt; also, can&amp;#8217;t remember the exact arguments you typed last time?&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='bash'&gt;&lt;span class='nv'&gt;$:&lt;/span&gt; &lt;span class='nb'&gt;history&lt;/span&gt; | grep some-command
32  some-command
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;Notice the number next to the output, that&amp;#8217;s the number of the entry in your history log. Want to re-run &lt;code&gt;some-command&lt;/code&gt; just type &lt;code&gt;!32&lt;/code&gt;.&lt;/p&gt;

&lt;h2 id='id3'&gt;&lt;code&gt;svn diff | mate&lt;/code&gt;&lt;/h2&gt;

&lt;p&gt;It&amp;#8217;s really useful to do an SVN diff before you commit but if you just run it in the terminal the output can be hard to read. Textmate (Mac only sorry) has excellent highlighting and folding features for diff files and you can pipe the output from your SVN client straight into it.&lt;/p&gt;

&lt;h2 id='__'&gt;&lt;code&gt;pushd&lt;/code&gt;, &lt;code&gt;popd&lt;/code&gt;, &lt;code&gt;dirs&lt;/code&gt;&lt;/h2&gt;

&lt;p&gt;These three are really useful. Suppose your in one directory and want to jump out and have a root around elsewhere, you can use &lt;code&gt;pushd&lt;/code&gt; to jump to a new directory stack, if you want to go back to the previous stack just &lt;code&gt;pushd&lt;/code&gt; again. As you might expect &lt;code&gt;popd&lt;/code&gt; drops the current stack and puts you back on the previous one whilst &lt;code&gt;dirs&lt;/code&gt; lists all the directory stacks you&amp;#8217;ve created.&lt;/p&gt;

&lt;h2 id='id4'&gt;&lt;code&gt;ps -ax&lt;/code&gt;&lt;/h2&gt;

&lt;p&gt;Firefox locked up and crashed again? Can&amp;#8217;t be bothered to wait 15 minutes for eclipse to shut down? You can find out the process id of any running program with the &lt;code&gt;ps&lt;/code&gt; command. Again it&amp;#8217;s useful to use &lt;code&gt;grep&lt;/code&gt; here to search the output, next time you&amp;#8217;ve had enough of eclipse try this &amp;#8230;&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='bash'&gt;&lt;span class='nv'&gt;$ &lt;/span&gt;ps -ax | grep eclipse
81404 ??         0:16.92 /Applications/.../MacOS/eclipse
&lt;span class='nv'&gt;$ &lt;/span&gt;&lt;span class='nb'&gt;kill &lt;/span&gt;81404
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;</content>
	 </entry>
	
 
	
	 <entry>
	   <title>Rake tasks, options and arguments</title>
	   <link href="http://testomatic.co.uk/posts/2010/03/04/rake-tasks-with-command-line-options-and-arguments/"/>
	   <updated>2010-03-04T00:00:00+00:00</updated>
	   <id>http://testomatic.co.uk/posts/2010/03/04/rake-tasks-with-command-line-options-and-arguments/</id>
	   <content type="html">&lt;p&gt;I&amp;#8217;ve been starting to use &lt;a href='http://rake.rubyforge.org/'&gt;rake&lt;/a&gt; more and more recently. I find it to be a little more flexible than my old favourite build tool &lt;a href='http://ant.apache.org'&gt;ant&lt;/a&gt;. The ability to use all existing ruby gems and jump straight into ruby code is very flexible, but it still maintains the structure necessary for a practical build file. And hey, if it&amp;#8217;s good enough for &lt;a href='http://martinfowler.com/articles/rake.html'&gt;Martin Fowler&lt;/a&gt; then it&amp;#8217;s good enough for me right?&lt;/p&gt;

&lt;p&gt;Here&amp;#8217;s a few tips I found out whilst working on a recent build file, namely setting options via the command line and passing arguments to your tasks.&lt;/p&gt;

&lt;h2 id='passing_command_line_options_to_rake'&gt;Passing command line options to rake&lt;/h2&gt;

&lt;p&gt;This one is useful for setting global options, a little bit analogous to &lt;code&gt;-Dproperty=value&lt;/code&gt; for those of us from an ant background.&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='ruby'&gt;&lt;span class='n'&gt;rake&lt;/span&gt; &lt;span class='n'&gt;mytask&lt;/span&gt; &lt;span class='n'&gt;foo&lt;/span&gt;&lt;span class='o'&gt;=&lt;/span&gt;&lt;span class='n'&gt;bar&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;You can then pick up these options from the &lt;code&gt;ENV&lt;/code&gt; hash in your rake file.&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='ruby'&gt;&lt;span class='n'&gt;task&lt;/span&gt; &lt;span class='ss'&gt;:mytask&lt;/span&gt; &lt;span class='k'&gt;do&lt;/span&gt;
    &lt;span class='nb'&gt;puts&lt;/span&gt; &lt;span class='no'&gt;ENV&lt;/span&gt;&lt;span class='o'&gt;[&lt;/span&gt;&lt;span class='s2'&gt;&amp;quot;foo&amp;quot;&lt;/span&gt;&lt;span class='o'&gt;]&lt;/span&gt;
&lt;span class='k'&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;h2 id='passing_an_argument_to_a_rake_task_via_the_command_line'&gt;Passing an argument to a rake task via the command line&lt;/h2&gt;

&lt;p&gt;Passing arguments to specific commands allows you a bit more control over your build files. In the below example we pass two arguments with the values &lt;code&gt;foo&lt;/code&gt; and &lt;code&gt;bar&lt;/code&gt; through to our task.&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='ruby'&gt;&lt;span class='n'&gt;rake&lt;/span&gt; &lt;span class='n'&gt;mytask&lt;/span&gt;&lt;span class='o'&gt;[&lt;/span&gt;&lt;span class='n'&gt;foo&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='n'&gt;bar&lt;/span&gt;&lt;span class='o'&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;These can be picked up like this&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='ruby'&gt;&lt;span class='n'&gt;task&lt;/span&gt; &lt;span class='ss'&gt;:mytask&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='ss'&gt;:arg1&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='ss'&gt;:arg2&lt;/span&gt; &lt;span class='k'&gt;do&lt;/span&gt; &lt;span class='o'&gt;|&lt;/span&gt;&lt;span class='n'&gt;t&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='n'&gt;args&lt;/span&gt;&lt;span class='o'&gt;|&lt;/span&gt;
    &lt;span class='nb'&gt;puts&lt;/span&gt; &lt;span class='n'&gt;args&lt;/span&gt;&lt;span class='o'&gt;[&lt;/span&gt;&lt;span class='ss'&gt;:arg1&lt;/span&gt;&lt;span class='o'&gt;]&lt;/span&gt;
    &lt;span class='nb'&gt;puts&lt;/span&gt; &lt;span class='n'&gt;args&lt;/span&gt;&lt;span class='o'&gt;[&lt;/span&gt;&lt;span class='ss'&gt;:arg2&lt;/span&gt;&lt;span class='o'&gt;]&lt;/span&gt;	
&lt;span class='k'&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;Or if you have dependancies associated with your task the syntax is slightly different.&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='ruby'&gt;&lt;span class='n'&gt;task&lt;/span&gt; &lt;span class='ss'&gt;:mytask&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='o'&gt;[&lt;/span&gt;&lt;span class='ss'&gt;:arg1&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='ss'&gt;:arg2&lt;/span&gt;&lt;span class='o'&gt;]&lt;/span&gt; &lt;span class='o'&gt;=&amp;gt;&lt;/span&gt; &lt;span class='o'&gt;[&lt;/span&gt;&lt;span class='ss'&gt;:task&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='ss'&gt;:another_task&lt;/span&gt;&lt;span class='o'&gt;]&lt;/span&gt; &lt;span class='k'&gt;do&lt;/span&gt; &lt;span class='o'&gt;|&lt;/span&gt;&lt;span class='n'&gt;t&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='n'&gt;args&lt;/span&gt;&lt;span class='o'&gt;|&lt;/span&gt;
    &lt;span class='nb'&gt;puts&lt;/span&gt; &lt;span class='n'&gt;args&lt;/span&gt;&lt;span class='o'&gt;[&lt;/span&gt;&lt;span class='ss'&gt;:arg1&lt;/span&gt;&lt;span class='o'&gt;]&lt;/span&gt;
    &lt;span class='nb'&gt;puts&lt;/span&gt; &lt;span class='n'&gt;args&lt;/span&gt;&lt;span class='o'&gt;[&lt;/span&gt;&lt;span class='ss'&gt;:arg2&lt;/span&gt;&lt;span class='o'&gt;]&lt;/span&gt;	
&lt;span class='k'&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;And if you need some defaults you can add those too &amp;#8230;&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='ruby'&gt;&lt;span class='n'&gt;task&lt;/span&gt; &lt;span class='ss'&gt;:mytask&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='o'&gt;[&lt;/span&gt;&lt;span class='ss'&gt;:arg1&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='ss'&gt;:arg2&lt;/span&gt;&lt;span class='o'&gt;]&lt;/span&gt; &lt;span class='o'&gt;=&amp;gt;&lt;/span&gt; &lt;span class='o'&gt;[&lt;/span&gt;&lt;span class='ss'&gt;:task&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='ss'&gt;:another_task&lt;/span&gt;&lt;span class='o'&gt;]&lt;/span&gt; &lt;span class='k'&gt;do&lt;/span&gt; &lt;span class='o'&gt;|&lt;/span&gt;&lt;span class='n'&gt;t&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='n'&gt;args&lt;/span&gt;&lt;span class='o'&gt;|&lt;/span&gt;
    &lt;span class='n'&gt;args&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='n'&gt;with_defaults&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='ss'&gt;:arg1&lt;/span&gt; &lt;span class='o'&gt;=&amp;gt;&lt;/span&gt; &lt;span class='s1'&gt;&amp;#39;some value&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='ss'&gt;:arg2&lt;/span&gt; &lt;span class='o'&gt;=&amp;gt;&lt;/span&gt; &lt;span class='s1'&gt;&amp;#39;another value&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;
    &lt;span class='nb'&gt;puts&lt;/span&gt; &lt;span class='n'&gt;args&lt;/span&gt;&lt;span class='o'&gt;[&lt;/span&gt;&lt;span class='ss'&gt;:arg1&lt;/span&gt;&lt;span class='o'&gt;]&lt;/span&gt;
    &lt;span class='nb'&gt;puts&lt;/span&gt; &lt;span class='n'&gt;args&lt;/span&gt;&lt;span class='o'&gt;[&lt;/span&gt;&lt;span class='ss'&gt;:arg2&lt;/span&gt;&lt;span class='o'&gt;]&lt;/span&gt;	
&lt;span class='k'&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;</content>
	 </entry>
	
 
	
	 <entry>
	   <title>Dependency injection in ZF controllers</title>
	   <link href="http://testomatic.co.uk/posts/2010/02/26/dependency-injection-and-zf-controllers/"/>
	   <updated>2010-02-26T00:00:00+00:00</updated>
	   <id>http://testomatic.co.uk/posts/2010/02/26/dependency-injection-and-zf-controllers/</id>
	   <content type="html">&lt;p&gt;Following on from our recent article on &lt;a href='/2010/02/20/writing-testable-php-code.html'&gt;writing testable PHP code&lt;/a&gt;, it seems sensible to point out Ian Barber&amp;#8217;s article on &lt;a href='http://www.ibuildings.co.uk/blog/archives/1181-Dependency-Injection-and-Zend-Framework-Controllers.html'&gt;dependency injection for Zend Framework controllers&lt;/a&gt; over at the &lt;a href='http://www.ibuildings.co.uk'&gt;iBuildings&lt;/a&gt; site.&lt;/p&gt;

&lt;p&gt;The article outlines three approaches to injecting objects into your controllers. The first is via the &lt;a href='http://framework.zend.com/manual/en/zend.registry.html'&gt;Zend_Registry&lt;/a&gt; object, which should not be your preferred technique. Zend_Registry is just an over hyped singleton object and a perfect way of adding the dreaded global state to your application. Also, with this technique you mitigate and dependancy on your chosen objects for a dependency on the registry object itself, so your classes are still tightly coupled in a way.&lt;/p&gt;

&lt;p&gt;The second technique is via &lt;a href='http://framework.zend.com/manual/en/zend.controller.front.html'&gt;Zend_Controller_Front&lt;/a&gt; params. This has the benefit of decoupling your objects but still feels a little clunky in practice.&lt;/p&gt;

&lt;p&gt;The third and most interesting technique is to inject your objects via an &lt;a href='http://framework.zend.com/manual/en/zend.controller.actionhelpers.html'&gt;action helper&lt;/a&gt;. This technique works by taking advantage of the action helpers hooks into the dispatch loop. It&amp;#8217;s rather neat and provides a complete decoupling of your objects.&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='php'&gt;&lt;span class='cp'&gt;&amp;lt;?php&lt;/span&gt;
&lt;span class='sd'&gt;/**&lt;/span&gt;
&lt;span class='sd'&gt; * An action helper for injecting objects&lt;/span&gt;
&lt;span class='sd'&gt; */&lt;/span&gt;
&lt;span class='k'&gt;class&lt;/span&gt; &lt;span class='nc'&gt;MyApp_Helpers_SomeObjectInjector&lt;/span&gt; &lt;span class='k'&gt;extends&lt;/span&gt; &lt;span class='nx'&gt;Zend_Controller_Action_Helper_Abstract&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;
    
    &lt;span class='k'&gt;protected&lt;/span&gt; &lt;span class='nv'&gt;$_someObject&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
    
    &lt;span class='k'&gt;public&lt;/span&gt; &lt;span class='k'&gt;function&lt;/span&gt; &lt;span class='nf'&gt;init&lt;/span&gt;&lt;span class='p'&gt;()&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;
        &lt;span class='nv'&gt;$this&lt;/span&gt;&lt;span class='o'&gt;-&amp;gt;&lt;/span&gt;&lt;span class='na'&gt;_someObject&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='k'&gt;new&lt;/span&gt; &lt;span class='nx'&gt;MyApp_SomeObject&lt;/span&gt;&lt;span class='p'&gt;();&lt;/span&gt;
    &lt;span class='p'&gt;}&lt;/span&gt;

    &lt;span class='k'&gt;public&lt;/span&gt; &lt;span class='k'&gt;function&lt;/span&gt; &lt;span class='nf'&gt;preDispatch&lt;/span&gt;&lt;span class='p'&gt;()&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;
        &lt;span class='nv'&gt;$this&lt;/span&gt;&lt;span class='o'&gt;-&amp;gt;&lt;/span&gt;&lt;span class='na'&gt;getActionController&lt;/span&gt;&lt;span class='p'&gt;()&lt;/span&gt;&lt;span class='o'&gt;-&amp;gt;&lt;/span&gt;&lt;span class='na'&gt;setSomeObject&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nv'&gt;$this&lt;/span&gt;&lt;span class='o'&gt;-&amp;gt;&lt;/span&gt;&lt;span class='na'&gt;_someObject&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;
    &lt;span class='p'&gt;}&lt;/span&gt;
&lt;span class='p'&gt;}&lt;/span&gt;
&lt;span class='cp'&gt;?&amp;gt;&lt;/span&gt;&lt;span class='x' /&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;You can then set this up as a helper in your bootstrap file so it gets hooked into the dispatch loop. Of course your controller will also need the method &lt;code&gt;setSomeObject()&lt;/code&gt;.&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='php'&gt;&lt;span class='cp'&gt;&amp;lt;?php&lt;/span&gt;
&lt;span class='nx'&gt;Zend_Controller_Action_HelperBroker&lt;/span&gt;&lt;span class='o'&gt;::&lt;/span&gt;&lt;span class='na'&gt;addHelper&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='k'&gt;new&lt;/span&gt; &lt;span class='nx'&gt;MyApp_Helpers_SomeObjectInjector&lt;/span&gt;&lt;span class='p'&gt;());&lt;/span&gt;
&lt;span class='cp'&gt;?&amp;gt;&lt;/span&gt;&lt;span class='x' /&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;Whilst this method is one of the neatest I&amp;#8217;ve found so far it does still seem a little hacky. Some of the comments on the original post raise the question of a need for a proper dependency injection container in the framework.&lt;/p&gt;</content>
	 </entry>
	
 
	
	 <entry>
	   <title>Writing testable PHP code</title>
	   <link href="http://testomatic.co.uk/posts/2010/02/20/writing-testable-php-code/"/>
	   <updated>2010-02-20T00:00:00+00:00</updated>
	   <id>http://testomatic.co.uk/posts/2010/02/20/writing-testable-php-code/</id>
	   <content type="html">&lt;p&gt;Here at the &lt;a href='/'&gt;testomatic&lt;/a&gt; we&amp;#8217;ve been using PHP 5 and the &lt;a href='http://framework.zend.com/'&gt;Zend Framework&lt;/a&gt; for a while now. Moving into the area of enterprise PHP development has presented some new challenges and differences in the area of testing. Of particular interest has been how to write code so that is unit testable using &lt;a href='http://www.phpunit.de/'&gt;PHPUnit&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id='its_all_about_dependencies'&gt;It&amp;#8217;s all about dependencies&lt;/h2&gt;

&lt;p&gt;Unit testing is the process of ensuring that the code you have written behaves in the expected manner. The &amp;#8220;unit&amp;#8221; part means that we should only be testing the smallest possible feature of our codebase, isolating our tests around the individual concerns of a particular class or method.&lt;/p&gt;

&lt;p&gt;In practice it is rare that we will write a class or method that in exists in isolation. More often it will rely on some other classes or methods to provide it&amp;#8217;s functionality, these are what we call dependencies. Dependencies can come in various shapes and sizes, but a good rule of thumb to follow is the more complex functionality a dependency provides, the more important it is to remove it from the test equation.&lt;/p&gt;

&lt;p&gt;Let&amp;#8217;s look at a code example to illustrate this point further. The fictional class below acts as a gateway to a web service for sending emails.&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='php'&gt;&lt;span class='cp'&gt;&amp;lt;?php&lt;/span&gt; 

&lt;span class='k'&gt;class&lt;/span&gt; &lt;span class='nc'&gt;Email_Gateway&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;

    &lt;span class='k'&gt;protected&lt;/span&gt; &lt;span class='nv'&gt;$webService&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='s1'&gt;&amp;#39;https://mywebservice.com/email&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;

    &lt;span class='sd'&gt;/**&lt;/span&gt;
&lt;span class='sd'&gt;     * Sends an email &lt;/span&gt;
&lt;span class='sd'&gt;     */&lt;/span&gt;
    &lt;span class='k'&gt;public&lt;/span&gt; &lt;span class='k'&gt;function&lt;/span&gt; &lt;span class='nf'&gt;sendEmail&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nv'&gt;$to&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='nv'&gt;$subject&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='nv'&gt;$message&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;

        &lt;span class='nv'&gt;$httpClient&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='k'&gt;new&lt;/span&gt; &lt;span class='nx'&gt;Zend_Http_Client&lt;/span&gt;&lt;span class='p'&gt;();&lt;/span&gt;
        &lt;span class='nv'&gt;$httpClient&lt;/span&gt;&lt;span class='o'&gt;-&amp;gt;&lt;/span&gt;&lt;span class='na'&gt;setUri&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nv'&gt;$this&lt;/span&gt;&lt;span class='o'&gt;-&amp;gt;&lt;/span&gt;&lt;span class='na'&gt;webService&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;
        &lt;span class='nv'&gt;$httpClient&lt;/span&gt;&lt;span class='o'&gt;-&amp;gt;&lt;/span&gt;&lt;span class='na'&gt;setParameterPost&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='k'&gt;array&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;
            &lt;span class='s1'&gt;&amp;#39;to&amp;#39;&lt;/span&gt; &lt;span class='o'&gt;=&amp;gt;&lt;/span&gt; &lt;span class='nv'&gt;$to&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt;
            &lt;span class='s1'&gt;&amp;#39;subject&amp;#39;&lt;/span&gt; &lt;span class='o'&gt;=&amp;gt;&lt;/span&gt; &lt;span class='nv'&gt;$subject&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt;
            &lt;span class='s1'&gt;&amp;#39;message&amp;#39;&lt;/span&gt; &lt;span class='o'&gt;=&amp;gt;&lt;/span&gt; &lt;span class='nv'&gt;$message&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt;
        &lt;span class='p'&gt;));&lt;/span&gt;
    
        &lt;span class='nv'&gt;$response&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='nv'&gt;$httpClient&lt;/span&gt;&lt;span class='o'&gt;-&amp;gt;&lt;/span&gt;&lt;span class='na'&gt;request&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s1'&gt;&amp;#39;POST&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;
    
        &lt;span class='k'&gt;if&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nv'&gt;$response&lt;/span&gt;&lt;span class='o'&gt;-&amp;gt;&lt;/span&gt;&lt;span class='na'&gt;isError&lt;/span&gt;&lt;span class='p'&gt;())&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;
            &lt;span class='k'&gt;throw&lt;/span&gt; &lt;span class='k'&gt;new&lt;/span&gt; &lt;span class='nx'&gt;Exception&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;
                        &lt;span class='nv'&gt;$response&lt;/span&gt;&lt;span class='o'&gt;-&amp;gt;&lt;/span&gt;&lt;span class='na'&gt;getStatus&lt;/span&gt;&lt;span class='p'&gt;()&lt;/span&gt; 
                        &lt;span class='o'&gt;.&lt;/span&gt; &lt;span class='s1'&gt;&amp;#39; &amp;#39;&lt;/span&gt; 
                        &lt;span class='o'&gt;.&lt;/span&gt; &lt;span class='nv'&gt;$response&lt;/span&gt;&lt;span class='o'&gt;-&amp;gt;&lt;/span&gt;&lt;span class='na'&gt;getMessage&lt;/span&gt;&lt;span class='p'&gt;()&lt;/span&gt;
                    &lt;span class='p'&gt;);&lt;/span&gt;
        &lt;span class='p'&gt;}&lt;/span&gt; &lt;span class='k'&gt;else&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;
            &lt;span class='k'&gt;return&lt;/span&gt; &lt;span class='k'&gt;true&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
        &lt;span class='p'&gt;}&lt;/span&gt;

    &lt;span class='p'&gt;}&lt;/span&gt;

&lt;span class='p'&gt;}&lt;/span&gt;

&lt;span class='cp'&gt;?&amp;gt;&lt;/span&gt;&lt;span class='x' /&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;This class adds a basic wrapper around a HTTP call to our service and throws an exception if it fails for some reason. In practice you might want a class such as this to do much more, such as validating that parameter is actualy an email, but it illustrates the point as is. The error handling part is the main piece of functionality given here, but because of the way we have written the code testing that our error handling works correctly becomes a bit cumbersome.&lt;/p&gt;

&lt;p&gt;When testing this class in it&amp;#8217;s current state we would have to be making HTTP calls and sending out emails, as well as ensuring the web service responded in the manner which we wanted to test against. That&amp;#8217;s some pretty big external dependencies, and at the moment we are quite far away from testing our code in isolation.&lt;/p&gt;

&lt;h2 id='dependency_injection'&gt;Dependency injection&lt;/h2&gt;

&lt;p&gt;One solution would be use a test fixture to represent our call to the web service. This means writing a fake HTTP client for use in our tests, it would pretend to talk to the web service and respond in the manner we want to test against. The current implementation of this class does not give us access to the Zend_Http_Client though, so in order to use our test with a fixture we need to refactor our code.&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='php'&gt;&lt;span class='cp'&gt;&amp;lt;?php&lt;/span&gt;

&lt;span class='k'&gt;class&lt;/span&gt; &lt;span class='nc'&gt;Email_Gateway&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;

    &lt;span class='k'&gt;protected&lt;/span&gt; &lt;span class='nv'&gt;$webService&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='s1'&gt;&amp;#39;https://mywebservice.com/email&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;

    &lt;span class='k'&gt;protected&lt;/span&gt; &lt;span class='nx'&gt;Zend_Http_Client&lt;/span&gt; &lt;span class='nv'&gt;$httpClient&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;

    &lt;span class='sd'&gt;/**&lt;/span&gt;
&lt;span class='sd'&gt;     * Set our http client&lt;/span&gt;
&lt;span class='sd'&gt;     */&lt;/span&gt;
    &lt;span class='k'&gt;public&lt;/span&gt; &lt;span class='k'&gt;function&lt;/span&gt; &lt;span class='nf'&gt;setHttpClient&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nx'&gt;Zend_Http_Client&lt;/span&gt; &lt;span class='nv'&gt;$httpClient&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;
        &lt;span class='nv'&gt;$this&lt;/span&gt;&lt;span class='o'&gt;-&amp;gt;&lt;/span&gt;&lt;span class='na'&gt;httpClient&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='nv'&gt;$httpClient&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
    &lt;span class='p'&gt;}&lt;/span&gt;

    &lt;span class='sd'&gt;/**&lt;/span&gt;
&lt;span class='sd'&gt;     * Get our http client&lt;/span&gt;
&lt;span class='sd'&gt;     */&lt;/span&gt; 
    &lt;span class='k'&gt;public&lt;/span&gt; &lt;span class='k'&gt;function&lt;/span&gt; &lt;span class='nf'&gt;getHttpClient&lt;/span&gt;&lt;span class='p'&gt;()&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;
        &lt;span class='k'&gt;if&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='o'&gt;!&lt;/span&gt;&lt;span class='nb'&gt;isset&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nv'&gt;$this&lt;/span&gt;&lt;span class='o'&gt;-&amp;gt;&lt;/span&gt;&lt;span class='na'&gt;httpClient&lt;/span&gt;&lt;span class='p'&gt;))&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;
            &lt;span class='nv'&gt;$this&lt;/span&gt;&lt;span class='o'&gt;-&amp;gt;&lt;/span&gt;&lt;span class='na'&gt;httpClient&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='k'&gt;new&lt;/span&gt; &lt;span class='nx'&gt;Zend_Http_Client&lt;/span&gt;&lt;span class='p'&gt;();&lt;/span&gt;
        &lt;span class='p'&gt;}&lt;/span&gt;
        &lt;span class='k'&gt;return&lt;/span&gt; &lt;span class='nv'&gt;$this&lt;/span&gt;&lt;span class='o'&gt;-&amp;gt;&lt;/span&gt;&lt;span class='na'&gt;httpClient&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
    &lt;span class='p'&gt;}&lt;/span&gt;

    &lt;span class='sd'&gt;/**&lt;/span&gt;
&lt;span class='sd'&gt;     * Sends an email &lt;/span&gt;
&lt;span class='sd'&gt;     */&lt;/span&gt;
    &lt;span class='k'&gt;public&lt;/span&gt; &lt;span class='k'&gt;function&lt;/span&gt; &lt;span class='nf'&gt;sendEmail&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nv'&gt;$to&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='nv'&gt;$subject&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='nv'&gt;$message&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;

        &lt;span class='nv'&gt;$httpClient&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='nv'&gt;$this&lt;/span&gt;&lt;span class='o'&gt;-&amp;gt;&lt;/span&gt;&lt;span class='na'&gt;getHttpClient&lt;/span&gt;&lt;span class='p'&gt;();&lt;/span&gt;
        &lt;span class='nv'&gt;$httpClient&lt;/span&gt;&lt;span class='o'&gt;-&amp;gt;&lt;/span&gt;&lt;span class='na'&gt;setUri&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nv'&gt;$this&lt;/span&gt;&lt;span class='o'&gt;-&amp;gt;&lt;/span&gt;&lt;span class='na'&gt;webService&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;
        &lt;span class='nv'&gt;$httpClient&lt;/span&gt;&lt;span class='o'&gt;-&amp;gt;&lt;/span&gt;&lt;span class='na'&gt;setParameterPost&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='k'&gt;array&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;
            &lt;span class='s1'&gt;&amp;#39;to&amp;#39;&lt;/span&gt; &lt;span class='o'&gt;=&amp;gt;&lt;/span&gt; &lt;span class='nv'&gt;$to&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt;
            &lt;span class='s1'&gt;&amp;#39;subject&amp;#39;&lt;/span&gt; &lt;span class='o'&gt;=&amp;gt;&lt;/span&gt; &lt;span class='nv'&gt;$subject&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt;
            &lt;span class='s1'&gt;&amp;#39;message&amp;#39;&lt;/span&gt; &lt;span class='o'&gt;=&amp;gt;&lt;/span&gt; &lt;span class='nv'&gt;$message&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt;
        &lt;span class='p'&gt;));&lt;/span&gt;
    
        &lt;span class='nv'&gt;$response&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='nv'&gt;$httpClient&lt;/span&gt;&lt;span class='o'&gt;-&amp;gt;&lt;/span&gt;&lt;span class='na'&gt;request&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s1'&gt;&amp;#39;POST&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;
    
        &lt;span class='k'&gt;if&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nv'&gt;$response&lt;/span&gt;&lt;span class='o'&gt;-&amp;gt;&lt;/span&gt;&lt;span class='na'&gt;isError&lt;/span&gt;&lt;span class='p'&gt;())&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;
            &lt;span class='k'&gt;throw&lt;/span&gt; &lt;span class='k'&gt;new&lt;/span&gt; &lt;span class='nx'&gt;Exception&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;
                        &lt;span class='nv'&gt;$response&lt;/span&gt;&lt;span class='o'&gt;-&amp;gt;&lt;/span&gt;&lt;span class='na'&gt;getStatus&lt;/span&gt;&lt;span class='p'&gt;()&lt;/span&gt; 
                        &lt;span class='o'&gt;.&lt;/span&gt; &lt;span class='s1'&gt;&amp;#39; &amp;#39;&lt;/span&gt; 
                        &lt;span class='o'&gt;.&lt;/span&gt; &lt;span class='nv'&gt;$response&lt;/span&gt;&lt;span class='o'&gt;-&amp;gt;&lt;/span&gt;&lt;span class='na'&gt;getMessage&lt;/span&gt;&lt;span class='p'&gt;()&lt;/span&gt;
                    &lt;span class='p'&gt;);&lt;/span&gt;
        &lt;span class='p'&gt;}&lt;/span&gt; &lt;span class='k'&gt;else&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;
            &lt;span class='k'&gt;return&lt;/span&gt; &lt;span class='k'&gt;true&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
        &lt;span class='p'&gt;}&lt;/span&gt;

    &lt;span class='p'&gt;}&lt;/span&gt;

&lt;span class='p'&gt;}&lt;/span&gt;

&lt;span class='cp'&gt;?&amp;gt;&lt;/span&gt;&lt;span class='x' /&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;In the revised class we have added some new methods, getters and setters for the http client. This allows us to replace our http client with a fixture object during our tests. I could have also inserted the http client via a constructor, but in this example I have gone for a setter and &lt;a href='http://en.wikipedia.org/wiki/Lazy_initialization'&gt;&amp;#8216;lazy intialisation&amp;#8217;&lt;/a&gt; via the getter as it has minimal impact on the interface to the class.&lt;/p&gt;

&lt;p&gt;This technique is a very basic example of what is know as &lt;a href='http://en.wikipedia.org/wiki/Dependency_injection'&gt;dependency injection&lt;/a&gt;, and allows us to write our classes in a way that they become easily testable in isolation. A typical PHPUnit test for this class might now look like this:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='php'&gt;&lt;span class='cp'&gt;&amp;lt;?php&lt;/span&gt;

&lt;span class='k'&gt;public&lt;/span&gt; &lt;span class='k'&gt;function&lt;/span&gt; &lt;span class='nf'&gt;testSendEmailSuccess&lt;/span&gt;&lt;span class='p'&gt;()&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;
    
    &lt;span class='nv'&gt;$mockHttpClient&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='nv'&gt;$this&lt;/span&gt;&lt;span class='o'&gt;-&amp;gt;&lt;/span&gt;&lt;span class='na'&gt;getMock&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s1'&gt;&amp;#39;Zend_Http_Client&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;
    &lt;span class='nv'&gt;$mockHttpClient&lt;/span&gt;&lt;span class='o'&gt;-&amp;gt;&lt;/span&gt;&lt;span class='na'&gt;expects&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nv'&gt;$this&lt;/span&gt;&lt;span class='o'&gt;-&amp;gt;&lt;/span&gt;&lt;span class='na'&gt;any&lt;/span&gt;&lt;span class='p'&gt;())&lt;/span&gt;
                   &lt;span class='o'&gt;-&amp;gt;&lt;/span&gt;&lt;span class='na'&gt;method&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s1'&gt;&amp;#39;isError&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;
                   &lt;span class='o'&gt;-&amp;gt;&lt;/span&gt;&lt;span class='na'&gt;will&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nv'&gt;$this&lt;/span&gt;&lt;span class='o'&gt;-&amp;gt;&lt;/span&gt;&lt;span class='na'&gt;returnValue&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='k'&gt;false&lt;/span&gt;&lt;span class='p'&gt;));&lt;/span&gt;

    &lt;span class='nv'&gt;$emailGateway&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='k'&gt;new&lt;/span&gt; &lt;span class='nx'&gt;Email_Gateway&lt;/span&gt;&lt;span class='p'&gt;();&lt;/span&gt;
    &lt;span class='nv'&gt;$emailGateway&lt;/span&gt;&lt;span class='o'&gt;-&amp;gt;&lt;/span&gt;&lt;span class='na'&gt;setHttpClient&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nv'&gt;$mockHttpClient&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;
    
    &lt;span class='nv'&gt;$result&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='nv'&gt;$emailGateway&lt;/span&gt;&lt;span class='o'&gt;-&amp;gt;&lt;/span&gt;&lt;span class='na'&gt;sendEmail&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s1'&gt;&amp;#39;matt@foo.com&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; 
                                       &lt;span class='s1'&gt;&amp;#39;Hello&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; 
                                       &lt;span class='s1'&gt;&amp;#39;Hello Matt!&amp;#39;&lt;/span&gt;
                                       &lt;span class='p'&gt;);&lt;/span&gt;

    &lt;span class='nv'&gt;$this&lt;/span&gt;&lt;span class='o'&gt;-&amp;gt;&lt;/span&gt;&lt;span class='na'&gt;assertTrue&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nv'&gt;$result&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;
    
&lt;span class='p'&gt;}&lt;/span&gt;

&lt;span class='cp'&gt;?&amp;gt;&lt;/span&gt;&lt;span class='x' /&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;Here I have used one of &lt;a href='http://www.phpunit.de/manual/3.0/en/mock-objects.html'&gt;PHPUnit&amp;#8217;s mock objects&lt;/a&gt;, but a similar effect can be achieved by writing your own version of the HTTP client and injecting that instead. Martin Fowler describes the philosophical &lt;a href='http://martinfowler.com/articles/mocksArentStubs.html#ChoosingBetweenTheDifferences'&gt;differences of these two approaches&lt;/a&gt; in quite a lot of detail, but in my so far limited experience I have found PHPUnit&amp;#8217;s mock objects a convenient way to stub out dependencies in my tests.&lt;/p&gt;

&lt;h2 id='looking_for_dependency_injection_patterns_in_the_zend_framework'&gt;Looking for dependency injection patterns in the Zend Framework&lt;/h2&gt;

&lt;p&gt;The more I have come to use these coding practices in my own work, the more I have come to recognise them in the Zend Framework. Using the &lt;a href='http://framework.zend.com/manual/en/zend.view.helpers.html'&gt;Zend_View_Helper&lt;/a&gt; component as an example, here&amp;#8217;s my take on what the Zend developers might have been thinking when they designed some of it&amp;#8217;s implementation.&lt;/p&gt;

&lt;p&gt;Let&amp;#8217;s say we&amp;#8217;ve created a blog using the framework and in the side bar of each page would like to dynamically pull in a list of our recent &lt;a href='http://www.flickr.com'&gt;flickr&lt;/a&gt; uploads as thumbnail images. This functionality might well be implemented as a view helper so in our templates all we need to do is:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='php'&gt;&lt;span class='cp'&gt;&amp;lt;?php&lt;/span&gt;
&lt;span class='k'&gt;echo&lt;/span&gt; &lt;span class='nv'&gt;$this&lt;/span&gt;&lt;span class='o'&gt;-&amp;gt;&lt;/span&gt;&lt;span class='na'&gt;flickrImages&lt;/span&gt;&lt;span class='p'&gt;();&lt;/span&gt;
&lt;span class='cp'&gt;?&amp;gt;&lt;/span&gt;&lt;span class='x' /&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;That keeps our view templates nice and clean and means we can share the flickr code across them. Behind the scenes the view helper would probably need to connect to the flickr API, find the recent uploads and return a list of image URLs. Then the helper might format them into a nice HTML list.&lt;/p&gt;

&lt;p&gt;So here we have introduced a pretty big dependency in the view on a HTTP call to the flickr API and all the associated classes that go with it. This might become a bit of a problem when writing some unit tests for our controller using &lt;a href='http://framework.zend.com/manual/en/zend.test.phpunit.html'&gt;Zend_Test_PHPUnit_ControllerTestCase&lt;/a&gt;, as we don&amp;#8217;t necessarily want to talk to flickr each time the tests are ran.&lt;/p&gt;

&lt;p&gt;However, because we have implemented this functionality as a view helper, as opposed to something like &lt;code&gt;$flickrImages = new FlickrImages();&lt;/code&gt; we have already mitigated the dependency. By using the same tools the Zend Framework gives us for creating normal view helpers, we can inject a test fixture into our application when we are unit testing.&lt;/p&gt;

&lt;p&gt;We can create a fixture view helper somewhere in our tests directory.&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='php'&gt;&lt;span class='cp'&gt;&amp;lt;?php&lt;/span&gt;
&lt;span class='sd'&gt;/**&lt;/span&gt;
&lt;span class='sd'&gt; * A test fixture for the flickr images view helper&lt;/span&gt;
&lt;span class='sd'&gt; */&lt;/span&gt;
&lt;span class='k'&gt;class&lt;/span&gt; &lt;span class='nc'&gt;MyApp_Test_View_Helper_FlickrImages&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;
    &lt;span class='k'&gt;public&lt;/span&gt; &lt;span class='k'&gt;function&lt;/span&gt; &lt;span class='nf'&gt;flickrImages&lt;/span&gt;&lt;span class='p'&gt;()&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;
        &lt;span class='k'&gt;return&lt;/span&gt; &lt;span class='s1'&gt;&amp;#39;&amp;lt;ul&amp;gt;&amp;lt;li&amp;gt;Fake stuff&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
    &lt;span class='p'&gt;}&lt;/span&gt;
&lt;span class='p'&gt;}&lt;/span&gt;
&lt;span class='cp'&gt;?&amp;gt;&lt;/span&gt;&lt;span class='x' /&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;And load that when we bootstrap our controller unit tests.&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='php'&gt;&lt;span class='cp'&gt;&amp;lt;?php&lt;/span&gt;
&lt;span class='nv'&gt;$view&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='k'&gt;new&lt;/span&gt; &lt;span class='nx'&gt;Zend_View&lt;/span&gt;&lt;span class='p'&gt;();&lt;/span&gt;
&lt;span class='nv'&gt;$view&lt;/span&gt;&lt;span class='o'&gt;-&amp;gt;&lt;/span&gt;&lt;span class='na'&gt;addHelperPath&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s1'&gt;&amp;#39;/path/to/real/helpers&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='s1'&gt;&amp;#39;MyApp_View_Helper&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;
&lt;span class='nv'&gt;$view&lt;/span&gt;&lt;span class='o'&gt;-&amp;gt;&lt;/span&gt;&lt;span class='na'&gt;addHelperPath&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s1'&gt;&amp;#39;/path/to/test/helpers&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='s1'&gt;&amp;#39;MyApp_Test_View_Helper&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;
&lt;span class='cp'&gt;?&amp;gt;&lt;/span&gt;&lt;span class='x' /&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;Because Zend View looks first in the most recently added path for the requested helper class it will find the fixture helper before the real one. A similar technique can be employed with action helpers to &lt;a href='/2010/02/21/dependency-injection-for-zend-framework-controllers.html'&gt;inject dependencies into your controllers&lt;/a&gt;. Dependency injection patterns such as this are interspersed throughout the Zend Framework and once realised can make unit testing your application&amp;#8217;s components a lot easier.&lt;/p&gt;

&lt;p&gt;What are your thoughts? Have you found any interesting dependency injection patterns or techniques in the Zend Framework? Why not share your thoughts below.&lt;/p&gt;</content>
	 </entry>
	
 
 
</feed>

