Hornsby

Scenarios look like:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
scenario :apple do
  @apple = Fruit.create! :species => 'apple'
end

scenario :orange do
  @orange = Fruit.create! :species => 'orange'
end

scenario :fruitbowl => [:apple,:orange] do
  @fruitbowl = FruitBowl.create! :fruit => [@apple,@orange]
end

scenario :kitchen => :fruitbowl do
  @kitchen = Kitchen.create! :fruitbowl => @fruitbowl
end

By default, these are loaded from RAILS_ROOT/spec/hornsby_scenarios.rb

...and you use them in specs like:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
describe Fruit, "@apple" do
  before do
    hornsby_scenario :apple
  end
  
  it "should be an apple" do
    @apple.species.should == 'apple'
  end
end

describe FruitBowl, "with and apple and an orange" do
  before do
    hornsby_scenario :fruitbowl
  end
  
  it "should have 2 fruits" do
    @fruitbowl.should have(2).fruit
  end
end

Setup

Install the plugin:


./script/plugin install http://rails-oceania.googlecode.com/svn/lachiecox/hornsby

Or piston:


piston import http://rails-oceania.googlecode.com/svn/lachiecox/hornsby vendor/plugins/hornsby

Add the following to spec_helper.rb

1
2
3
4
5
6
7
8
# by default this loads scenarios from RAILS_ROOT/spec/hornsby_scenarios.rb
Hornsby.load

Spec::Runner.configure do |config|
  ...
  
  config.include(HornsbySpecHelper)
end

Advanced Usage

Its just ruby, right? So go nuts:

1
2
3
4
5
6
1.upto(9) do |i|
  scenario("user_#{i}") do
    user = User.create! :name => "user#{i}"
    instance_variable_set("@user_#{i}",user)
  end
end

Rake

If you’d like simply to load your scenarios into a database, use the rake task like so:


$ rake hornsby:scenario RAILS_ENV=test SCENARIO=fruitbowl

TODO

  • Make transactional for speed.
  • Add scenario namespaces for better organisation.
  • Detect scenario cycles.

Credits

Lachie Cox

The code is based on Err’s code found in this post

License

MIT, see LICENCE

Post a comment


( lesstile enabled - surround code blocks with ---)