<?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 mocking</title>
    <link>http://blog.floehopper.org/articles/tag/mocking?tag=mocking</link>
    <language>en-us</language>
    <ttl>40</ttl>
    <description>thoughts on the bergy bits of life</description>
    <item>
      <title>The Difference between Mocks and Stubs</title>
      <description>&lt;p&gt;Some recent converstations have made me realise that a lot of people are confused by the difference between mocking and stubbing. I&amp;#8217;ve realised that I&amp;#8217;ve only added to the confusion by calling part of the &lt;a href="http://mocha.rubyforge.com"&gt;Mocha&lt;/a&gt; library, Stubba.&lt;/p&gt;


	&lt;p&gt;&lt;strong&gt;The difference between mocking and stubbing&lt;/strong&gt;&lt;/p&gt;


	&lt;p&gt;Stubbing a method is all about replacing the method with code that returns a specified result (or perhaps raises a specified exception). Mocking a method is all about asserting that a method has been called (perhaps with particular parameters).&lt;/p&gt;


	&lt;p&gt;If you think about it, it&amp;#8217;s difficult (or impossible?) to do mocking without stubbing &amp;#8211; you need to return from the mocked method, so that the code under test can complete execution. So mocking libraries tend to implicitly or explicitly allow you to do stubbing.&lt;/p&gt;


	&lt;p&gt;&lt;strong&gt;Mocking and stubbing with Mocha&lt;/strong&gt;&lt;/p&gt;


	&lt;p&gt;To stub a method, use the &lt;a href="http://mocha.rubyforge.org/classes/Mocha/MockMethods.html#M000006"&gt;stubs&lt;/a&gt; method.
To mock a method, use the &lt;a href="http://mocha.rubyforge.org/classes/Mocha/MockMethods.html#M000005"&gt;expects&lt;/a&gt; method.&lt;/p&gt;


	&lt;p&gt;&lt;strong&gt;The difference between Mocha and Stubba&lt;/strong&gt;&lt;/p&gt;


	&lt;p&gt;&lt;a href="http://mocha.rubyforge.com"&gt;Mocha&lt;/a&gt; is a traditional mocking library very much in the &lt;a href="http://www.jmock.org"&gt;JMock&lt;/a&gt; mould. Stubba is a separate part of Mocha that allows mocking &lt;strong&gt;and&lt;/strong&gt; stubbing of methods on real (non-mock) classes. It works by moving the method of interest to one side, adding a new stubbed version of the method which delegates to a traditional mock object. You can use this mock object to set up stubbed return values or set up expectations of methods to be called. After the test completes the stubbed version of the method is removed and replaced by the original.&lt;/p&gt;


	&lt;p&gt;I&amp;#8217;m thinking of ditching the name Stubba, because this part of the library is not solely concerned with stubbing. Let me know what you think.&lt;/p&gt;


	&lt;p&gt;Martin Fowler has a must-read article on why &lt;a href="http://www.martinfowler.com/articles/mocksArentStubs.html"&gt;Mocks Aren&amp;#8217;t Stubs&lt;/a&gt;.&lt;/p&gt;


	&lt;p&gt;Another great reference is JMocks documentation &amp;#8211; in particular &lt;a href="http://www.jmock.org/yoga.html"&gt;Yoga for your Unit Tests&lt;/a&gt;.&lt;/p&gt;&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&gt;&lt;span class="keyword"&gt;class &lt;/span&gt;&lt;span class="class"&gt;ClassUnderTest&lt;/span&gt;
  &lt;span class="keyword"&gt;def &lt;/span&gt;&lt;span class="method"&gt;initialize&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;dependency&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;
    &lt;span class="attribute"&gt;@dependency&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="ident"&gt;dependency&lt;/span&gt;
  &lt;span class="keyword"&gt;end&lt;/span&gt;
  &lt;span class="keyword"&gt;def &lt;/span&gt;&lt;span class="method"&gt;do_it&lt;/span&gt;
    &lt;span class="attribute"&gt;@dependency&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;execute&lt;/span&gt;
  &lt;span class="keyword"&gt;end&lt;/span&gt;
&lt;span class="keyword"&gt;end&lt;/span&gt;

&lt;span class="keyword"&gt;class &lt;/span&gt;&lt;span class="class"&gt;Dependency&lt;/span&gt;
  &lt;span class="keyword"&gt;def &lt;/span&gt;&lt;span class="method"&gt;execute&lt;/span&gt;
    &lt;span class="comment"&gt;# complicated code&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;strong&gt;Stubbing example&lt;/strong&gt;
