On 4 Mar 2008, at 13:13, Matthijs Langenberg wrote:

> Taking the outside-in approach in thought:
>
> At first we write a high-level customer-facing story, this story  
> fails.
> Then we start using mocks at object level to use them as a design  
> tool,
> and so we implement the different layers of the system.
> After implementing the inner layer, the story should pass.
> When that happens we could remove the mocks and replace it with  
> calls to the real code, making the suite less brittle (except for  
> calls to external services/databases/file systems).

Don't use mocks at the story level. IMHO stories should always be  
using the full stack. This includes your database, but you might be  
permitted to exclude external services such as credit card billing  
systems. However, if you can set up a sandbox to test against (such as  
the Paypal sandbox), all to the good.

We proceed based on two principles:

A failure in a story means you change specs not code.
A failure in a spec means you change the code.

This is how we do it (assuming a rails application):

1. Write customer story, all steps are pending:

Scenario: Viewing the front page
   When I view the front page
   Then I see the text 'welcome to the app'

2. Write the first step in the story:

  When "I view the front page" do
     get "/"
end

This then fails, as I don't have a front page yet!

3. Pay attention to the error given by the story, and fix that *by  
writing a spec*.

In this case it'll be complaining that the controller doesn't exist.  
At this point I drop down to the specs as a failing story means we  
need a spec:

describe MainController do
end

4. Make your specs pass.

'rake spec' then fails, as MainController doesn't exist. In this case,  
I add a controller and a route (by hand, none of that scaffold  
business):

class MainController < ApplicationController
end

5. Run the story again if you need to, and use that as a guide to  
write more specs. Repeat steps 4 and 5.

To continue the example - in this case it'll probably complain about  
no index action:

describe MainController do
   it "should handle an index action" do
     get :index
   end
end

and then, to fix the spec:

class MainController < ApplicationController
   def index
   end
end

Then it'll most likely complain about not having an index.html.erb.  
Because controller specs don't render the page, you'll need an an  
index.html.erb_spec.rb to test the view properly. And so on.

Sound like a lot of work, but given practice you can zip through these  
steps very quickly. You also get a free 'focusing tool' (lose sight of  
where you are? just run the story test and write more specs).

Hope this is helpful. Maybe I should write up an extended example as a  
blog post, including mocking etc, as it seems to come up a lot.

Thanks
Chris

PS: Excuse the spelling/coding mistakes in the (untested) code :)  
Corrections and comments as to the methodology here most welcome.

--
Chris Parsons
Managing Director
Eden Development (UK) Ltd

[EMAIL PROTECTED]
www.edendevelopment.co.uk

0845 0097 094
po box 425, winchester, so23 0wy, uk
Map: http://pininthemap.com/edendevelopment


Tried Pin in the Map? Mark a map location, add text, send to friends.
http://pininthemap.com

This electronic message and all contents contain information from the  
sender which may be privileged, confidential or otherwise protected  
from disclosure. The information is intended to be for the  
addressee(s) only. If you are not an addressee, any copying,  
disclosure, distribution or use of the contents of this message is  
prohibited. If you have received this electronic message in error,  
please notify the sender by reply e-mail and destroy the original  
message and all copies. The sender does not accept liability for any  
errors or omissions.

_______________________________________________
rspec-users mailing list
rspec-users@rubyforge.org
http://rubyforge.org/mailman/listinfo/rspec-users

Reply via email to