<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/css" href="/stylesheets/rss.css"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/">
  <channel>
    <title>Floehopper: Tag rails</title>
    <link>http://blog.floehopper.org/articles/tag/rails?tag=rails</link>
    <language>en-us</language>
    <ttl>40</ttl>
    <description>thoughts on the bergy bits of life</description>
    <item>
      <title>Escape from the Enterprise - London Rails Jobs</title>
      <description>&lt;p&gt;If you&amp;#8217;re looking to escape the &amp;#8220;Enterprise&amp;#8221; world of &lt;a href="http://www.java.com"&gt;Java&lt;/a&gt; and &lt;a href="http://www.gotdotnet.com/"&gt;.NET&lt;/a&gt; for the shiny new world of &lt;a href="http://www.rubyonrails.com/"&gt;Ruby on Rails&lt;/a&gt;, take a look at &lt;a href="http://www.reevoo.com/blogs/bengriffiths/2007/04/03/rails-developer-job/"&gt;Ben&amp;#8217;s blog post&lt;/a&gt; and &lt;a href="http://jobs.37signals.com/jobs/1349"&gt;37Signals job advert&lt;/a&gt;.&lt;/p&gt;


	&lt;p&gt;Things are really starting to hot up here at &lt;a href="http://www.reevoo.com"&gt;Reevoo&lt;/a&gt;. When you&amp;#8217;re in the middle of it all, it&amp;#8217;s easy to forget the progress we&amp;#8217;ve been making. In recent months, we&amp;#8217;ve&amp;#8230;&lt;/p&gt;


	&lt;ul&gt;
	&lt;li&gt;&lt;a href="http://www.e-consultancy.com/news-blog/362376/reevoo-secures-first-round-funding.html"&gt;Secured funding&lt;/a&gt; from a &lt;a href="http://www.edenventures.co.uk/"&gt;very supportive VC&lt;/a&gt;.&lt;/li&gt;
		&lt;li&gt;Passed the &lt;a href="http://www.reevoo.com/blogs/reevooblog/2007/03/29/60-million-reviews-and-ratings/"&gt;60 million mark&lt;/a&gt; on ratings and reviews served.&lt;/li&gt;
		&lt;li&gt;&lt;a href="http://www.vecosys.com/2007/04/04/woolworths-signs-reevoocom-for-customer-reviews/"&gt;Added Woolworths&lt;/a&gt; among others to our already &lt;a href="http://www.reevoo.com/pages/about_partnering"&gt;impressive list of partners&lt;/a&gt;.&lt;/li&gt;
		&lt;li&gt;Moved into a &lt;a href="http://www.reevoo.com/blogs/reevooblog/2007/04/17/reevoo-spirit/"&gt;plush new office&lt;/a&gt;.&lt;/li&gt;
		&lt;li&gt;We&amp;#8217;ve even hired a couple of &lt;a href="http://www.thoughtworks.co.uk"&gt;ThoughtWorks&lt;/a&gt; developers for a month-long project.&lt;/li&gt;
	&lt;/ul&gt;


	&lt;p&gt;I work with a talented and friendly bunch of developers&amp;#8230;&lt;/p&gt;


	&lt;ul&gt;
	&lt;li&gt;&lt;a href="http://www.reevoo.com/blogs/bengriffiths"&gt;Ben Griffiths&lt;/a&gt;&lt;/li&gt;
		&lt;li&gt;&lt;a href="http://blog.seagul.co.uk/"&gt;Chris Roos&lt;/a&gt;&lt;/li&gt;
		&lt;li&gt;&lt;a href="http://po-ru.com/"&gt;Paul Battley&lt;/a&gt;&lt;/li&gt;
		&lt;li&gt;&lt;a href="http://everythingbehind.com/ruby/"&gt;Ben Sales&lt;/a&gt;&lt;/li&gt;
	&lt;/ul&gt;


	&lt;p&gt;We&amp;#8217;re heavily into &lt;a href="http://en.wikipedia.org/wiki/Test-driven_development"&gt;Test-Driven Development&lt;/a&gt;, &lt;a href="http://www.martinfowler.com/articles/continuousIntegration.html#AutomateDeployment"&gt;Continuous Integration/Deployment&lt;/a&gt; and &lt;a href="http://www.opensource.org/"&gt;Open Source&lt;/a&gt;. It&amp;#8217;s an exciting and fun place to work.&lt;/p&gt;


	&lt;p&gt;If you&amp;#8217;re interested, send Ben (ben_at_reevoo_dot_com) your CV and mention you saw the job here.&lt;/p&gt;</description>
      <pubDate>Wed, 25 Apr 2007 04:12:00 +0000</pubDate>
      <guid isPermaLink="false">urn:uuid:71f1d804-5eb9-4cd8-9e36-7b477c75b651</guid>
      <author>James Mead</author>
      <link>http://blog.floehopper.org/articles/2007/04/25/escape-from-the-enterprise-london-rails-jobs</link>
      <category>ruby</category>
      <category>rails</category>
      <category>job</category>
      <category>london</category>
      <category>reevoo</category>
      <category>enterprise</category>
      <category>java</category>
      <category>dotnet</category>
    </item>
    <item>
      <title>Rails Console Shortcuts</title>
      <description>&lt;p&gt;A couple of quick nuggets I picked up from Amy Hoy&amp;#8217;s &lt;a href="http://slash7.com/articles/2006/12/21/secrets-of-the-rails-console-ninjas"&gt;Secrets of the Rails Console Ninjas&lt;/a&gt;.&lt;/p&gt;


	&lt;p&gt;Firstly, the magic &lt;code&gt;y&lt;/code&gt; method which dumps an object to &lt;span class="caps"&gt;YAML&lt;/span&gt; &amp;#8211; much more readable than the standard &lt;code&gt;inspect&lt;/code&gt; output.&lt;/p&gt;