&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&gt;&lt;span class="keyword"&gt;class &lt;/span&gt;&lt;span class="class"&gt;MyTest&lt;/span&gt; &lt;span class="punct"&gt;&amp;lt;&lt;/span&gt; &lt;span class="constant"&gt;Test&lt;/span&gt;&lt;span class="punct"&gt;::&lt;/span&gt;&lt;span class="constant"&gt;Unit&lt;/span&gt;&lt;span class="punct"&gt;::&lt;/span&gt;&lt;span class="constant"&gt;TestCase&lt;/span&gt;
  &lt;span class="keyword"&gt;class &lt;/span&gt;&lt;span class="class"&gt;DependencyStub&lt;/span&gt;
    &lt;span class="keyword"&gt;def &lt;/span&gt;&lt;span class="method"&gt;execute&lt;/span&gt;
      &lt;span class="constant"&gt;true&lt;/span&gt;
    &lt;span class="keyword"&gt;end&lt;/span&gt;
  &lt;span class="keyword"&gt;end&lt;/span&gt;
  &lt;span class="keyword"&gt;def &lt;/span&gt;&lt;span class="method"&gt;test_stubbing_example&lt;/span&gt;
    &lt;span class="ident"&gt;dependency&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="constant"&gt;DependencyStub&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;class_under_test&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="constant"&gt;ClassUnderTest&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;new&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;dependency&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;
    &lt;span class="ident"&gt;assert_equal&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;class_under_test&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;do_it&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;strong&gt;Mocking example&lt;/strong&gt;
&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&gt;&lt;span class="keyword"&gt;class &lt;/span&gt;&lt;span class="class"&gt;MyTest&lt;/span&gt; &lt;span class="punct"&gt;&amp;lt;&lt;/span&gt; &lt;span class="constant"&gt;Test&lt;/span&gt;&lt;span class="punct"&gt;::&lt;/span&gt;&lt;span class="constant"&gt;Unit&lt;/span&gt;&lt;span class="punct"&gt;::&lt;/span&gt;&lt;span class="constant"&gt;TestCase&lt;/span&gt;
  &lt;span class="keyword"&gt;class &lt;/span&gt;&lt;span class="class"&gt;DependencyMock&lt;/span&gt;
    &lt;span class="ident"&gt;attr_reader&lt;/span&gt; &lt;span class="symbol"&gt;:call_count&lt;/span&gt;
    &lt;span class="keyword"&gt;def &lt;/span&gt;&lt;span class="method"&gt;initialize&lt;/span&gt;
      &lt;span class="attribute"&gt;@call_count&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="number"&gt;0&lt;/span&gt;
    &lt;span class="keyword"&gt;end&lt;/span&gt;
    &lt;span class="keyword"&gt;def &lt;/span&gt;&lt;span class="method"&gt;execute&lt;/span&gt;
      &lt;span class="attribute"&gt;@call_count&lt;/span&gt; &lt;span class="punct"&gt;+=&lt;/span&gt; &lt;span class="number"&gt;1&lt;/span&gt;
    &lt;span class="keyword"&gt;end&lt;/span&gt;
  &lt;span class="keyword"&gt;end&lt;/span&gt;
  &lt;span class="keyword"&gt;def &lt;/span&gt;&lt;span class="method"&gt;test_mocking_example&lt;/span&gt;
    &lt;span class="ident"&gt;dependency&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="constant"&gt;DependencyMock&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;class_under_test&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="constant"&gt;ClassUnderTest&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;new&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;dependency&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;
    &lt;span class="ident"&gt;class_under_test&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;do_it&lt;/span&gt;
    &lt;span class="ident"&gt;assert_equal&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;dependency&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;call_count&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;</description>
      <pubDate>Mon, 11 Sep 2006 02:59:00 +0000</pubDate>
      <guid isPermaLink="false">urn:uuid:ac0cff8e-8238-4234-87e7-16fd6739d5b6</guid>
      <author>James Mead</author>
      <link>http://blog.floehopper.org/articles/2006/09/11/the-difference-between-mocks-and-stubs</link>
      <category>ruby</category>
      <category>difference</category>
      <category>mock</category>
      <category>stub</category>
      <category>expectation</category>
      <category>mocha</category>
      <category>stubba</category>
      <category>testing</category>
      <category>mocking</category>
      <category>stubbing</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>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>
    <item>
      <title>Mocks on Rails</title>
      <description>&lt;p&gt;It&amp;#8217;s great to see that &lt;a href="http://glu.ttono.us/"&gt;Gluttonous&lt;/a&gt; has been playing with &lt;a href="http://mocha.rubyforge.org"&gt;Mocha&lt;/a&gt;. Like many people, he&amp;#8217;s found the ability to mock or stub class methods particularly useful &amp;#8211; and this is one of the key differentiators between &lt;a href="http://mocha.rubyforge.org"&gt;Mocha&lt;/a&gt; and other Ruby &lt;a href="http://onestepback.org/software/flexmock/"&gt;mocking&lt;/a&gt; &lt;a href="http://rspec.rubyforge.org/"&gt;libraries&lt;/a&gt;.&lt;/p&gt;


	&lt;p&gt;He&amp;#8217;s been trying to improve the test coverage for &lt;a href="http://www.rubyonrails.com/"&gt;Rails&lt;/a&gt; and submitted &lt;a href="http://dev.rubyonrails.org/ticket/5970"&gt;this patch&lt;/a&gt; where there is an interesting discussion&lt;sup&gt;&lt;a href="#fn1"&gt;1&lt;/a&gt;&lt;/sup&gt; about why he would prefer to use &lt;a href="http://mocha.rubyforge.org"&gt;Mocha&lt;/a&gt;. Interestingly, there has also been some recent &lt;a href="http://rubyforge.org/pipermail/rspec-devel/2006-August/000548.html"&gt;discussion&lt;/a&gt; on the &lt;a href="http://rspec.rubyforge.org/"&gt;RSpec&lt;/a&gt; mailing list about adding Mocha-like functionality.&lt;/p&gt;


	&lt;p&gt;On a different note, in his article &lt;a href="http://glu.ttono.us/articles/2006/08/30/mocks-for-speed"&gt;Mocks for Speed&lt;/a&gt;, Gluttonous draws attention to one of the advantages I have &lt;a href="http://blog.floehopper.org/articles/2006/06/27/rails-fixtures-help-or-hindrance"&gt;previously mentioned&lt;/a&gt; of using mocks extensively to write unit tests that test a class in isolation &amp;#8211; namely a fast build.&lt;/p&gt;


	&lt;p id="fn1"&gt;&lt;sup&gt;1&lt;/sup&gt; We have now released Mocha under the &lt;span class="caps"&gt;MIT&lt;/span&gt; license so it can be used for testing within Rails.&lt;/p&gt;</description>
      <pubDate>Thu, 31 Aug 2006 04:25:00 +0000</pubDate>
      <guid isPermaLink="false">urn:uuid:dac77856-ab70-4342-84e8-3e61460785b2</guid>
      <author>James Mead</author>
      <link>http://blog.floehopper.org/articles/2006/08/31/mocks-on-rails</link>
      <category>mock</category>
      <category>stub</category>
      <category>mocking</category>
      <category>stubbing</category>
      <category>ruby</category>
      <category>rails</category>
      <category>test</category>
      <category>testing</category>
      <category>class</category>
      <category>instance</category>
      <category>method</category>
      <category>fixture</category>
    </item>
    <item>
      <title>Mocha 0.3 released with Rails plugin</title>
      <description>&lt;p&gt;A new version of the &lt;a href="http://mocha.rubyforge.org"&gt;Mocha&lt;/a&gt; mocking and stubbing library developed at &lt;a href="http://www.reevoo.com"&gt;Reevoo&lt;/a&gt; has been released.&lt;/p&gt;


	&lt;p&gt;There is now a &lt;a href="http://www.rubyonrails.com"&gt;Ruby on Rails&lt;/a&gt; &lt;a href="http://www.agilewebdevelopment.com/plugins/mocha"&gt;plugin&lt;/a&gt; which can be installed like this&amp;#8230;&lt;/p&gt;


