Thanks Chris. This is a really nice description of how I think of BDD. I call it "we should fix that" after Liz Keogh's blog post: http://sirenian.livejournal.com/42871.html
(Check the comments for the myriad ways you can misinterpret this!) Cheers, Dan On 04/03/2008, Chris Parsons <[EMAIL PROTECTED]> wrote: > > 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 >
_______________________________________________ rspec-users mailing list rspec-users@rubyforge.org http://rubyforge.org/mailman/listinfo/rspec-users