&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_default "&gt;&amp;gt;&amp;gt; y james
--- !ruby/object:User 
attributes: 
  firstname: James
  surname: Mead
  login: floehopper
new_record: true
=&amp;gt; nil&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

	&lt;p&gt;Secondly, clear your console using &lt;code&gt;command + k&lt;/code&gt; (or &lt;code&gt;ctrl + l&lt;/code&gt; for those on Windows)&lt;/p&gt;


	&lt;p&gt;Thanks Amy.&lt;/p&gt;</description>
      <pubDate>Fri, 22 Dec 2006 15:14:00 +0000</pubDate>
      <guid isPermaLink="false">urn:uuid:ec02dfef-3ef2-45c1-8e6e-765457272a37</guid>
      <author>James Mead</author>
      <link>http://blog.floehopper.org/articles/2006/12/22/rails-console-shortcuts</link>
      <category>ruby</category>
      <category>rails</category>
      <category>console</category>
      <category>yaml</category>
    </item>
    <item>
      <title>Rails Plugin Versioning</title>
      <description>&lt;p&gt;A while ago &lt;a href="http://jayfields.blogspot.com/"&gt;Jay Fields&lt;/a&gt; described a number of ways to &lt;a href="http://jayfields.blogspot.com/2006/10/rubygems-shared-ruby-code.html"&gt;share Ruby code&lt;/a&gt; between projects and focussed on a useful technique which involves using &lt;a href="http://rubyforge.org/projects/rubygems/"&gt;RubyGems&lt;/a&gt; and unpacking them into your vendor directory. He also mentions the difficulties of versioning with &lt;a href="http://www.rubyonrails.org/"&gt;Rails&lt;/a&gt; plugins.&lt;/p&gt;


	&lt;p&gt;We use a number of &lt;a href="http://www.rubyonrails.org/"&gt;Rails&lt;/a&gt; plugins at &lt;a href="http://www.reevoo.com"&gt;Reevoo&lt;/a&gt;. Initially we used &lt;a href="http://subversion.tigris.org/"&gt;Subversion&lt;/a&gt; externals to include them in our projects, but for a while now we&amp;#8217;ve been successfully using &lt;a href="http://blog.teksol.info/"&gt;François Beausoleil&amp;#8217;s&lt;/a&gt; &lt;a href="http://piston.rubyforge.org/"&gt;Piston&lt;/a&gt; which is effectively an extension to &lt;a href="http://subversion.tigris.org/"&gt;Subversion&lt;/a&gt;. You end up with a copy of the plugin code in your own repository with the relevant revision number from the remote repository stored in your own &lt;a href="http://subversion.tigris.org/"&gt;Subversion&lt;/a&gt; metadata. &lt;a href="http://piston.rubyforge.org/"&gt;Piston&lt;/a&gt; prevents you getting new versions of the plugin code every time you update (as you would with an svn:external) which can lead to unexpected changes, but makes it straightforward to update to a newer version of a plugin when you want.&lt;/p&gt;


	&lt;p&gt;You can find Piston &lt;a href="http://piston.rubyforge.org/"&gt;here&lt;/a&gt;.&lt;/p&gt;</description>
      <pubDate>Sat, 02 Dec 2006 09:36:00 +0000</pubDate>
      <guid isPermaLink="false">urn:uuid:7ee628bb-96af-47f0-8e6e-0f66c2a5e03f</guid>
      <author>James Mead</author>
      <link>http://blog.floehopper.org/articles/2006/12/02/rails-plugin-versioning</link>
      <category>ruby</category>
      <category>rails</category>
      <category>plugin</category>
      <category>piston</category>
      <category>rubygem</category>
      <category>version</category>
      <category>svn</category>
      <category>external</category>
    </item>
    <item>
      <title>Keep Mocha in your Rails Toolbox</title>
      <description>&lt;p&gt;It&amp;#8217;s good to see that Chris on &lt;a href="http://errtheblog.com/"&gt;err.the_blog&lt;/a&gt; regards &lt;a href="http://mocha.rubyforge.org"&gt;Mocha&lt;/a&gt; as part of his &lt;a href="http://errtheblog.com/post/35"&gt;Rails Toolbox&lt;/a&gt; of &amp;#8220;kickass open source software&amp;#8221;.&lt;/p&gt;</description>
      <pubDate>Tue, 17 Oct 2006 13:19:00 +0000</pubDate>
      <guid isPermaLink="false">urn:uuid:4046a0ee-0486-4852-aee5-2fb3efee3b71</guid>
      <author>James Mead</author>
      <link>http://blog.floehopper.org/articles/2006/10/17/keep-mocha-in-your-rails-toolbox</link>
      <category>mocha</category>
      <category>ruby</category>
      <category>rails</category>
      <category>toolbox</category>
      <category>open</category>
      <category>source</category>
      <category>software</category>
    </item>
    <item>
      <title>Google Test Automation &amp;amp; RailsConf Europe</title>
      <description>&lt;p&gt;Last week I was at Google&amp;#8217;s inaugural &lt;a href="http://www.testingreflections.com/node/view/4135"&gt;London Test Automation Conference&lt;/a&gt; where I particularly enjoyed the talk by Adam Connors and &lt;a href="http://joe.truemesh.com/blog/"&gt;Joe Walnes&lt;/a&gt; entitled &amp;#8220;Does my button look big in this? Building Testable &lt;span class="caps"&gt;AJAX&lt;/span&gt; Applications&amp;#8221;.  It should be out on &lt;a href="http://video.google.com/"&gt;Google Video&lt;/a&gt; any day now (as are all the &lt;a href="http://www.google.co.uk/intl/en/events/londontesters/speakers.html"&gt;talks&lt;/a&gt;) and is well worth a look.&lt;/p&gt;


	&lt;p&gt;It was also good to hear from &lt;a href="http://nat.truemesh.com/"&gt;Nat Pryce&lt;/a&gt; and &lt;a href="http://stevef.truemesh.com/"&gt;Steve Freeman&lt;/a&gt; about the &lt;a href="http://cvs.jmock.codehaus.org/browse/jmock/jmock2"&gt;new developments&lt;/a&gt; in &lt;a href="http://www.jmock.org/"&gt;JMock&lt;/a&gt;&lt;/p&gt;


	&lt;p&gt;Tomorrow I&amp;#8217;m off to &lt;a href="http://europe.railsconf.org/"&gt;RailsConf Europe&lt;/a&gt;. Should be fun.&lt;/p&gt;