&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_default "&gt;  $ script/plugin install svn://rubyforge.org/var/svn/mocha/trunk&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

	&lt;p&gt;Here are the release notes&amp;#8230;&lt;/p&gt;


	&lt;ul&gt;
	&lt;li&gt;Rails plugin.&lt;/li&gt;
		&lt;li&gt;Auto-verify for all expectations, including those on concrete classes.&lt;/li&gt;
		&lt;li&gt;Include each expectation verification in the test result assertion count.&lt;/li&gt;
		&lt;li&gt;Filter out noise from assertion backtraces.&lt;/li&gt;
		&lt;li&gt;Point assertion backtrace to line where failing expectation was created.&lt;/li&gt;
		&lt;li&gt;New yields method for expectations.&lt;/li&gt;
		&lt;li&gt;Create stubs which stub all method calls.&lt;/li&gt;
		&lt;li&gt;Mocks now respond_to? expected methods.&lt;/li&gt;
	&lt;/ul&gt;


	&lt;p&gt;Thanks for patches from &lt;a href="http://blog.seagul.co.uk"&gt;Chris&lt;/a&gt;.&lt;/p&gt;


	&lt;p&gt;Enjoy!&lt;/p&gt;</description>
      <pubDate>Thu, 24 Aug 2006 17:59:00 +0000</pubDate>
      <guid isPermaLink="false">urn:uuid:52de41a9-e88b-48cf-afdc-41da274d5b14</guid>
      <author>James Mead</author>
      <link>http://blog.floehopper.org/articles/2006/08/24/mocha-0-3-released-with-rails-plugin</link>
      <category>mocha_release</category>
      <category>rails</category>
      <category>plugin</category>
      <category>ruby</category>
      <category>test</category>
      <category>mock</category>
      <category>stub</category>
      <category>testing</category>
      <category>mocking</category>
      <category>stubbing</category>
      <category>fixtures</category>
      <category>expectation</category>
      <category>verify</category>
    </item>
    <item>
      <title>Mocha 0.2 released</title>
      <description>&lt;p&gt;I&amp;#8217;ve just released a &lt;a href="http://rubyforge.org/frs/?group_id=1917"&gt;new version&lt;/a&gt; of the Ruby mocking and stubbing library, &lt;a href="http://mocha.rubyforge.org"&gt;Mocha&lt;/a&gt;, that I first &lt;a href="http://blog.floehopper.org/articles/2006/07/16/mocking-and-stubbing-in-ruby"&gt;mentioned&lt;/a&gt; a while ago. Here are the release notes:&lt;/p&gt;


	&lt;ul&gt;
	&lt;li&gt;Small change to SetupAndTeardown#teardown_stubs suggested by &lt;a href="http://www.lukeredpath.co.uk"&gt;Luke Redpath&lt;/a&gt; to allow use of Stubba with &lt;a href="http://rspec.rubyforge.org"&gt;RSpec&lt;/a&gt;.&lt;/li&gt;
		&lt;li&gt;Reorganized directory structure and extracted addition of setup and teardown methods into SmartTestCase mini-library.&lt;/li&gt;
		&lt;li&gt;Addition of auto-verify for Mocha (but not Stubba). This means there is more significance in the choice of expects or stubs in that any expects on a mock will automatically get verified.&lt;/li&gt;
	&lt;/ul&gt;


	&lt;p&gt;So instead of…&lt;/p&gt;


