Beauty of RSpec
Posted by Garry Shutler in RSpec, Ruby, Unit testing
I've only been using RSpec in anger for a short period of time but I'm in love with it already. It's support for BDD is fantastic. I'm now looking forward to the proper release of IronRuby even more than I was before.
I've only written a single class so far, but I'm delighted with the way the tests look so I thought I'd share them:
require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
describe "setting a person's password" do
given do
@person = Person.new
end
because do
@person.set_password "testing"
end
it "sets their password salt" do
@person.password_salt.should_not be_nil
end
it "sets their password hash" do
@person.password_hash.should_not be_nil
end
end
context "when someone has been saved" do
given do
@person = Person.new(:name => "tester")
@person.set_password "testing"
@person.save
end
describe "providing their credentials" do
because do
@retrieved = Person.with_credentials(:name => "tester", :password => "testing")
end
it "retrieves the expected person" do
@retrieved.should == @person
end
end
describe "providing the wrong password" do
it_raises "an error informing the password is incorrect", "Incorrect password" do
Person.with_credentials(:name => "tester", :password => "wrong")
end
end
end
describe "providing credentials for someone who does not exist" do
it_raises "an error informing the name is unknown", "Unknown name" do
Person.with_credentials(:name => "tester", :password => "unsaved")
end
end
The output when you run the tests looks like:
~$ rake spec:doc
(in /home/garry/code/rails/tinytweet)
setting a person's password
- sets their password salt
- sets their password hash
when someone has been saved providing their credentials
- retrieves the expected person
when someone has been saved providing the wrong password
- raises an error informing the password is incorrect
providing credentials for someone who does not exist
- raises an error informing the name is unknown
For those of you familiar with RSpec, you may notice that I'm not using the standard syntax. "given" and "because" are just aliases for "before". I've done this because I like the given/when/then style of tests but as "when" is a Ruby keyword and "it" helps you name the assertions properly for the docs it has become given/because/it.
I've also added an extra method "it_raises" as I found the way of testing that an error is raised rather clunky so I hid the nuts and bolts of it within my spec_helper.rb:
def it_raises(description, error_message)
it "raises " + description do
lambda { yield }.should raise_error error_message
end
end
No doubt I'll have more to share as my journey with Rails and RSpec continues.
This entry was posted on at Monday, May 04, 2009 and is filed under RSpec, Ruby, Unit testing. You can follow any responses to this entry through the RSS 2.0. You can leave a response.