Updates:
	&lt;ul&gt;
	&lt;li&gt;the &lt;span class="caps"&gt;LTAC&lt;/span&gt; talk videos are &lt;a href="http://video.google.com/videosearch?q=london+test+automation+conference"&gt;here&lt;/a&gt; (thanks Ade).&lt;/li&gt;
		&lt;li&gt;the &lt;span class="caps"&gt;LTAC&lt;/span&gt; slides are &lt;a href="http://www.google.co.uk/intl/en/events/londontesters/speakers.html"&gt;here&lt;/a&gt;&lt;/li&gt;
	&lt;/ul&gt;</description>
      <pubDate>Wed, 13 Sep 2006 09:55:00 +0000</pubDate>
      <guid isPermaLink="false">urn:uuid:2d1e1d4c-ea58-4f93-b9c3-38555cedd6a0</guid>
      <author>James Mead</author>
      <link>http://blog.floehopper.org/articles/2006/09/13/google-test-automation-railsconf-europe</link>
      <category>ltac</category>
      <category>railsconf</category>
      <category>jmock</category>
      <category>test</category>
      <category>automation</category>
      <category>google</category>
      <category>ruby</category>
      <category>rails</category>
      <category>conference</category>
      <category>london</category>
    </item>
    <item>
      <title>ThoughtWorks team uses Mocha</title>
      <description>&lt;p&gt;It&amp;#8217;s good to see that a team from &lt;a href="http://www.thoughtworks.com"&gt;my old company&lt;/a&gt; has caught the &lt;a href="http://mocha.rubyforge.org"&gt;Mocha&lt;/a&gt; bug&amp;#8230;&lt;/p&gt;


	&lt;p&gt;&lt;a href="http://jayfields.blogspot.com/"&gt;Jay Fields&lt;/a&gt; describes how his team have been using Mocha to achieve &lt;a href="http://jayfields.blogspot.com/2006/09/rubyrails-unit-testing-in-less-than-1.html"&gt;Ruby on Rails Unit Testing in less than 1 second&lt;/a&gt;.&lt;/p&gt;</description>
      <pubDate>Tue, 05 Sep 2006 06:35:00 +0000</pubDate>
      <guid isPermaLink="false">urn:uuid:a589217f-72aa-42f3-a160-233fbd43c51b</guid>
      <author>James Mead</author>
      <link>http://blog.floehopper.org/articles/2006/09/05/thoughtworks-team-uses-mocha</link>
      <category>mocha</category>
      <category>ruby</category>
      <category>rails</category>
      <category>mock</category>
      <category>unit</category>
      <category>test</category>
      <category>thoughtworks</category>
    </item>
    <item>
      <title>Ruby on Rails uses Mocha to test frameworks</title>
      <description>&lt;p&gt;So thanks to &lt;a href="http://glu.ttono.us/"&gt;Kev Clark&amp;#8217;s&lt;/a&gt; interest and hard work, it looks like &lt;a href="http://mocha.rubyforge.org"&gt;Mocha&lt;/a&gt; is being used to improve test coverage in some of the &lt;a href="http://www.rubyonrails.com/"&gt;Rails&lt;/a&gt; frameworks &amp;#8211; take a look at this &lt;a href="http://dev.rubyonrails.org/changeset/4913"&gt;patch&lt;/a&gt;.&lt;/p&gt;</description>
      <pubDate>Tue, 05 Sep 2006 03:21:00 +0000</pubDate>
      <guid isPermaLink="false">urn:uuid:01074226-4558-4165-9f2e-fd0805c6518a</guid>
      <author>James Mead</author>
      <link>http://blog.floehopper.org/articles/2006/09/05/ruby-on-rails-uses-mocha-to-test-frameworks</link>
      <category>mocha</category>
      <category>mock</category>
      <category>stub</category>
      <category>test</category>
      <category>rails</category>
      <category>coverage</category>
      <category>patch</category>
    </item>
    <item>
      <title>New Mocha Docs</title>
      <description>&lt;p&gt;Spurred on by &lt;a href="http://glu.ttono.us/articles/2006/09/02/mocking-models#comment-1106"&gt;Thorsten&amp;#8217;s comment&lt;/a&gt; on &lt;a href="http://glu.ttono.us/"&gt;Gluttonous&amp;#8217; blog&lt;/a&gt; and a mention of &lt;a href="http://mocha.rubyforge.org"&gt;Mocha&lt;/a&gt; in the &lt;a href="http://cleanair.highgroove.com/articles/2006/09/03/ruby_on_rails_enterprise_capistrano_mocked_models_class_variables_rest"&gt;Top 5 Rails Stories of the Week&lt;/a&gt;, I&amp;#8217;ve given the Mocha &lt;a href="http://mocha.rubyforge.org"&gt;documentation&lt;/a&gt; a major overhaul.&lt;/p&gt;


	&lt;p&gt;Now the &lt;a href="http://rdoc.sourceforge.net/"&gt;RDoc&lt;/a&gt; only shows the public &lt;span class="caps"&gt;API&lt;/span&gt; which should hopefully improve the signal-to-noise ratio and show how simple it is to use.&lt;/p&gt;


	&lt;ul&gt;
	&lt;li&gt;&lt;a href="http://mocha.rubyforge.org/classes/Mocha/AutoVerify.html"&gt;Create traditional mock objects&lt;/a&gt;&lt;/li&gt;
		&lt;li&gt;&lt;a href="http://mocha.rubyforge.org/classes/Mocha/MockMethods.html"&gt;Set expectations on traditional mock objects&lt;/a&gt;&lt;/li&gt;
		&lt;li&gt;&lt;a href="http://mocha.rubyforge.org/classes/Object.html"&gt;Set expectations on real (non-mock) classes&lt;/a&gt;&lt;/li&gt;
		&lt;li&gt;&lt;a href="http://mocha.rubyforge.org/classes/Mocha/Expectation.html"&gt;Make expectations more specific or define behaviour of stub&lt;/a&gt;&lt;/li&gt;
	&lt;/ul&gt;