&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&gt;  &lt;span class="ident"&gt;wotsit&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="constant"&gt;Mocha&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;wotsit&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;:thingummy&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;5&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="number"&gt;10&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;
  &lt;span class="ident"&gt;doobrey&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="constant"&gt;Doobrey&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;new&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;wotsit&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;
  &lt;span class="ident"&gt;doobrey&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;hoojamaflip&lt;/span&gt;
  &lt;span class="ident"&gt;wotsit&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;verify&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

	&lt;p&gt;you need to do…&lt;/p&gt;


&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&gt;  &lt;span class="ident"&gt;wotsit&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;wotsit&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;:thingummy&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;5&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="number"&gt;10&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;
  &lt;span class="ident"&gt;doobrey&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="constant"&gt;Doobrey&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;new&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;wotsit&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;
  &lt;span class="ident"&gt;doobrey&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;hoojamaflip&lt;/span&gt;
  &lt;span class="comment"&gt;# no need to verify&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

	&lt;p&gt;There are also shortcuts as follows…&lt;/p&gt;


	&lt;p&gt;instead of…&lt;/p&gt;


&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&gt;  &lt;span class="ident"&gt;wotsit&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="constant"&gt;Mocha&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;wotsit&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;:thingummy&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="number"&gt;10&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;
  &lt;span class="ident"&gt;wotsit&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;:summat&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="number"&gt;25&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

	&lt;p&gt;you can have…&lt;/p&gt;


&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&gt;  &lt;span class="ident"&gt;wotsit&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="symbol"&gt;:thingummy&lt;/span&gt; &lt;span class="punct"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="number"&gt;5&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="symbol"&gt;:summat&lt;/span&gt; &lt;span class="punct"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="number"&gt;25&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

	&lt;p&gt;and instead of…&lt;/p&gt;


&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&gt;  &lt;span class="ident"&gt;wotsit&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="constant"&gt;Mocha&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;wotsit&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;:thingummy&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="number"&gt;10&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;
  &lt;span class="ident"&gt;wotsit&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;:summat&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="number"&gt;25&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

	&lt;p&gt;you can have…&lt;/p&gt;


&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&gt;  &lt;span class="ident"&gt;wotsit&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;:thingummy&lt;/span&gt; &lt;span class="punct"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="number"&gt;5&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="symbol"&gt;:summat&lt;/span&gt; &lt;span class="punct"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="number"&gt;25&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description>
      <pubDate>Fri, 11 Aug 2006 11:57:00 +0000</pubDate>
      <guid isPermaLink="false">urn:uuid:295adadf-9daa-4a29-ae65-7bd0b6880d59</guid>
      <author>James Mead</author>
      <link>http://blog.floehopper.org/articles/2006/08/11/mocha-0-2-released</link>
      <category>mocha_release</category>
      <category>mocha</category>
      <category>stubba</category>
      <category>test</category>
      <category>testing</category>
      <category>mock</category>
      <category>stub</category>
      <category>mocking</category>
      <category>stubbing</category>
      <category>ruby</category>
      <category>rails</category>
    </item>
    <item>
      <title>AutoMocha example</title>
      <description>&lt;p&gt;Again &amp;#8211; I&amp;#8217;m not really very pleased with this example, but hopefully it makes some sense. It&amp;#8217;s important to realise that the test is not running in a normal &lt;a href="http://www.rubyonrails.org"&gt;Rails&lt;/a&gt; environment with the standard auto-require. In fact the first time the Comment class is encountered AutoMocha uses const_missing to supply a Mocha::Mock in its place. From that point on &amp;#8211; any further references get the same mock object.&lt;/p&gt;


