Using Coulda
If you don't already, you should create a "test_helper.rb" file, or something similarly named, to DRY up your tests. In that helper file, you'll want to add the following:
require 'rubygems'
require 'coulda'
include Coulda
Features
Coulda's take on BDD, based on Cucumber, groups behavior into "Features". A Feature defines its purpose and Scenarios that explain and exercise that purpose.
A pending Feature is a feature lacking any Scenarios. Below is an example of a pending Feature.
require 'test_helper'
Feature "A pending feature"
Below is an example of a Feature that contains a purpose.
require 'test_helper'
Feature "A pending feature" do
in_order_to "accomplish something else"
as_a "user"
i_want_to "do something"
end
Scenarios
A Scenario demonstrates one aspect of the Feature. Often, it's a happy or one of many sad paths exercising the behavior in our Feature.
You can write a "pending" Scenario using Coulda as follows:
require 'test_helper'
Feature "A pending feature" do
in_order_to "accomplsih something else"
as_a "user"
i_want_to "do something"
Scenario "that is pending"
end
Coulda recommends that you express Scenarios using:
- Preconditions using the Given method
- Events using the When method
- Expectations using the Then method
The most common use of Scenario would specify at least one Given, When, and Then perhaps as below:
require 'test_helper'
Feature "Painfully obvious" do
in_order_to "demonstrate a simple test"
as_a "coulda developer"
i_want_to "provide a straight-forward scenario"
Scenario "Describing something obvious" do
Given "something without a value" do
@no_value = nil
end
When "I give it a value" do
@no_value = true
end
Then "it should have a value" do
assert(@no_value)
end
end
end
Reuse within a Feature
If you wish to reuse code within a Feature, you may want to factor behavior out into methods:
require 'test_helper'
Feature "Painfully obvious" do
in_order_to "demonstrate a simple test"
as_a "coulda developer"
i_want_to "provide a straight-forward scenario"
def something_without_a_value
@no_value = nil
end
Scenario "Describing something obvious" do
Given "something without a value" do
something_without_a_value
end
When "I give it a value" do
@no_value = true
end
Then "it should have a value" do
assert(@no_value)
end
end
end
Reuse between Features
However, if you wish to reuse code between Features, then you should put it in a Module and mix it in. The below example defines the Module within the same source file; however, it should be obvious that you can do so in a separate file and require it as desired.
require 'test_helper'
require 'coulda'
include Coulda
module MyMacros
def given_something_without_a_value
Given "something without a value" do
@no_value = nil
end
end
def assert_variable_has_a_value
assert(@no_value)
end
end
Feature "Painfully obvious" do
extend MyMacros
in_order_to "demonstrate a simple test"
as_a "coulda developer"
i_want_to "provide a straight-forward scenario"
Scenario "Describing something obvious" do
given_something_without_a_value
When "I give it a value" do
@no_value = true
end
Then "it should have a value" do
assert_variable_has_a_value
end
end
end