I&amp;#8217;ve also had a play with &lt;a href="http://coderay.rubychan.de/"&gt;CodeRay&lt;/a&gt; and generated syntax-highlighted examples.
	&lt;ul&gt;
	&lt;li&gt;&lt;a href="http://mocha.rubyforge.org/examples/misc.html"&gt;Quick Start&lt;/a&gt;&lt;/li&gt;
		&lt;li&gt;&lt;a href="http://mocha.rubyforge.org/examples/mocha.html"&gt;Traditional mocking&lt;/a&gt;&lt;/li&gt;
		&lt;li&gt;&lt;a href="http://mocha.rubyforge.org/examples/stubba.html"&gt;Setting expectations on real (non-mock) classes&lt;/a&gt;&lt;/li&gt;
	&lt;/ul&gt;


	&lt;p&gt;Good general information on mocking&amp;#8230;&lt;/p&gt;


	&lt;ul&gt;
	&lt;li&gt;&lt;a href="http://www.martinfowler.com/articles/mocksArentStubs.html"&gt;Mocks Aren&amp;#8217;t Stubs&lt;/a&gt; by &lt;a href="http://www.martinfowler.com/"&gt;Martin Fowler&lt;/a&gt;&lt;/li&gt;
		&lt;li&gt;&lt;a href="http://www.jmock.org/yoga.html"&gt;JMock &amp;#8211; Yoga for your unit tests&lt;/a&gt; by &lt;a href="http://nat.truemesh.com/"&gt;Nat Pryce&lt;/a&gt;&lt;/li&gt;
	&lt;/ul&gt;</description>
      <pubDate>Sun, 03 Sep 2006 18:20:00 +0000</pubDate>
      <guid isPermaLink="false">urn:uuid:d79eed64-175c-4108-887d-e122324a8696</guid>
      <author>James Mead</author>
      <link>http://blog.floehopper.org/articles/2006/09/03/new-mocha-docs</link>
      <category>mocha</category>
      <category>stubba</category>
      <category>test</category>
      <category>testing</category>
      <category>mock</category>
      <category>stub</category>
      <category>jmock</category>
      <category>coderay</category>
      <category>syntax</category>
      <category>highlight</category>
      <category>mocking</category>
      <category>stubbing</category>
      <category>ruby</category>
      <category>rails</category>
    </item>
    <item>
      <title>Mocha Quickstart</title>
      <description>&lt;p&gt;I really must get round to writing some better documentation for &lt;a href="http://mocha.rubyforge.org"&gt;Mocha&lt;/a&gt;, but in the meantime here&amp;#8217;s a quickstart guide&lt;sup&gt;&lt;a href="#fn1"&gt;1&lt;/a&gt;&lt;/sup&gt;.&lt;/p&gt;


	&lt;p&gt;Mocha adds a couple of new methods to all objects and classes &amp;#8211; &lt;code&gt;expects&lt;/code&gt; which sets up auto-verified expectations and &lt;code&gt;stubs&lt;/code&gt; which stubs the method allowing any number of calls.&lt;/p&gt;


	&lt;p&gt;Both the &lt;code&gt;expects&lt;/code&gt; and &lt;code&gt;stubs&lt;/code&gt; methods actually return an &lt;a href="http://mocha.rubyforge.org/classes/Mocha/Expectation.html"&gt;expectation&lt;/a&gt; object. Relevant methods on an expectation are: &lt;code&gt;at_least, at_least_once, never, raises, returns, times, with, yields&lt;/code&gt; which are hopefully fairly self-explanatory. If not there are some clues &lt;a href="http://mocha.rubyforge.org/classes/Mocha/Expectation.html"&gt;here&lt;/a&gt;&lt;/p&gt;