&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&gt;  &lt;span class="keyword"&gt;class &lt;/span&gt;&lt;span class="class"&gt;Article&lt;/span&gt;

    &lt;span class="ident"&gt;attr_reader&lt;/span&gt; &lt;span class="symbol"&gt;:id&lt;/span&gt;

    &lt;span class="keyword"&gt;def &lt;/span&gt;&lt;span class="method"&gt;accepted_comments&lt;/span&gt;
      &lt;span class="constant"&gt;Comment&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;find_all_by_article_id&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="constant"&gt;self&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;id&lt;/span&gt;&lt;span class="punct"&gt;).&lt;/span&gt;&lt;span class="ident"&gt;select&lt;/span&gt; &lt;span class="punct"&gt;{&lt;/span&gt; &lt;span class="punct"&gt;|&lt;/span&gt;&lt;span class="ident"&gt;comment&lt;/span&gt;&lt;span class="punct"&gt;|&lt;/span&gt; &lt;span class="ident"&gt;comment&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;accepted?&lt;/span&gt; &lt;span class="punct"&gt;}&lt;/span&gt;
    &lt;span class="keyword"&gt;end&lt;/span&gt;

  &lt;span class="keyword"&gt;end&lt;/span&gt;

  &lt;span class="ident"&gt;require&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;rubygems&lt;/span&gt;&lt;span class="punct"&gt;'&lt;/span&gt;
  &lt;span class="ident"&gt;require&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;auto_mocha&lt;/span&gt;&lt;span class="punct"&gt;'&lt;/span&gt;
  &lt;span class="ident"&gt;require&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;test/unit&lt;/span&gt;&lt;span class="punct"&gt;'&lt;/span&gt;

  &lt;span class="keyword"&gt;class &lt;/span&gt;&lt;span class="class"&gt;OrderTest&lt;/span&gt; &lt;span class="punct"&gt;&amp;lt;&lt;/span&gt; &lt;span class="constant"&gt;Test&lt;/span&gt;&lt;span class="punct"&gt;::&lt;/span&gt;&lt;span class="constant"&gt;Unit&lt;/span&gt;&lt;span class="punct"&gt;::&lt;/span&gt;&lt;span class="constant"&gt;TestCase&lt;/span&gt;

    &lt;span class="ident"&gt;include&lt;/span&gt; &lt;span class="constant"&gt;Mocha&lt;/span&gt;

    &lt;span class="comment"&gt;# illustrates stubbing of previously undefined class Comment&lt;/span&gt;
    &lt;span class="keyword"&gt;def &lt;/span&gt;&lt;span class="method"&gt;test_should_return_accepted_comments_for_this_article&lt;/span&gt;
      &lt;span class="ident"&gt;unaccepted_comment&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="constant"&gt;Mock&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;new&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="symbol"&gt;:accepted?&lt;/span&gt; &lt;span class="punct"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="constant"&gt;false&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;
      &lt;span class="ident"&gt;accepted_comment&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="constant"&gt;Mock&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;new&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="symbol"&gt;:accepted?&lt;/span&gt; &lt;span class="punct"&gt;=&amp;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;comments&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="punct"&gt;[&lt;/span&gt;&lt;span class="ident"&gt;unaccepted_comment&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="ident"&gt;accepted_comment&lt;/span&gt;&lt;span class="punct"&gt;]&lt;/span&gt;
      &lt;span class="constant"&gt;Comment&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;:find_all_by_article_id&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;comments&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;
      &lt;span class="ident"&gt;article&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="constant"&gt;Article&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="ident"&gt;accepted_comment&lt;/span&gt;&lt;span class="punct"&gt;],&lt;/span&gt; &lt;span class="ident"&gt;article&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;accepted_comments&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;</description>
      <pubDate>Sun, 16 Jul 2006 19:01:00 +0000</pubDate>
      <guid isPermaLink="false">urn:uuid:047345b6-c9e3-4929-9c16-1f810db0c371</guid>
      <author>James Mead</author>
      <link>http://blog.floehopper.org/articles/2006/07/16/automocha-example</link>
      <category>mock</category>
      <category>mocking</category>
      <category>stub</category>
      <category>stubbing</category>
      <category>ruby</category>
      <category>class</category>
      <category>method</category>
      <category>expectation</category>
      <category>test</category>
      <category>testing</category>
      <category>dependency</category>
      <category>rails</category>
    </item>
    <item>
      <title>Stubba example</title>
      <description>&lt;p&gt;I don&amp;#8217;t really like this example, but it&amp;#8217;s the best I&amp;#8217;ve got at the moment. The any_instance bit is particularly contrived, but hopefully you get the idea.&lt;/p&gt;


