thoughtbot-shoulda 2.10.2 → 2.11.1
Sign up to get free protection for your applications and to get access to all the features.
- data/CONTRIBUTION_GUIDELINES.rdoc +5 -5
- data/README.rdoc +72 -89
- data/Rakefile +31 -33
- data/lib/shoulda.rb +6 -6
- data/lib/shoulda/action_controller.rb +8 -0
- data/lib/shoulda/action_controller/macros.rb +54 -73
- data/lib/shoulda/action_controller/matchers.rb +7 -5
- data/lib/shoulda/action_controller/matchers/assign_to_matcher.rb +10 -7
- data/lib/shoulda/action_controller/matchers/filter_param_matcher.rb +18 -1
- data/lib/shoulda/action_controller/matchers/redirect_to_matcher.rb +62 -0
- data/lib/shoulda/action_controller/matchers/render_template_matcher.rb +54 -0
- data/lib/shoulda/action_controller/matchers/render_with_layout_matcher.rb +33 -15
- data/lib/shoulda/action_controller/matchers/respond_with_content_type_matcher.rb +10 -10
- data/lib/shoulda/action_controller/matchers/respond_with_matcher.rb +17 -13
- data/lib/shoulda/action_controller/matchers/route_matcher.rb +3 -3
- data/lib/shoulda/action_controller/matchers/set_session_matcher.rb +13 -2
- data/lib/shoulda/action_controller/matchers/set_the_flash_matcher.rb +1 -1
- data/lib/shoulda/action_mailer.rb +3 -0
- data/lib/shoulda/action_mailer/assertions.rb +4 -0
- data/lib/shoulda/action_mailer/matchers.rb +22 -0
- data/lib/shoulda/action_mailer/matchers/have_sent_email.rb +110 -0
- data/lib/shoulda/active_record/helpers.rb +8 -3
- data/lib/shoulda/active_record/macros.rb +88 -143
- data/lib/shoulda/active_record/matchers.rb +0 -1
- data/lib/shoulda/active_record/matchers/allow_mass_assignment_of_matcher.rb +1 -1
- data/lib/shoulda/active_record/matchers/allow_value_matcher.rb +10 -2
- data/lib/shoulda/active_record/matchers/association_matcher.rb +8 -8
- data/lib/shoulda/active_record/matchers/ensure_inclusion_of_matcher.rb +1 -1
- data/lib/shoulda/active_record/matchers/ensure_length_of_matcher.rb +2 -2
- data/lib/shoulda/active_record/matchers/have_db_column_matcher.rb +11 -11
- data/lib/shoulda/active_record/matchers/have_db_index_matcher.rb +8 -8
- data/lib/shoulda/active_record/matchers/validate_format_of_matcher.rb +2 -4
- data/lib/shoulda/active_record/matchers/validate_uniqueness_of_matcher.rb +3 -3
- data/lib/shoulda/active_record/matchers/validation_matcher.rb +0 -1
- data/lib/shoulda/assertions.rb +10 -2
- data/lib/shoulda/autoload_macros.rb +20 -20
- data/lib/shoulda/context.rb +70 -39
- data/lib/shoulda/{rspec.rb → integrations/rspec.rb} +2 -0
- data/lib/shoulda/integrations/rspec2.rb +22 -0
- data/lib/shoulda/{test_unit.rb → integrations/test_unit.rb} +0 -0
- data/lib/shoulda/macros.rb +46 -18
- data/lib/shoulda/rails.rb +0 -5
- data/lib/shoulda/tasks/yaml_to_shoulda.rake +11 -11
- data/lib/shoulda/version.rb +4 -0
- data/rails/init.rb +3 -2
- data/test/fail_macros.rb +20 -4
- data/test/functional/posts_controller_test.rb +7 -7
- data/test/functional/users_controller_test.rb +1 -1
- data/test/matchers/action_mailer/have_sent_email_test.rb +70 -0
- data/test/matchers/active_record/allow_mass_assignment_of_matcher_test.rb +7 -1
- data/test/matchers/active_record/allow_value_matcher_test.rb +1 -1
- data/test/matchers/active_record/association_matcher_test.rb +16 -16
- data/test/matchers/active_record/ensure_inclusion_of_matcher_test.rb +3 -2
- data/test/matchers/active_record/ensure_length_of_matcher_test.rb +1 -1
- data/test/matchers/active_record/have_db_column_matcher_test.rb +1 -1
- data/test/matchers/active_record/have_db_index_matcher_test.rb +1 -1
- data/test/matchers/active_record/have_readonly_attributes_matcher_test.rb +1 -1
- data/test/matchers/active_record/validate_acceptance_of_matcher_test.rb +1 -1
- data/test/matchers/active_record/validate_format_of_matcher_test.rb +1 -1
- data/test/matchers/active_record/validate_numericality_of_matcher_test.rb +1 -1
- data/test/matchers/active_record/validate_presence_of_matcher_test.rb +1 -1
- data/test/matchers/active_record/validate_uniqueness_of_matcher_test.rb +1 -1
- data/test/matchers/controller/assign_to_matcher_test.rb +11 -1
- data/test/matchers/controller/filter_param_matcher_test.rb +10 -2
- data/test/matchers/controller/redirect_to_matcher_test.rb +37 -0
- data/test/matchers/controller/render_template_matcher_test.rb +37 -0
- data/test/matchers/controller/render_with_layout_matcher_test.rb +15 -1
- data/test/matchers/controller/respond_with_content_type_matcher_test.rb +1 -1
- data/test/matchers/controller/respond_with_matcher_test.rb +1 -11
- data/test/matchers/controller/route_matcher_test.rb +18 -1
- data/test/matchers/controller/set_session_matcher_test.rb +11 -1
- data/test/matchers/controller/set_the_flash_matcher.rb +1 -1
- data/test/other/autoload_macro_test.rb +1 -1
- data/test/other/context_test.rb +210 -27
- data/test/other/convert_to_should_syntax_test.rb +1 -1
- data/test/other/helpers_test.rb +13 -36
- data/test/other/private_helpers_test.rb +2 -2
- data/test/other/should_test.rb +13 -13
- data/test/{model_builder.rb → rails2_model_builder.rb} +32 -8
- data/test/{rails_root → rails2_root}/app/controllers/application_controller.rb +0 -3
- data/test/{rails_root → rails2_root}/app/controllers/posts_controller.rb +0 -0
- data/test/{rails_root → rails2_root}/app/controllers/users_controller.rb +0 -0
- data/test/{rails_root → rails2_root}/app/helpers/application_helper.rb +0 -0
- data/test/{rails_root → rails2_root}/app/helpers/posts_helper.rb +0 -0
- data/test/{rails_root → rails2_root}/app/helpers/users_helper.rb +0 -0
- data/test/{rails_root → rails2_root}/app/models/address.rb +0 -0
- data/test/rails2_root/app/models/flea.rb +11 -0
- data/test/{rails_root → rails2_root}/app/models/friendship.rb +0 -0
- data/test/rails2_root/app/models/notifier.rb +8 -0
- data/test/{rails_root → rails2_root}/app/models/pets/cat.rb +0 -0
- data/test/{rails_root → rails2_root}/app/models/pets/dog.rb +0 -0
- data/test/{rails_root → rails2_root}/app/models/post.rb +1 -1
- data/test/{rails_root → rails2_root}/app/models/product.rb +0 -0
- data/test/{rails_root → rails2_root}/app/models/profile.rb +0 -0
- data/test/{rails_root → rails2_root}/app/models/registration.rb +0 -0
- data/test/{rails_root → rails2_root}/app/models/tag.rb +0 -0
- data/test/{rails_root → rails2_root}/app/models/tagging.rb +0 -0
- data/test/{rails_root → rails2_root}/app/models/treat.rb +0 -0
- data/test/{rails_root → rails2_root}/app/models/user.rb +0 -0
- data/test/{rails_root → rails2_root}/app/views/layouts/posts.rhtml +0 -0
- data/test/{rails_root → rails2_root}/app/views/layouts/users.rhtml +0 -0
- data/test/{rails_root → rails2_root}/app/views/layouts/wide.html.erb +0 -0
- data/test/rails2_root/app/views/notifier/the_email.html.erb +1 -0
- data/test/{rails_root → rails2_root}/app/views/posts/edit.rhtml +0 -0
- data/test/{rails_root → rails2_root}/app/views/posts/index.rhtml +0 -0
- data/test/{rails_root → rails2_root}/app/views/posts/new.rhtml +0 -0
- data/test/{rails_root → rails2_root}/app/views/posts/show.rhtml +0 -0
- data/test/{rails_root → rails2_root}/app/views/users/edit.rhtml +0 -0
- data/test/{rails_root → rails2_root}/app/views/users/index.rhtml +0 -0
- data/test/{rails_root → rails2_root}/app/views/users/new.rhtml +0 -0
- data/test/{rails_root → rails2_root}/app/views/users/show.rhtml +0 -0
- data/test/{rails_root → rails2_root}/config/boot.rb +0 -0
- data/test/{rails_root → rails2_root}/config/database.yml +1 -1
- data/test/{rails_root → rails2_root}/config/environment.rb +0 -1
- data/test/rails2_root/config/environments/test.rb +23 -0
- data/test/{rails_root → rails2_root}/config/initializers/new_rails_defaults.rb +0 -0
- data/test/{rails_root → rails2_root}/config/initializers/shoulda.rb +0 -0
- data/test/{rails_root → rails2_root}/config/routes.rb +0 -0
- data/test/{rails_root → rails2_root}/db/migrate/001_create_users.rb +0 -0
- data/test/{rails_root → rails2_root}/db/migrate/002_create_posts.rb +0 -0
- data/test/{rails_root → rails2_root}/db/migrate/003_create_taggings.rb +0 -0
- data/test/{rails_root → rails2_root}/db/migrate/004_create_tags.rb +0 -0
- data/test/{rails_root → rails2_root}/db/migrate/005_create_dogs.rb +0 -0
- data/test/{rails_root → rails2_root}/db/migrate/006_create_addresses.rb +0 -0
- data/test/{rails_root → rails2_root}/db/migrate/007_create_fleas.rb +0 -0
- data/test/{rails_root → rails2_root}/db/migrate/008_create_dogs_fleas.rb +0 -0
- data/test/{rails_root → rails2_root}/db/migrate/009_create_products.rb +0 -0
- data/test/{rails_root → rails2_root}/db/migrate/010_create_friendships.rb +0 -0
- data/test/{rails_root → rails2_root}/db/migrate/011_create_treats.rb +0 -0
- data/test/{rails_root → rails2_root}/db/migrate/20090506203502_create_profiles.rb +0 -0
- data/test/{rails_root → rails2_root}/db/migrate/20090506203536_create_registrations.rb +0 -0
- data/test/{rails_root → rails2_root}/db/migrate/20090513104502_create_cats.rb +0 -0
- data/test/{rails_root → rails2_root}/db/schema.rb +0 -0
- data/test/{rails_root → rails2_root}/public/404.html +0 -0
- data/test/{rails_root → rails2_root}/public/422.html +0 -0
- data/test/{rails_root → rails2_root}/public/500.html +0 -0
- data/test/{rails_root → rails2_root}/script/console +0 -0
- data/test/{rails_root → rails2_root}/script/generate +0 -0
- data/test/{rails_root → rails2_root}/test/shoulda_macros/custom_macro.rb +0 -0
- data/test/{rails_root → rails2_root}/vendor/gems/gem_with_macro-0.0.1/shoulda_macros/gem_macro.rb +0 -0
- data/test/{rails_root → rails2_root}/vendor/plugins/plugin_with_macro/shoulda_macros/plugin_macro.rb +0 -0
- data/test/rails2_test_helper.rb +6 -0
- data/test/rails3_model_builder.rb +118 -0
- data/test/rails3_root/Gemfile +28 -0
- data/test/rails3_root/README +244 -0
- data/test/rails3_root/Rakefile +10 -0
- data/test/rails3_root/app/controllers/application_controller.rb +22 -0
- data/test/rails3_root/app/controllers/posts_controller.rb +87 -0
- data/test/rails3_root/app/controllers/users_controller.rb +82 -0
- data/test/rails3_root/app/helpers/application_helper.rb +2 -0
- data/test/rails3_root/app/models/address.rb +7 -0
- data/test/rails3_root/app/models/flea.rb +11 -0
- data/test/rails3_root/app/models/friendship.rb +4 -0
- data/test/rails3_root/app/models/notifier.rb +8 -0
- data/test/rails3_root/app/models/pets/cat.rb +7 -0
- data/test/rails3_root/app/models/pets/dog.rb +10 -0
- data/test/rails3_root/app/models/post.rb +12 -0
- data/test/rails3_root/app/models/product.rb +12 -0
- data/test/rails3_root/app/models/profile.rb +2 -0
- data/test/rails3_root/app/models/registration.rb +2 -0
- data/test/rails3_root/app/models/tag.rb +8 -0
- data/test/rails3_root/app/models/tagging.rb +4 -0
- data/test/rails3_root/app/models/treat.rb +3 -0
- data/test/rails3_root/app/models/user.rb +32 -0
- data/test/rails3_root/app/views/layouts/application.html.erb +14 -0
- data/test/rails3_root/app/views/layouts/posts.rhtml +19 -0
- data/test/rails3_root/app/views/layouts/users.rhtml +17 -0
- data/test/rails3_root/app/views/layouts/wide.html.erb +1 -0
- data/test/rails3_root/app/views/notifier/the_email.html.erb +1 -0
- data/test/rails3_root/app/views/posts/edit.rhtml +27 -0
- data/test/rails3_root/app/views/posts/index.rhtml +25 -0
- data/test/rails3_root/app/views/posts/new.rhtml +24 -0
- data/test/rails3_root/app/views/posts/show.rhtml +18 -0
- data/test/rails3_root/app/views/users/edit.rhtml +22 -0
- data/test/rails3_root/app/views/users/index.rhtml +22 -0
- data/test/rails3_root/app/views/users/new.rhtml +21 -0
- data/test/rails3_root/app/views/users/show.rhtml +13 -0
- data/test/rails3_root/config.ru +4 -0
- data/test/rails3_root/config/application.rb +46 -0
- data/test/rails3_root/config/boot.rb +6 -0
- data/test/rails3_root/config/database.yml +22 -0
- data/test/rails3_root/config/environment.rb +5 -0
- data/test/rails3_root/config/environments/development.rb +19 -0
- data/test/rails3_root/config/environments/production.rb +42 -0
- data/test/rails3_root/config/environments/test.rb +32 -0
- data/test/rails3_root/config/initializers/backtrace_silencers.rb +7 -0
- data/test/rails3_root/config/initializers/inflections.rb +10 -0
- data/test/rails3_root/config/initializers/mime_types.rb +5 -0
- data/test/rails3_root/config/initializers/secret_token.rb +7 -0
- data/test/rails3_root/config/initializers/session_store.rb +8 -0
- data/test/rails3_root/config/locales/en.yml +5 -0
- data/test/rails3_root/config/routes.rb +4 -0
- data/test/rails3_root/db/migrate/001_create_users.rb +19 -0
- data/test/rails3_root/db/migrate/002_create_posts.rb +13 -0
- data/test/rails3_root/db/migrate/003_create_taggings.rb +12 -0
- data/test/rails3_root/db/migrate/004_create_tags.rb +11 -0
- data/test/rails3_root/db/migrate/005_create_dogs.rb +12 -0
- data/test/rails3_root/db/migrate/006_create_addresses.rb +14 -0
- data/test/rails3_root/db/migrate/007_create_fleas.rb +11 -0
- data/test/rails3_root/db/migrate/008_create_dogs_fleas.rb +12 -0
- data/test/rails3_root/db/migrate/009_create_products.rb +17 -0
- data/test/rails3_root/db/migrate/010_create_friendships.rb +14 -0
- data/test/rails3_root/db/migrate/011_create_treats.rb +12 -0
- data/test/rails3_root/db/migrate/20090506203502_create_profiles.rb +12 -0
- data/test/rails3_root/db/migrate/20090506203536_create_registrations.rb +14 -0
- data/test/rails3_root/db/migrate/20090513104502_create_cats.rb +12 -0
- data/test/rails3_root/db/seeds.rb +7 -0
- data/test/rails3_root/public/404.html +26 -0
- data/test/rails3_root/public/422.html +26 -0
- data/test/rails3_root/public/500.html +26 -0
- data/test/{rails_root/config/environments/test.rb → rails3_root/public/favicon.ico} +0 -0
- data/test/rails3_root/public/images/rails.png +0 -0
- data/test/rails3_root/public/index.html +279 -0
- data/test/rails3_root/public/javascripts/application.js +2 -0
- data/test/rails3_root/public/javascripts/controls.js +965 -0
- data/test/rails3_root/public/javascripts/dragdrop.js +974 -0
- data/test/rails3_root/public/javascripts/effects.js +1123 -0
- data/test/rails3_root/public/javascripts/prototype.js +4874 -0
- data/test/rails3_root/public/javascripts/rails.js +118 -0
- data/test/rails3_root/public/robots.txt +5 -0
- data/test/rails3_root/script/rails +9 -0
- data/test/rails3_root/test/performance/browsing_test.rb +9 -0
- data/test/rails3_root/test/test_helper.rb +13 -0
- data/test/rails3_test_helper.rb +6 -0
- data/test/test_helper.rb +16 -8
- data/test/unit/address_test.rb +1 -1
- data/test/unit/cat_test.rb +1 -1
- data/test/unit/dog_test.rb +1 -1
- data/test/unit/flea_test.rb +9 -1
- data/test/unit/friendship_test.rb +1 -1
- data/test/unit/post_test.rb +1 -5
- data/test/unit/product_test.rb +1 -1
- data/test/unit/tag_test.rb +1 -5
- data/test/unit/tagging_test.rb +1 -1
- data/test/unit/user_test.rb +3 -37
- metadata +184 -118
- data/lib/shoulda/action_view.rb +0 -10
- data/lib/shoulda/action_view/macros.rb +0 -61
- data/lib/shoulda/active_record/matchers/have_named_scope_matcher.rb +0 -128
- data/test/matchers/active_record/have_named_scope_matcher_test.rb +0 -65
- data/test/rails_root/app/models/flea.rb +0 -3
@@ -1,10 +1,10 @@
|
|
1
|
-
We're using GitHub[http://github.com/thoughtbot/shoulda/tree/master], and we've been getting any combination of github pull requests, tickets, patches, emails, etc. We need to normalize this workflow to make sure we don't miss any fixes.
|
1
|
+
We're using GitHub[http://github.com/thoughtbot/shoulda/tree/master], and we've been getting any combination of github pull requests, tickets, patches, emails, etc. We need to normalize this workflow to make sure we don't miss any fixes.
|
2
2
|
|
3
3
|
* Make sure you're accessing the source from the {official repository}[http://github.com/thoughtbot/shoulda/tree/master].
|
4
4
|
* We prefer git branches over patches, but we can take either.
|
5
|
-
* If you're using git, please make a branch for each separate contribution. We can cherry pick your commits, but pulling from a branch is easier.
|
5
|
+
* If you're using git, please make a branch for each separate contribution. We can cherry pick your commits, but pulling from a branch is easier.
|
6
6
|
* If you're submitting patches, please cut each fix or feature into a separate patch.
|
7
|
-
* There should be an issue[http://github.com/thoughtbot/shoulda/issues] for any submission. If you've found a bug and want to fix it, open a new ticket at the same time.
|
8
|
-
* Please <b>don't send pull requests</b> Just update the issue with the url for your fix (or attach the patch) when it's ready. The github pull requests pretty much get dropped on the floor until someone with commit rights notices them in the mailbox.
|
9
|
-
* Contributions without tests won't be accepted. The file <tt>/test/README</tt> explains the testing system pretty thoroughly.
|
7
|
+
* There should be an issue[http://github.com/thoughtbot/shoulda/issues] for any submission. If you've found a bug and want to fix it, open a new ticket at the same time.
|
8
|
+
* Please <b>don't send pull requests</b> Just update the issue with the url for your fix (or attach the patch) when it's ready. The github pull requests pretty much get dropped on the floor until someone with commit rights notices them in the mailbox.
|
9
|
+
* Contributions without tests won't be accepted. The file <tt>/test/README</tt> explains the testing system pretty thoroughly.
|
10
10
|
|
data/README.rdoc
CHANGED
@@ -1,16 +1,64 @@
|
|
1
1
|
= Shoulda - Making tests easy on the fingers and eyes
|
2
2
|
|
3
|
-
Shoulda makes it easy to write elegant, understandable, and maintainable tests.
|
3
|
+
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.
|
4
4
|
|
5
|
-
|
5
|
+
Matchers:: Test::Unit- and RSpec-compatible one-liners that test common Rails functionality.
|
6
|
+
These tests would otherwise be much longer, more complex, and error-prone.
|
7
|
+
Helpers:: #context and #should give you RSpec like test blocks in Test::Unit.
|
6
8
|
In addition, you get nested contexts and a much more readable syntax.
|
7
|
-
|
8
|
-
They get you started quickly, and can help you ensure that your application is conforming to best practices.
|
9
|
-
Assertions:: Many common rails testing idioms have been distilled into a set of useful assertions.
|
10
|
-
Matchers:: Rspec-compatible matchers providing the same tests as Shoulda macros.
|
9
|
+
Assertions:: Many common Rails testing idioms have been distilled into a set of useful assertions.
|
11
10
|
|
12
11
|
= Usage
|
13
12
|
|
13
|
+
=== ActiveRecord Tests (Shoulda::ActiveRecord::Matchers)
|
14
|
+
|
15
|
+
Test your ActiveRecord associations and validations with these powerful matchers:
|
16
|
+
|
17
|
+
class PostTest < Test::Unit::TestCase
|
18
|
+
should belong_to(:user)
|
19
|
+
should have_many(:tags).through(:taggings)
|
20
|
+
|
21
|
+
should validate_uniqueness_of(:title)
|
22
|
+
should validate_presence_of(:body).with_message(/wtf/)
|
23
|
+
should validate_presence_of(:title)
|
24
|
+
should validate_numericality_of(:user_id)
|
25
|
+
end
|
26
|
+
|
27
|
+
class UserTest < Test::Unit::TestCase
|
28
|
+
should have_many(:posts)
|
29
|
+
|
30
|
+
should_not allow_value("blah").for(:email)
|
31
|
+
should_not allow_value("b lah").for(:email)
|
32
|
+
should allow_value("a@b.com").for(:email)
|
33
|
+
should allow_value("asdf@asdf.com").for(:email)
|
34
|
+
should ensure_inclusion_of(:email).in_range(1..100)
|
35
|
+
should ensure_inclusion_of(:age).in_range(1..100)
|
36
|
+
should_not allow_mass_assignment_of(:password)
|
37
|
+
end
|
38
|
+
|
39
|
+
Makes TDD so much easier.
|
40
|
+
|
41
|
+
=== Controller Tests (Shoulda::Controller::Matchers)
|
42
|
+
|
43
|
+
Matchers to test the most common controller patterns...
|
44
|
+
|
45
|
+
class PostsControllerTest < ActionController::TestCase
|
46
|
+
context "on GET to :show for first record" do
|
47
|
+
setup do
|
48
|
+
get :show, :id => 1
|
49
|
+
end
|
50
|
+
|
51
|
+
should assign_to(:user)
|
52
|
+
should respond_with(:success)
|
53
|
+
should render_template(:show)
|
54
|
+
should_not set_the_flash
|
55
|
+
|
56
|
+
should "do something else really cool" do
|
57
|
+
assert_equal 1, assigns(:user).id
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
14
62
|
=== Context Helpers (Shoulda::Context)
|
15
63
|
|
16
64
|
Stop killing your fingers with all of those underscores... Name your tests with plain sentences!
|
@@ -44,55 +92,6 @@ Produces the following test methods:
|
|
44
92
|
|
45
93
|
So readable!
|
46
94
|
|
47
|
-
=== ActiveRecord Tests (Shoulda::ActiveRecord::Macros)
|
48
|
-
|
49
|
-
Quick macro tests for your ActiveRecord associations and validations:
|
50
|
-
|
51
|
-
class PostTest < Test::Unit::TestCase
|
52
|
-
fixtures :all
|
53
|
-
|
54
|
-
should_belong_to :user
|
55
|
-
should_have_many :tags, :through => :taggings
|
56
|
-
|
57
|
-
should_validate_uniqueness_of :title
|
58
|
-
should_validate_presence_of :body, :message => /wtf/
|
59
|
-
should_validate_presence_of :title
|
60
|
-
should_validate_numericality_of :user_id
|
61
|
-
end
|
62
|
-
|
63
|
-
class UserTest < Test::Unit::TestCase
|
64
|
-
should_have_many :posts
|
65
|
-
|
66
|
-
should_not_allow_values_for :email, "blah", "b lah"
|
67
|
-
should_allow_values_for :email, "a@b.com", "asdf@asdf.com"
|
68
|
-
should_ensure_length_in_range :email, 1..100
|
69
|
-
should_ensure_value_in_range :age, 1..100
|
70
|
-
should_not_allow_mass_assignment_of :password
|
71
|
-
end
|
72
|
-
|
73
|
-
Makes TDD so much easier.
|
74
|
-
|
75
|
-
=== Controller Tests (Shoulda::Controller::Macros)
|
76
|
-
|
77
|
-
Macros to test the most common controller patterns...
|
78
|
-
|
79
|
-
class PostsControllerTest < ActionController::TestCase
|
80
|
-
context "on GET to :show for first record" do
|
81
|
-
setup do
|
82
|
-
get :show, :id => 1
|
83
|
-
end
|
84
|
-
|
85
|
-
should_assign_to :user
|
86
|
-
should_respond_with :success
|
87
|
-
should_render_template :show
|
88
|
-
should_not_set_the_flash
|
89
|
-
|
90
|
-
should "do something else really cool" do
|
91
|
-
assert_equal 1, assigns(:user).id
|
92
|
-
end
|
93
|
-
end
|
94
|
-
end
|
95
|
-
|
96
95
|
=== Helpful Assertions (Shoulda::Assertions)
|
97
96
|
|
98
97
|
More to come here, but have fun with what's there.
|
@@ -101,26 +100,12 @@ More to come here, but have fun with what's there.
|
|
101
100
|
assert_contains(['a', '1'], /\d/)
|
102
101
|
assert_contains(['a', '1'], 'a')
|
103
102
|
|
104
|
-
=== 3rd Party and Application Specific Macros
|
105
|
-
|
106
|
-
Any *.rb file under RAILS_ROOT/test/shoulda_macros/ or vendor/(plugins|gems)/gem_name/shoulda_macros/ will be automatically required when you run your tests. This allows you to distribute macros with your plugins, or to organize the macros inside your application. Remember to add your macro to Test::Unit::TestCase in the macro file:
|
107
|
-
|
108
|
-
# test/shoulda_macros/security.rb
|
109
|
-
class Test::Unit::TestCase
|
110
|
-
def self.should_be_denied(opts = {})
|
111
|
-
should_set_the_flash_to(opts[:flash] || /Please log in/i)
|
112
|
-
should_redirect_to(opts[:redirect] || 'login_url')
|
113
|
-
end
|
114
|
-
end
|
115
|
-
|
116
103
|
= Rails Installation (Test::Unit)
|
117
104
|
|
118
|
-
|
119
|
-
|
120
|
-
Use this if you prefer to use versioned releases of shoulda. Specify the gem dependency in your config/environment.rb file:
|
105
|
+
Specify the gem dependency in your config/environment.rb file:
|
121
106
|
|
122
107
|
Rails::Initializer.run do |config|
|
123
|
-
config.gem "
|
108
|
+
config.gem "shoulda", :lib => "shoulda"
|
124
109
|
end
|
125
110
|
|
126
111
|
Then:
|
@@ -128,29 +113,15 @@ Then:
|
|
128
113
|
$ rake gems:install
|
129
114
|
$ rake gems:unpack
|
130
115
|
|
131
|
-
=== As a Plugin
|
132
|
-
|
133
|
-
Use this if you prefer to use the edge version of shoulda:
|
134
|
-
|
135
|
-
$ script/plugin install git://github.com/thoughtbot/shoulda.git
|
136
|
-
|
137
|
-
=== As a Plugin (using git submodules)
|
138
|
-
|
139
|
-
Use this if you prefer the idea of being able to easily switch between using edge or a tagged version of shoulda:
|
140
|
-
|
141
|
-
$ git submodule add git://github.com/thoughtbot/shoulda.git vendor/plugins/shoulda
|
142
|
-
|
143
116
|
= Rails Installation (RSpec)
|
144
117
|
|
145
118
|
If you're using Shoulda with RSpec, we recommend that you add config.gem lines
|
146
119
|
for RSpec and Shoulda in your config/environment/test.rb file, but do not ask
|
147
120
|
Rails to load the RSpec and Shoulda libraries:
|
148
121
|
|
149
|
-
config.gem 'rspec',
|
122
|
+
config.gem 'rspec', :lib => false
|
150
123
|
config.gem 'rspec-rails', :lib => false
|
151
|
-
config.gem '
|
152
|
-
:lib => false,
|
153
|
-
:source => 'http://gems.github.com'
|
124
|
+
config.gem 'shoulda', :lib => false
|
154
125
|
|
155
126
|
Then require shoulda from your spec/spec_helper.rb file, before Spec::Runner is
|
156
127
|
configured:
|
@@ -162,10 +133,22 @@ configured:
|
|
162
133
|
|
163
134
|
You should not need to require anything besides the top-level shoulda library.
|
164
135
|
|
136
|
+
= Rails 3 Installation (RSpec)
|
137
|
+
|
138
|
+
With Rails 3 and Bundler, requiring Shoulda is as easy as adding it to your Gemfile:
|
139
|
+
|
140
|
+
group :test do
|
141
|
+
gem "shoulda"
|
142
|
+
gem "rspec-rails", "2.0.0.beta.12"
|
143
|
+
end
|
144
|
+
|
145
|
+
Shoulda will automatically include matchers into the appropriate example
|
146
|
+
groups.
|
147
|
+
|
165
148
|
= Credits
|
166
149
|
|
167
|
-
Shoulda is maintained
|
150
|
+
Shoulda is maintained and funded by {thougthbot}[http://thoughtbot.com/community]
|
168
151
|
|
169
152
|
= License
|
170
153
|
|
171
|
-
Shoulda is Copyright © 2006-
|
154
|
+
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.
|
data/Rakefile
CHANGED
@@ -1,16 +1,18 @@
|
|
1
|
+
require 'rubygems'
|
1
2
|
require 'rake'
|
2
3
|
require 'rake/testtask'
|
3
4
|
require 'rake/rdoctask'
|
4
5
|
require 'rake/gempackagetask'
|
6
|
+
require 'cucumber/rake/task'
|
5
7
|
|
6
8
|
$LOAD_PATH.unshift("lib")
|
7
|
-
require 'shoulda'
|
9
|
+
require 'shoulda/version'
|
8
10
|
load 'tasks/shoulda.rake'
|
9
11
|
|
10
12
|
# Test::Unit::UI::VERBOSE
|
11
13
|
test_files_pattern = 'test/{unit,functional,other,matchers}/**/*_test.rb'
|
12
14
|
Rake::TestTask.new do |t|
|
13
|
-
t.libs << 'lib'
|
15
|
+
t.libs << 'lib' << 'test'
|
14
16
|
t.pattern = test_files_pattern
|
15
17
|
t.verbose = false
|
16
18
|
end
|
@@ -30,33 +32,8 @@ task :coverage do
|
|
30
32
|
system "rcov --rails --sort coverage -Ilib #{files.join(' ')}"
|
31
33
|
end
|
32
34
|
|
33
|
-
|
34
|
-
|
35
|
-
`rsync -ave ssh doc/ dev@dev.thoughtbot.com:/home/dev/www/dev.thoughtbot.com/shoulda`
|
36
|
-
end
|
37
|
-
|
38
|
-
desc 'Default: run tests.'
|
39
|
-
task :default => ['test']
|
40
|
-
|
41
|
-
spec = Gem::Specification.new do |s|
|
42
|
-
s.name = "shoulda"
|
43
|
-
s.version = Shoulda::VERSION
|
44
|
-
s.summary = "Making tests easy on the fingers and eyes"
|
45
|
-
s.homepage = "http://thoughtbot.com/projects/shoulda"
|
46
|
-
s.rubyforge_project = "shoulda"
|
47
|
-
|
48
|
-
s.files = FileList["[A-Z]*", "{bin,lib,rails,test}/**/*"]
|
49
|
-
s.executables = s.files.grep(/^bin/) { |f| File.basename(f) }
|
50
|
-
|
51
|
-
s.has_rdoc = true
|
52
|
-
s.extra_rdoc_files = ["README.rdoc", "CONTRIBUTION_GUIDELINES.rdoc"]
|
53
|
-
s.rdoc_options = ["--line-numbers", "--main", "README.rdoc"]
|
54
|
-
|
55
|
-
s.authors = ["Tammer Saleh"]
|
56
|
-
s.email = "tsaleh@thoughtbot.com"
|
57
|
-
end
|
58
|
-
|
59
|
-
Rake::GemPackageTask.new spec do |pkg|
|
35
|
+
eval("$specification = begin; #{IO.read('shoulda.gemspec')}; end")
|
36
|
+
Rake::GemPackageTask.new $specification do |pkg|
|
60
37
|
pkg.need_tar = true
|
61
38
|
pkg.need_zip = true
|
62
39
|
end
|
@@ -64,9 +41,30 @@ end
|
|
64
41
|
desc "Clean files generated by rake tasks"
|
65
42
|
task :clobber => [:clobber_rdoc, :clobber_package]
|
66
43
|
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
44
|
+
namespace :cucumber do
|
45
|
+
Cucumber::Rake::Task.new(:rails2, "Run the cucumber features in Rails 2") do |t|
|
46
|
+
t.fork = true
|
47
|
+
t.cucumber_opts = ['--format', (ENV['CUCUMBER_FORMAT'] || 'progress')]
|
48
|
+
t.profile = 'rails2'
|
49
|
+
end
|
50
|
+
|
51
|
+
Cucumber::Rake::Task.new(:rails3, "Run the cucumber features in Rails 3") do |t|
|
52
|
+
t.fork = true
|
53
|
+
t.cucumber_opts = ['--format', (ENV['CUCUMBER_FORMAT'] || 'progress')]
|
54
|
+
t.profile = 'rails3'
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
desc "Run the cucumber features in both Rails 2 and 3"
|
59
|
+
task :cucumber => ["cucumber:rails2", "cucumber:rails3"]
|
60
|
+
|
61
|
+
desc 'run tests for all supported versions of Rails'
|
62
|
+
task :test_all do
|
63
|
+
%w(2.3.8 3.0.0.beta4).each do |version|
|
64
|
+
system("RAILS_VERSION=#{version} rake -s test;")
|
71
65
|
end
|
72
66
|
end
|
67
|
+
|
68
|
+
desc 'Default: run test and cucumber features for support versions'
|
69
|
+
task :default => [:test_all, :cucumber]
|
70
|
+
|
data/lib/shoulda.rb
CHANGED
@@ -1,9 +1,9 @@
|
|
1
|
-
|
2
|
-
VERSION = "2.10.2"
|
3
|
-
end
|
1
|
+
require 'shoulda/version'
|
4
2
|
|
5
|
-
if defined?
|
6
|
-
require 'shoulda/
|
3
|
+
if defined?(RSpec)
|
4
|
+
require 'shoulda/integrations/rspec2'
|
5
|
+
elsif defined?(Spec)
|
6
|
+
require 'shoulda/integrations/rspec'
|
7
7
|
else
|
8
|
-
require 'shoulda/test_unit'
|
8
|
+
require 'shoulda/integrations/test_unit'
|
9
9
|
end
|
@@ -24,37 +24,30 @@ module Shoulda # :nodoc:
|
|
24
24
|
module Macros
|
25
25
|
include Matchers
|
26
26
|
|
27
|
+
# Deprecated: use ActionController::Matchers#set_the_flash instead.
|
28
|
+
#
|
27
29
|
# Macro that creates a test asserting that the flash contains the given
|
28
30
|
# value. Expects a +String+ or +Regexp+.
|
29
31
|
#
|
30
|
-
# If the argument is +nil+, it will assert that the flash is not set.
|
31
|
-
# This behavior is deprecated.
|
32
|
-
#
|
33
32
|
# Example:
|
34
33
|
#
|
35
34
|
# should_set_the_flash_to "Thank you for placing this order."
|
36
35
|
# should_set_the_flash_to /created/i
|
37
36
|
def should_set_the_flash_to(val)
|
38
|
-
|
39
|
-
|
40
|
-
should matcher.description do
|
41
|
-
assert_accepts matcher, @controller
|
42
|
-
end
|
43
|
-
else
|
44
|
-
warn "[DEPRECATION] should_set_the_flash_to nil is deprecated. " <<
|
45
|
-
"Use should_not_set_the_flash instead."
|
46
|
-
should_not_set_the_flash
|
47
|
-
end
|
37
|
+
::ActiveSupport::Deprecation.warn("use: should set_the_flash")
|
38
|
+
should set_the_flash.to(val)
|
48
39
|
end
|
49
40
|
|
41
|
+
# Deprecated: use ActionController::Matchers#set_the_flash instead.
|
42
|
+
#
|
50
43
|
# Macro that creates a test asserting that the flash is empty.
|
51
44
|
def should_not_set_the_flash
|
52
|
-
|
53
|
-
|
54
|
-
assert_rejects matcher, @controller
|
55
|
-
end
|
45
|
+
::ActiveSupport::Deprecation.warn("use: should_not set_the_flash")
|
46
|
+
should_not set_the_flash
|
56
47
|
end
|
57
48
|
|
49
|
+
# Deprecated: use ActionController::Matchers#filter_param instead.
|
50
|
+
#
|
58
51
|
# Macro that creates a test asserting that filter_parameter_logging
|
59
52
|
# is set for the specified keys
|
60
53
|
#
|
@@ -62,14 +55,14 @@ module Shoulda # :nodoc:
|
|
62
55
|
#
|
63
56
|
# should_filter_params :password, :ssn
|
64
57
|
def should_filter_params(*keys)
|
58
|
+
::ActiveSupport::Deprecation.warn("use: should filter_param")
|
65
59
|
keys.each do |key|
|
66
|
-
|
67
|
-
should matcher.description do
|
68
|
-
assert_accepts matcher, @controller
|
69
|
-
end
|
60
|
+
should filter_param(key)
|
70
61
|
end
|
71
62
|
end
|
72
63
|
|
64
|
+
# Deprecated: use ActionController::Matchers#assign_to instead.
|
65
|
+
#
|
73
66
|
# Macro that creates a test asserting that the controller assigned to
|
74
67
|
# each of the named instance variable(s).
|
75
68
|
#
|
@@ -85,20 +78,17 @@ module Shoulda # :nodoc:
|
|
85
78
|
# should_assign_to :user, :class => User
|
86
79
|
# should_assign_to(:user) { @user }
|
87
80
|
def should_assign_to(*names, &block)
|
81
|
+
::ActiveSupport::Deprecation.warn("use: should assign_to")
|
88
82
|
klass = get_options!(names, :class)
|
89
83
|
names.each do |name|
|
90
84
|
matcher = assign_to(name).with_kind_of(klass)
|
91
|
-
|
92
|
-
|
93
|
-
expected_value = instance_eval(&block)
|
94
|
-
matcher = matcher.with(expected_value)
|
95
|
-
end
|
96
|
-
|
97
|
-
assert_accepts matcher, @controller
|
98
|
-
end
|
85
|
+
matcher = matcher.with(&block) if block
|
86
|
+
should matcher
|
99
87
|
end
|
100
88
|
end
|
101
89
|
|
90
|
+
# Deprecated: use ActionController::Matchers#assign_to instead.
|
91
|
+
#
|
102
92
|
# Macro that creates a test asserting that the controller did not assign to
|
103
93
|
# any of the named instance variable(s).
|
104
94
|
#
|
@@ -106,25 +96,25 @@ module Shoulda # :nodoc:
|
|
106
96
|
#
|
107
97
|
# should_not_assign_to :user, :posts
|
108
98
|
def should_not_assign_to(*names)
|
99
|
+
::ActiveSupport::Deprecation.warn("use: should_not assign_to")
|
109
100
|
names.each do |name|
|
110
|
-
|
111
|
-
should "not #{matcher.description}" do
|
112
|
-
assert_rejects matcher, @controller
|
113
|
-
end
|
101
|
+
should_not assign_to(name)
|
114
102
|
end
|
115
103
|
end
|
116
104
|
|
105
|
+
# Deprecated: use ActionController::Matchers#respond_with instead.
|
106
|
+
#
|
117
107
|
# Macro that creates a test asserting that the controller responded with a 'response' status code.
|
118
108
|
# Example:
|
119
109
|
#
|
120
110
|
# should_respond_with :success
|
121
111
|
def should_respond_with(response)
|
122
|
-
|
123
|
-
|
124
|
-
assert_accepts matcher, @controller
|
125
|
-
end
|
112
|
+
::ActiveSupport::Deprecation.warn("use: should respond_with")
|
113
|
+
should respond_with(response)
|
126
114
|
end
|
127
115
|
|
116
|
+
# Deprecated: use ActionController::Matchers#respond_with_content_type instead.
|
117
|
+
#
|
128
118
|
# Macro that creates a test asserting that the response content type was 'content_type'.
|
129
119
|
# Example:
|
130
120
|
#
|
@@ -132,12 +122,12 @@ module Shoulda # :nodoc:
|
|
132
122
|
# should_respond_with_content_type :rss
|
133
123
|
# should_respond_with_content_type /rss/
|
134
124
|
def should_respond_with_content_type(content_type)
|
135
|
-
|
136
|
-
should
|
137
|
-
assert_accepts matcher, @controller
|
138
|
-
end
|
125
|
+
::ActiveSupport::Deprecation.warn("use: should respond_with_content_type")
|
126
|
+
should respond_with_content_type(content_type)
|
139
127
|
end
|
140
128
|
|
129
|
+
# Deprecated: use ActionController::Matchers#set_session instead.
|
130
|
+
#
|
141
131
|
# Macro that creates a test asserting that a value returned from the
|
142
132
|
# session is correct. Expects the session key as a parameter, and a block
|
143
133
|
# that returns the expected value.
|
@@ -147,47 +137,45 @@ module Shoulda # :nodoc:
|
|
147
137
|
# should_set_session(:user_id) { @user.id }
|
148
138
|
# should_set_session(:message) { "Free stuff" }
|
149
139
|
def should_set_session(key, &block)
|
140
|
+
::ActiveSupport::Deprecation.warn("use: should set_session")
|
150
141
|
matcher = set_session(key)
|
151
|
-
|
152
|
-
|
153
|
-
matcher = matcher.to(expected_value)
|
154
|
-
assert_accepts matcher, @controller
|
155
|
-
end
|
142
|
+
matcher = matcher.to(&block) if block
|
143
|
+
should matcher
|
156
144
|
end
|
157
145
|
|
146
|
+
# Deprecated: use ActionController::Matchers#render_template instead.
|
147
|
+
#
|
158
148
|
# Macro that creates a test asserting that the controller rendered the given template.
|
159
149
|
# Example:
|
160
150
|
#
|
161
151
|
# should_render_template :new
|
162
152
|
def should_render_template(template)
|
163
|
-
|
164
|
-
|
165
|
-
end
|
153
|
+
::ActiveSupport::Deprecation.warn("use: should render_template")
|
154
|
+
should render_template(template)
|
166
155
|
end
|
167
156
|
|
157
|
+
# Deprecated: use ActionController::Matchers#render_with_layout instead.
|
158
|
+
#
|
168
159
|
# Macro that creates a test asserting that the controller rendered with the given layout.
|
169
160
|
# Example:
|
170
161
|
#
|
171
162
|
# should_render_with_layout 'special'
|
172
163
|
def should_render_with_layout(expected_layout = 'application')
|
173
|
-
|
174
|
-
|
175
|
-
should matcher.description do
|
176
|
-
assert_accepts matcher, @controller
|
177
|
-
end
|
178
|
-
else
|
179
|
-
should "render without layout" do
|
180
|
-
assert_rejects matcher, @controller
|
181
|
-
end
|
182
|
-
end
|
164
|
+
::ActiveSupport::Deprecation.warn("use: should render_with_layout")
|
165
|
+
should render_with_layout(expected_layout)
|
183
166
|
end
|
184
167
|
|
168
|
+
# Deprecated: use ActionController::Matchers#render_with_layout instead.
|
169
|
+
#
|
185
170
|
# Macro that creates a test asserting that the controller rendered without a layout.
|
186
171
|
# Same as @should_render_with_layout false@
|
187
172
|
def should_render_without_layout
|
188
|
-
|
173
|
+
::ActiveSupport::Deprecation.warn("use: should_not render_with_layout")
|
174
|
+
should_not render_with_layout
|
189
175
|
end
|
190
176
|
|
177
|
+
# Deprecated: use ActionController::Matchers#redirect_to instead.
|
178
|
+
#
|
191
179
|
# Macro that creates a test asserting that the controller returned a
|
192
180
|
# redirect to the given path. The passed description will be used when
|
193
181
|
# generating a test name. Expects a block that returns the expected path
|
@@ -197,12 +185,12 @@ module Shoulda # :nodoc:
|
|
197
185
|
#
|
198
186
|
# should_redirect_to("the user's profile") { user_url(@user) }
|
199
187
|
def should_redirect_to(description, &block)
|
200
|
-
|
201
|
-
|
202
|
-
assert_redirected_to expected_url
|
203
|
-
end
|
188
|
+
::ActiveSupport::Deprecation.warn("use: should redirect_to")
|
189
|
+
should redirect_to(description, &block)
|
204
190
|
end
|
205
191
|
|
192
|
+
# Deprecated: use ActionController::Matchers#route instead.
|
193
|
+
#
|
206
194
|
# Macro that creates a routing test. It tries to use the given HTTP
|
207
195
|
# +method+ on the given +path+, and asserts that it routes to the
|
208
196
|
# given +options+.
|
@@ -225,15 +213,8 @@ module Shoulda # :nodoc:
|
|
225
213
|
# :action => :show, :id => 1, :user_id => 1
|
226
214
|
#
|
227
215
|
def should_route(method, path, options)
|
228
|
-
|
229
|
-
|
230
|
-
end
|
231
|
-
|
232
|
-
matcher = route(method, path).to(options)
|
233
|
-
|
234
|
-
should matcher.description do
|
235
|
-
assert_accepts matcher.in_context(self), self
|
236
|
-
end
|
216
|
+
::ActiveSupport::Deprecation.warn("use: should route")
|
217
|
+
should route(method, path).to(options)
|
237
218
|
end
|
238
219
|
end
|
239
220
|
end
|