&lt;strong&gt;Mocking a class method&lt;/strong&gt;
&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&gt;  &lt;span class="ident"&gt;product&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="constant"&gt;Product&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;new&lt;/span&gt;
  &lt;span class="constant"&gt;Product&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;expects&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="symbol"&gt;:find&lt;/span&gt;&lt;span class="punct"&gt;).&lt;/span&gt;&lt;span class="ident"&gt;with&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="number"&gt;1&lt;/span&gt;&lt;span class="punct"&gt;).&lt;/span&gt;&lt;span class="ident"&gt;returns&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;product&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;
  &lt;span class="ident"&gt;assert_equal&lt;/span&gt; &lt;span class="ident"&gt;product&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="constant"&gt;Product&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;find&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="number"&gt;1&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;strong&gt;Mocking an instance method on a real object&lt;/strong&gt;
&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&gt;  &lt;span class="ident"&gt;product&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="constant"&gt;Product&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;new&lt;/span&gt;
  &lt;span class="ident"&gt;product&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;expects&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="symbol"&gt;:save&lt;/span&gt;&lt;span class="punct"&gt;).&lt;/span&gt;&lt;span class="ident"&gt;returns&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="constant"&gt;true&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;
  &lt;span class="ident"&gt;assert&lt;/span&gt; &lt;span class="ident"&gt;product&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;save&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;strong&gt;Stubbing instance methods on real object&lt;/strong&gt;