&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&gt;  &lt;span class="keyword"&gt;class &lt;/span&gt;&lt;span class="class"&gt;Order&lt;/span&gt;

    &lt;span class="ident"&gt;attr_accessor&lt;/span&gt; &lt;span class="symbol"&gt;:shipped_on&lt;/span&gt;

    &lt;span class="keyword"&gt;def &lt;/span&gt;&lt;span class="method"&gt;total_cost&lt;/span&gt;
      &lt;span class="ident"&gt;line_items&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;inject&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="number"&gt;0&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt; &lt;span class="punct"&gt;{&lt;/span&gt; &lt;span class="punct"&gt;|&lt;/span&gt;&lt;span class="ident"&gt;total&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="ident"&gt;line_item&lt;/span&gt;&lt;span class="punct"&gt;|&lt;/span&gt; &lt;span class="ident"&gt;total&lt;/span&gt; &lt;span class="punct"&gt;+&lt;/span&gt; &lt;span class="ident"&gt;line_item&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;price&lt;/span&gt; &lt;span class="punct"&gt;}&lt;/span&gt; &lt;span class="punct"&gt;+&lt;/span&gt; &lt;span class="ident"&gt;shipping_cost&lt;/span&gt;
    &lt;span class="keyword"&gt;end&lt;/span&gt;

    &lt;span class="keyword"&gt;def &lt;/span&gt;&lt;span class="method"&gt;total_weight&lt;/span&gt;
      &lt;span class="ident"&gt;line_items&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;inject&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="number"&gt;0&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt; &lt;span class="punct"&gt;{&lt;/span&gt; &lt;span class="punct"&gt;|&lt;/span&gt;&lt;span class="ident"&gt;total&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="ident"&gt;line_item&lt;/span&gt;&lt;span class="punct"&gt;|&lt;/span&gt; &lt;span class="ident"&gt;total&lt;/span&gt; &lt;span class="punct"&gt;+&lt;/span&gt; &lt;span class="ident"&gt;line_item&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;weight&lt;/span&gt; &lt;span class="punct"&gt;}&lt;/span&gt;
    &lt;span class="keyword"&gt;end&lt;/span&gt;

    &lt;span class="keyword"&gt;def &lt;/span&gt;&lt;span class="method"&gt;shipping_cost&lt;/span&gt;
      &lt;span class="ident"&gt;total_weight&lt;/span&gt; &lt;span class="punct"&gt;*&lt;/span&gt; &lt;span class="number"&gt;5&lt;/span&gt; &lt;span class="punct"&gt;+&lt;/span&gt; &lt;span class="number"&gt;10&lt;/span&gt;
    &lt;span class="keyword"&gt;end&lt;/span&gt;

    &lt;span class="keyword"&gt;class &lt;/span&gt;&lt;span class="punct"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="constant"&gt;self&lt;/span&gt;

      &lt;span class="keyword"&gt;def &lt;/span&gt;&lt;span class="method"&gt;find_all&lt;/span&gt;
        &lt;span class="comment"&gt;# Database.connection.execute('select * from orders...&lt;/span&gt;
      &lt;span class="keyword"&gt;end&lt;/span&gt;

      &lt;span class="keyword"&gt;def &lt;/span&gt;&lt;span class="method"&gt;number_shipped_since&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;date&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;
        &lt;span class="ident"&gt;find_all&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;select&lt;/span&gt; &lt;span class="punct"&gt;{&lt;/span&gt; &lt;span class="punct"&gt;|&lt;/span&gt;&lt;span class="ident"&gt;order&lt;/span&gt;&lt;span class="punct"&gt;|&lt;/span&gt; &lt;span class="ident"&gt;order&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;shipped_on&lt;/span&gt; &lt;span class="punct"&gt;&amp;gt;&lt;/span&gt; &lt;span class="ident"&gt;date&lt;/span&gt; &lt;span class="punct"&gt;}.&lt;/span&gt;&lt;span class="ident"&gt;size&lt;/span&gt;
      &lt;span class="keyword"&gt;end&lt;/span&gt;

      &lt;span class="keyword"&gt;def &lt;/span&gt;&lt;span class="method"&gt;unshipped_value&lt;/span&gt;
        &lt;span class="ident"&gt;find_all&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;inject&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="number"&gt;0&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt; &lt;span class="punct"&gt;{&lt;/span&gt; &lt;span class="punct"&gt;|&lt;/span&gt;&lt;span class="ident"&gt;total&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="ident"&gt;order&lt;/span&gt;&lt;span class="punct"&gt;|&lt;/span&gt; &lt;span class="ident"&gt;order&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;shipped_on&lt;/span&gt; &lt;span class="punct"&gt;?&lt;/span&gt; &lt;span class="ident"&gt;total&lt;/span&gt; &lt;span class="punct"&gt;:&lt;/span&gt; &lt;span class="ident"&gt;total&lt;/span&gt; &lt;span class="punct"&gt;+&lt;/span&gt; &lt;span class="ident"&gt;order&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;total_cost&lt;/span&gt; &lt;span class="punct"&gt;}&lt;/span&gt;
      &lt;span class="keyword"&gt;end&lt;/span&gt;

    &lt;span class="keyword"&gt;end&lt;/span&gt;

  &lt;span class="keyword"&gt;end&lt;/span&gt;

  &lt;span class="ident"&gt;require&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;rubygems&lt;/span&gt;&lt;span class="punct"&gt;'&lt;/span&gt;
  &lt;span class="ident"&gt;require&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;stubba&lt;/span&gt;&lt;span class="punct"&gt;'&lt;/span&gt;
  &lt;span class="ident"&gt;require&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;test/unit&lt;/span&gt;&lt;span class="punct"&gt;'&lt;/span&gt;

  &lt;span class="keyword"&gt;class &lt;/span&gt;&lt;span class="class"&gt;OrderTest&lt;/span&gt; &lt;span class="punct"&gt;&amp;lt;&lt;/span&gt; &lt;span class="constant"&gt;Test&lt;/span&gt;&lt;span class="punct"&gt;::&lt;/span&gt;&lt;span class="constant"&gt;Unit&lt;/span&gt;&lt;span class="punct"&gt;::&lt;/span&gt;&lt;span class="constant"&gt;TestCase&lt;/span&gt;

    &lt;span class="comment"&gt;# illustrates stubbing instance method&lt;/span&gt;
    &lt;span class="keyword"&gt;def &lt;/span&gt;&lt;span class="method"&gt;test_should_calculate_shipping_cost_based_on_total_weight&lt;/span&gt;
      &lt;span class="ident"&gt;order&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="constant"&gt;Order&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;order&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;:total_weight&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="number"&gt;10&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;
      &lt;span class="ident"&gt;assert_equal&lt;/span&gt; &lt;span class="number"&gt;60&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="ident"&gt;order&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;shipping_cost&lt;/span&gt;
    &lt;span class="keyword"&gt;end&lt;/span&gt;

    &lt;span class="comment"&gt;# illustrates stubbing class method&lt;/span&gt;
    &lt;span class="keyword"&gt;def &lt;/span&gt;&lt;span class="method"&gt;test_should_count_number_of_orders_shipped_after_specified_date&lt;/span&gt;
      &lt;span class="ident"&gt;now&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="constant"&gt;Time&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;now&lt;/span&gt;&lt;span class="punct"&gt;;&lt;/span&gt; &lt;span class="ident"&gt;week_in_secs&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="number"&gt;7&lt;/span&gt; &lt;span class="punct"&gt;*&lt;/span&gt; &lt;span class="number"&gt;24&lt;/span&gt; &lt;span class="punct"&gt;*&lt;/span&gt; &lt;span class="number"&gt;60&lt;/span&gt; &lt;span class="punct"&gt;*&lt;/span&gt; &lt;span class="number"&gt;60&lt;/span&gt;
      &lt;span class="ident"&gt;order_1&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="constant"&gt;Order&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;new&lt;/span&gt;&lt;span class="punct"&gt;;&lt;/span&gt; &lt;span class="ident"&gt;order_1&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;shipped_on&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="ident"&gt;now&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;week_in_secs&lt;/span&gt;
      &lt;span class="ident"&gt;order_2&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="constant"&gt;Order&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;new&lt;/span&gt;&lt;span class="punct"&gt;;&lt;/span&gt; &lt;span class="ident"&gt;order_2&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;shipped_on&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="ident"&gt;now&lt;/span&gt; &lt;span class="punct"&gt;-&lt;/span&gt; &lt;span class="number"&gt;3&lt;/span&gt; &lt;span class="punct"&gt;*&lt;/span&gt; &lt;span class="ident"&gt;week_in_secs&lt;/span&gt;
      &lt;span class="constant"&gt;Order&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;:find_all&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;order_1&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="ident"&gt;order_2&lt;/span&gt;&lt;span class="punct"&gt;])&lt;/span&gt;
      &lt;span class="ident"&gt;assert_equal&lt;/span&gt; &lt;span class="number"&gt;1&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="constant"&gt;Order&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;number_shipped_since&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;now&lt;/span&gt; &lt;span class="punct"&gt;-&lt;/span&gt; &lt;span class="number"&gt;2&lt;/span&gt; &lt;span class="punct"&gt;*&lt;/span&gt; &lt;span class="ident"&gt;week_in_secs&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;
    &lt;span class="keyword"&gt;end&lt;/span&gt;

    &lt;span class="comment"&gt;# illustrates stubbing instance method for all instances of a class&lt;/span&gt;
    &lt;span class="keyword"&gt;def &lt;/span&gt;&lt;span class="method"&gt;test_should_calculate_value_of_unshipped_orders&lt;/span&gt;
      &lt;span class="constant"&gt;Order&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;:find_all&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;Order&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;new&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="constant"&gt;Order&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;new&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="constant"&gt;Order&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;new&lt;/span&gt;&lt;span class="punct"&gt;])&lt;/span&gt;
      &lt;span class="constant"&gt;Order&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;:shipped_on&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;nil&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;
      &lt;span class="constant"&gt;Order&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;:total_cost&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="number"&gt;10&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;
      &lt;span class="ident"&gt;assert_equal&lt;/span&gt; &lt;span class="number"&gt;30&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="constant"&gt;Order&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;unshipped_value&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;</description>
      <pubDate>Sun, 16 Jul 2006 19:00:00 +0000</pubDate>
      <guid isPermaLink="false">urn:uuid:b24a913d-ebcb-4b66-97b4-56564f32f1f8</guid>
      <author>James Mead</author>
      <link>http://blog.floehopper.org/articles/2006/07/16/stubba-example</link>
      <category>mock</category>
      <category>mocking</category>
      <category>stub</category>
      <category>stubbing</category>
      <category>ruby</category>
      <category>class</category>
      <category>method</category>
      <category>expectation</category>
      <category>test</category>
      <category>testing</category>
    </item>
    <item>
      <title>Mocha example</title>
      <description>&lt;p&gt;I thought I&amp;#8217;d put the examples from the &lt;a href="http://mocha.rubyforge.org"&gt;RDoc&lt;/a&gt; README up here if only for the syntax highlighting.&lt;/p&gt;


