2007-08-07 10:44:59 -04:00
= Shoulda - Making tests easy on the fingers and eyes
2007-04-05 14:26:25 -04:00
2010-06-17 10:17:30 -04:00
Shoulda makes it easy to write elegant, understandable, and maintainable tests. Shoulda consists of matchers, test helpers, and assertions. It's fully compatible with your existing tests in Test::Unit or RSpec, and requires no retooling to use.
2007-04-05 14:26:25 -04:00
2010-06-17 10:17:30 -04:00
Matchers:: Test::Unit- and RSpec-compatible one-liners that test common Rails functionality.
These tests would otherwise be much longer, more complex, and error-prone.
Helpers:: #context and #should give you RSpec like test blocks in Test::Unit.
2007-07-24 16:16:01 -04:00
In addition, you get nested contexts and a much more readable syntax.
2010-06-17 10:17:30 -04:00
Assertions:: Many common Rails testing idioms have been distilled into a set of useful assertions.
2007-04-05 14:26:25 -04:00
2007-07-24 16:16:01 -04:00
= Usage
2010-06-17 10:17:30 -04:00
=== ActiveRecord Tests (Shoulda::ActiveRecord::Matchers)
2008-08-31 16:53:06 -04:00
2010-06-17 10:17:30 -04:00
Test your ActiveRecord associations and validations with these powerful matchers:
2007-07-24 16:16:01 -04:00
class PostTest < Test::Unit::TestCase
2010-06-17 09:39:56 -04:00
should belong_to(:user)
should have_many(:tags).through(:taggings)
2007-07-24 16:16:01 -04:00
2010-06-17 09:39:56 -04:00
should validate_uniqueness_of(:title)
should validate_presence_of(:body).with_message(/wtf/)
should validate_presence_of(:title)
should validate_numericality_of(:user_id)
2007-07-24 16:16:01 -04:00
end
class UserTest < Test::Unit::TestCase
2010-06-17 09:39:56 -04:00
should have_many(:posts)
should_not allow_value("blah").for(:email)
should_not allow_value("b lah").for(:email)
should allow_value("a@b.com").for(:email)
should allow_value("asdf@asdf.com").for(:email)
should ensure_inclusion_of(:email).in_range(1..100)
should ensure_inclusion_of(:age).in_range(1..100)
should_not allow_mass_assignment_of(:password)
2007-07-24 16:16:01 -04:00
end
Makes TDD so much easier.
2010-06-17 10:17:30 -04:00
=== Controller Tests (Shoulda::Controller::Matchers)
Matchers to test the most common controller patterns...
2007-07-24 16:16:01 -04:00
2009-05-27 13:58:39 -04:00
class PostsControllerTest < ActionController::TestCase
context "on GET to :show for first record" do
setup do
get :show, :id => 1
end
2007-07-24 16:16:01 -04:00
2010-06-17 09:39:56 -04:00
should assign_to(:user)
should respond_with(:success)
should render_template(:show)
should_not set_the_flash
2007-07-24 16:16:01 -04:00
2009-05-27 13:58:39 -04:00
should "do something else really cool" do
assert_equal 1, assigns(:user).id
end
2007-07-24 16:16:01 -04:00
end
end
2010-06-17 10:17:30 -04:00
=== Context Helpers (Shoulda::Context)
Stop killing your fingers with all of those underscores... Name your tests with plain sentences!
class UserTest < Test::Unit::TestCase
context "A User instance" do
setup do
@user = User.find(:first)
end
should "return its full name" do
assert_equal 'John Doe', @user.full_name
end
context "with a profile" do
setup do
@user.profile = Profile.find(:first)
end
should "return true when sent #has_profile?" do
assert @user.has_profile?
end
end
end
end
Produces the following test methods:
"test: A User instance should return its full name."
"test: A User instance with a profile should return true when sent #has_profile?."
So readable!
2009-01-05 11:50:57 -05:00
=== Helpful Assertions (Shoulda::Assertions)
2007-07-24 16:16:01 -04:00
More to come here, but have fun with what's there.
assert_same_elements([:a, :b, :c], [:c, :a, :b])
assert_contains(['a', '1'], /\d/)
assert_contains(['a', '1'], 'a')
2009-03-03 17:00:44 -05:00
= Rails Installation (Test::Unit)
2009-01-13 15:20:54 -05:00
2010-06-16 11:07:49 -04:00
Specify the gem dependency in your config/environment.rb file:
2009-01-13 15:20:54 -05:00
Rails::Initializer.run do |config|
2010-06-17 09:49:15 -04:00
config.gem "shoulda", :lib => "shoulda"
2009-01-13 15:20:54 -05:00
end
Then:
$ rake gems:install
$ rake gems:unpack
2009-03-03 17:00:44 -05:00
= Rails Installation (RSpec)
2009-03-04 09:57:09 -05:00
If you're using Shoulda with RSpec, we recommend that you add config.gem lines
for RSpec and Shoulda in your config/environment/test.rb file, but do not ask
Rails to load the RSpec and Shoulda libraries:
2009-03-03 17:00:44 -05:00
2010-06-17 09:49:15 -04:00
config.gem 'rspec', :lib => false
2009-03-03 17:00:44 -05:00
config.gem 'rspec-rails', :lib => false
2010-06-17 09:49:15 -04:00
config.gem 'shoulda', :lib => false
2009-03-03 17:00:44 -05:00
Then require shoulda from your spec/spec_helper.rb file, before Spec::Runner is
configured:
# requires for RSpec
require 'shoulda'
Spec::Runner.configure do |config|
# ...
You should not need to require anything besides the top-level shoulda library.
2010-06-22 16:30:54 -04:00
= Rails 3 Installation (RSpec)
With Rails 3 and Bundler, requiring Shoulda is as easy as adding it to your Gemfile:
group :test do
gem "shoulda"
gem "rspec-rails", "2.0.0.beta.12"
end
2010-06-23 14:50:05 -04:00
Shoulda will automatically include matchers into the appropriate example
groups.
2010-06-22 16:30:54 -04:00
2007-07-24 16:16:01 -04:00
= Credits
2010-06-16 11:07:49 -04:00
Shoulda is maintained and funded by {thougthbot}[http://thoughtbot.com/community]
2007-07-24 16:16:01 -04:00
= License
2007-04-05 14:26:25 -04:00
2010-06-17 09:49:15 -04:00
Shoulda is Copyright © 2006-2010 Tammer Saleh, Thoughtbot. It is free software, and may be redistributed under the terms specified in the MIT-LICENSE file.