&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&gt;  &lt;span class="ident"&gt;prices&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="punct"&gt;[&lt;/span&gt;&lt;span class="ident"&gt;stub&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="symbol"&gt;:pence&lt;/span&gt; &lt;span class="punct"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="number"&gt;1000&lt;/span&gt;&lt;span class="punct"&gt;),&lt;/span&gt; &lt;span class="ident"&gt;stub&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="symbol"&gt;:pence&lt;/span&gt; &lt;span class="punct"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="number"&gt;2000&lt;/span&gt;&lt;span class="punct"&gt;)]&lt;/span&gt;
  &lt;span class="ident"&gt;product&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="constant"&gt;Product&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;new&lt;/span&gt;
  &lt;span class="ident"&gt;product&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;stubs&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="symbol"&gt;:prices&lt;/span&gt;&lt;span class="punct"&gt;).&lt;/span&gt;&lt;span class="ident"&gt;returns&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;prices&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;
  &lt;span class="ident"&gt;assert_equal&lt;/span&gt; &lt;span class="punct"&gt;[&lt;/span&gt;&lt;span class="number"&gt;1000&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="number"&gt;2000&lt;/span&gt;&lt;span class="punct"&gt;],&lt;/span&gt; &lt;span class="ident"&gt;product&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;prices&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;collect&lt;/span&gt; &lt;span class="punct"&gt;{|&lt;/span&gt;&lt;span class="ident"&gt;p&lt;/span&gt;&lt;span class="punct"&gt;|&lt;/span&gt; &lt;span class="ident"&gt;p&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;pence&lt;/span&gt;&lt;span class="punct"&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;strong&gt;Stubbing an instance method on all instances of a class&lt;/strong&gt;
&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&gt;  &lt;span class="constant"&gt;Product&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;any_instance&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;stubs&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="symbol"&gt;:name&lt;/span&gt;&lt;span class="punct"&gt;).&lt;/span&gt;&lt;span class="ident"&gt;returns&lt;/span&gt;&lt;span class="punct"&gt;('&lt;/span&gt;&lt;span class="string"&gt;stubbed_name&lt;/span&gt;&lt;span class="punct"&gt;')&lt;/span&gt;
  &lt;span class="ident"&gt;product&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="constant"&gt;Product&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;new&lt;/span&gt;
  &lt;span class="ident"&gt;assert_equal&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;stubbed_name&lt;/span&gt;&lt;span class="punct"&gt;',&lt;/span&gt; &lt;span class="ident"&gt;product&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;name&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;strong&gt;Traditional mocking&lt;/strong&gt;