&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&gt;  &lt;span class="keyword"&gt;class &lt;/span&gt;&lt;span class="class"&gt;Enterprise&lt;/span&gt;

    &lt;span class="keyword"&gt;def &lt;/span&gt;&lt;span class="method"&gt;initialize&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;dilithium&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;
      &lt;span class="attribute"&gt;@dilithium&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="ident"&gt;dilithium&lt;/span&gt;
    &lt;span class="keyword"&gt;end&lt;/span&gt;

    &lt;span class="keyword"&gt;def &lt;/span&gt;&lt;span class="method"&gt;go&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;warp_factor&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;
      &lt;span class="ident"&gt;warp_factor&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;times&lt;/span&gt; &lt;span class="punct"&gt;{&lt;/span&gt; &lt;span class="attribute"&gt;@dilithium&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;nuke&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="symbol"&gt;:anti_matter&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt; &lt;span class="punct"&gt;}&lt;/span&gt;
    &lt;span class="keyword"&gt;end&lt;/span&gt;

  &lt;span class="keyword"&gt;end&lt;/span&gt;

  &lt;span class="ident"&gt;require&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;rubygems&lt;/span&gt;&lt;span class="punct"&gt;'&lt;/span&gt;
  &lt;span class="ident"&gt;require&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;mocha&lt;/span&gt;&lt;span class="punct"&gt;'&lt;/span&gt;
  &lt;span class="ident"&gt;require&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;test/unit&lt;/span&gt;&lt;span class="punct"&gt;'&lt;/span&gt;

  &lt;span class="keyword"&gt;class &lt;/span&gt;&lt;span class="class"&gt;EnterpriseTest&lt;/span&gt; &lt;span class="punct"&gt;&amp;lt;&lt;/span&gt; &lt;span class="constant"&gt;Test&lt;/span&gt;&lt;span class="punct"&gt;::&lt;/span&gt;&lt;span class="constant"&gt;Unit&lt;/span&gt;&lt;span class="punct"&gt;::&lt;/span&gt;&lt;span class="constant"&gt;TestCase&lt;/span&gt;

    &lt;span class="ident"&gt;include&lt;/span&gt; &lt;span class="constant"&gt;Mocha&lt;/span&gt;

    &lt;span class="keyword"&gt;def &lt;/span&gt;&lt;span class="method"&gt;test_should_boldly_go&lt;/span&gt;
      &lt;span class="ident"&gt;dilithium&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="constant"&gt;Mock&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;dilithium&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;:nuke&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;:anti_matter&lt;/span&gt;&lt;span class="punct"&gt;).&lt;/span&gt;&lt;span class="ident"&gt;at_least_once&lt;/span&gt;
      &lt;span class="ident"&gt;enterprise&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="constant"&gt;Enterprise&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;new&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;dilithium&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;
      &lt;span class="ident"&gt;enterprise&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;go&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="number"&gt;2&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;
      &lt;span class="ident"&gt;dilithium&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;verify&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;</description>
      <pubDate>Sun, 16 Jul 2006 18:59:00 +0000</pubDate>
      <guid isPermaLink="false">urn:uuid:9562bd96-7724-40dd-8512-99ef84c3715d</guid>
      <author>James Mead</author>
      <link>http://blog.floehopper.org/articles/2006/07/16/mocha-example</link>
      <category>mock</category>
      <category>mocking</category>
      <category>stub</category>
      <category>stubbing</category>
      <category>ruby</category>
      <category>instance</category>
      <category>method</category>
      <category>expectation</category>
      <category>test</category>
      <category>testing</category>
    </item>
    <item>
      <title>Mocking and class interception</title>
      <description>&lt;p&gt;While developing &lt;a href="http://rubyforge.org/projects/mocha"&gt;Mocha&lt;/a&gt;, I have to admit I&amp;#8217;ve been somewhat remiss in keeping up-to-date with the latest developments on projects like &lt;a href="http://rspec.rubyforge.org"&gt;RSpec&lt;/a&gt; and &lt;a href="http://onestepback.org/software/flexmock"&gt;FlexMock&lt;/a&gt;. It looks like both projects have gone further than Mocha with implementing the JMock concepts. FlexMock also now supports simple class interception (see FlexMock::TestCase#intercept), but it admits to being &amp;#8220;very simple-minded&amp;#8221;, has &amp;#8220;a number of restrictions&amp;#8221; and &amp;#8220;a proxy class constant will be left behind&amp;#8221;.&lt;/p&gt;


	&lt;p&gt;I don&amp;#8217;t think Stubba suffers from these limitations, but I&amp;#8217;ll save a more detailed explanation for another post. It doesn&amp;#8217;t look like either project has anything like AutoMocha.&lt;/p&gt;</description>
      <pubDate>Sun, 16 Jul 2006 17:51:00 +0000</pubDate>
      <guid isPermaLink="false">urn:uuid:611d4579-7140-4e72-9708-70e78bbfc0e8</guid>
      <author>James Mead</author>
      <link>http://blog.floehopper.org/articles/2006/07/16/mocking-and-class-interception</link>
      <category>mock</category>
      <category>mocking</category>
      <category>stub</category>
      <category>stubbing</category>
      <category>rspec</category>
      <category>flexmock</category>
      <category>class</category>
      <category>interception</category>
    </item>
  </channel>
</rss>
