I really do like Rspec and so do Cucumber, but, often, I don’t like switch between them during my develompment.
Today I stumbled upon ‘Gibbon‘ a clever hack by Stephen Caudill, of tomatoi.st fame,
that add support for GIVEN/WHEN/THEN templates.
It simple needs to add this file into your spec/support directory:
module Spec::DSL::Main
alias :Feature :describe
def Story(description)
@description_args.push("\n#{description}\n")
end
end
module Spec::Example::ExampleGroupMethods
def executes(scope=:all, &blk)
before(scope, &blk)
end
def Scenario(description, &blk)
describe("Scenario: #{description}", &blk)
end
def Background(description, &blk)
describe("Background #{description}", &blk)
end
def Given(description, &blk)
describe("Given #{description}", &blk)
end
def When(description, &blk)
describe("When #{description}", &blk)
end
def Then(description, &blk)
example("Then #{description}", &blk)
end
def And(description, &blk)
example("And #{description}", &blk)
end
def But(description, &blk)
example("But #{description}", &blk)
end
end
and it’ll be possible write specs like that:
Feature "A Tomatoist does a pomodoro" do
Story <<-eos
In order to perform a focused unit of work
As a Tomatoist
I want to start a pomodoro
eos
Scenario "Starting a pomodoro" do
When "I go to the home page" do
executes { visit '/' }
Then "I should be sent to a new session" do
current_url.should =~ /\/\w{3,}/
end
And "I should see an unstarted timer" do
response.should have_tag('#timer .countdown_row','00:00')
end
And "I should see a pomdoro button" do
response.should have_tag('input[type=submit][value=?]','Pomdoro')
end
When "I click the pomodoro button" do
executes do
@session_url = current_url
click_button 'Pomodoro'
end
Then "I should be on my session's page" do
current_url.should == @session_url
end
And "my timers should have been initialized" do
response.should have_tag('#timer .countdown_row','25:00')
end
And "my timer history should show the current pomdoro" do
response.should have_tag('#history ul li', /Pomodoro/, 1)
end
And "the pomodoro button should be highlighted" do
response.should have_tag('form.current input[type=submit][value=?]','Pomdoro')
end
end
end
end
end
Neat hack, indeed!
I'll try it as soon as possible.

