I was inspired by this post (You’re Cuking It Wrong) to re-look at some feature specs to see if I could improve them.
I went from here:
Feature: Season Management ... Scenario: Create a Season Given an organization like "My YMCA" When I add a season like "Summer Basketball" for "My YMCA" from "1 May" to "31 August" Then I should see the "Summer Basketball" season for "My YMCA" in a list of the organization's seasons Scenario: Add a Registration Setup Given the "Summer Basketball" season for "My YMCA" When I add a setup like "Summer Signup" open from "1 April" to "30 April" Then I should see "Summer Signup" under the "Summer Basketball" season
to here:
Scenario: Create a Season Given an organization like "My YMCA" When I add "My Season" season Then I should see the "My Season" season Scenario: Add a Registration Setup Given the "My Season" season for "My YMCA" When I add a setup like "My Season Signup" Then I should be able to signup under "My Season"
This also led to improvements in the steps. For example, by getting rid of the unnecessary dates, I also removed some unintended “brittleness.” As an example, this:
When /^I add a season like "([^"]*)" for "([^"]*)" from "([^"]*)" to "([^"]*)"$/ do |season, org, from, to| visit organizations_path click_link org click_link "New Season" fill_in "Name" , :with => season fill_in "season_starts_at" , :with => from fill_in "season_ends_at" , :with => to click_button "Create" end
to:
When /^I add "([^"]*)" season$/ do |season| visit organizations_path click_link @org.name # Created in a prior scenario, no need to pass in from = Time.now # Create more appropriate from/to values to = from + 120*24.hours click_link "New Season" fill_in "Name" , :with => season fill_in "season_starts_at" , :with => from fill_in "season_ends_at" , :with => to click_button "Create" end
Subtle, maybe, but certainly more clear and less likely to need attention if/when the solution changes.