&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&gt;  &lt;span class="ident"&gt;object&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="ident"&gt;mock&lt;/span&gt;&lt;span class="punct"&gt;()&lt;/span&gt;
  &lt;span class="ident"&gt;object&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;expects&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="symbol"&gt;:expected_method&lt;/span&gt;&lt;span class="punct"&gt;).&lt;/span&gt;&lt;span class="ident"&gt;with&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="symbol"&gt;:p1&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="symbol"&gt;:p2&lt;/span&gt;&lt;span class="punct"&gt;).&lt;/span&gt;&lt;span class="ident"&gt;returns&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="symbol"&gt;:result&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;
  &lt;span class="ident"&gt;assert_equal&lt;/span&gt; &lt;span class="symbol"&gt;:result&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="ident"&gt;object&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;expected_method&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="symbol"&gt;:p1&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="symbol"&gt;:p2&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;strong&gt;Shortcuts&lt;/strong&gt;
&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&gt;  &lt;span class="ident"&gt;object&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="ident"&gt;stub&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="symbol"&gt;:method1&lt;/span&gt; &lt;span class="punct"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="symbol"&gt;:result1&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="symbol"&gt;:method2&lt;/span&gt; &lt;span class="punct"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="symbol"&gt;:result2&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;
  &lt;span class="ident"&gt;assert_equal&lt;/span&gt; &lt;span class="symbol"&gt;:result1&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="ident"&gt;object&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;method1&lt;/span&gt;
  &lt;span class="ident"&gt;assert_equal&lt;/span&gt; &lt;span class="symbol"&gt;:result2&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="ident"&gt;object&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;method2&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

	&lt;p id="fn1"&gt;&lt;sup&gt;1&lt;/sup&gt; I wrote these examples without checking them, so there may be some typos.&lt;/p&gt;</description>
      <pubDate>Fri, 01 Sep 2006 14:07:00 +0000</pubDate>
      <guid isPermaLink="false">urn:uuid:bcb447d0-e449-4fc0-8f14-c285d0b5e618</guid>
      <author>James Mead</author>
      <link>http://blog.floehopper.org/articles/2006/09/01/mocha-quickstart</link>
      <category>ruby</category>
      <category>mock</category>
      <category>rails</category>
      <category>stub</category>
      <category>testing</category>
      <category>interception</category>
      <category>class</category>
      <category>instance</category>
      <category>quickstart</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Injecting mocks (the Mocha way)</title>
      <description>&lt;p&gt;I thought I&amp;#8217;d compare and contrast the way &lt;a href="http://glu.ttono.us/"&gt;Gluttonous&lt;/a&gt; was &lt;a href="http://glu.ttono.us/articles/2006/08/30/injecting-mocks-one-way-or-another"&gt;injecting mocks&lt;/a&gt; and how you can do it with &lt;a href="http://mocha.rubyforge.org"&gt;Mocha&lt;/a&gt;.&lt;/p&gt;


	&lt;p&gt;&lt;strong&gt;Gluttonous&amp;#8217; way&lt;/strong&gt;&lt;/p&gt;


&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&gt;  &lt;span class="keyword"&gt;def &lt;/span&gt;&lt;span class="method"&gt;test_process_exit&lt;/span&gt;
    &lt;span class="ident"&gt;delegate_methods_to_mock!&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="constant"&gt;RailsFCGIHandler&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="symbol"&gt;:close_connection&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt; &lt;span class="keyword"&gt;do&lt;/span&gt;
      &lt;span class="ident"&gt;fcgi&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="ident"&gt;flexmock&lt;/span&gt;&lt;span class="punct"&gt;()&lt;/span&gt;
      &lt;span class="ident"&gt;fcgi&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;should_receive&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="symbol"&gt;:close_connection&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;
      &lt;span class="attribute"&gt;@handler&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;mock&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="ident"&gt;fcgi&lt;/span&gt;
      &lt;span class="attribute"&gt;@handler&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;stubs&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="symbol"&gt;:when_ready&lt;/span&gt;&lt;span class="punct"&gt;).&lt;/span&gt;&lt;span class="ident"&gt;returns&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="symbol"&gt;:exit&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;
      &lt;span class="attribute"&gt;@handler&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;process!&lt;/span&gt;
    &lt;span class="keyword"&gt;end&lt;/span&gt;
  &lt;span class="keyword"&gt;end&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

	&lt;p&gt;&lt;strong&gt;Using Mocha&lt;/strong&gt;&lt;/p&gt;


&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&gt;  &lt;span class="keyword"&gt;def &lt;/span&gt;&lt;span class="method"&gt;test_process_exit&lt;/span&gt;
    &lt;span class="attribute"&gt;@handler&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;expects&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="symbol"&gt;:close_connection&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;
    &lt;span class="attribute"&gt;@handler&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;stubs&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="symbol"&gt;:when_ready&lt;/span&gt;&lt;span class="punct"&gt;).&lt;/span&gt;&lt;span class="ident"&gt;returns&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="symbol"&gt;:exit&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;
    &lt;span class="attribute"&gt;@handler&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;process!&lt;/span&gt;
  &lt;span class="keyword"&gt;end&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

	&lt;p&gt;I think it&amp;#8217;s a bit more readable and you don&amp;#8217;t need the block construction which starts becoming a nuisance when you need to stub methods on multiple classes.&lt;/p&gt;</description>
      <pubDate>Fri, 01 Sep 2006 06:26:00 +0000</pubDate>
      <guid isPermaLink="false">urn:uuid:a9ecb1f5-c741-470a-8d59-491c92512936</guid>
      <author>James Mead</author>
      <link>http://blog.floehopper.org/articles/2006/09/01/injecting-mocks-the-mocha-way</link>
      <category>mocha</category>
      <category>mock</category>
      <category>mocking</category>
      <category>stub</category>
      <category>stubbing</category>
      <category>ruby</category>
      <category>rails</category>
      <category>test</category>
      <category>testing</category>
      <category>fixture</category>
    </item>
  </channel>
</rss>
