rspec-rails 2.3.1 → 2.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (47) hide show
  1. data/History.md +21 -1
  2. data/README.md +3 -3
  3. data/Rakefile +2 -2
  4. data/{Upgrade.markdown → Upgrade.md} +0 -0
  5. data/features/.nav +12 -7
  6. data/features/Autotest.md +10 -0
  7. data/features/Generators.md +8 -0
  8. data/features/GettingStarted.md +40 -0
  9. data/features/{README.markdown → README.md} +1 -26
  10. data/features/Upgrade.md +56 -0
  11. data/features/controller_specs/README.md +27 -16
  12. data/features/controller_specs/isolation_from_views.feature +6 -5
  13. data/features/controller_specs/render_views.feature +30 -1
  14. data/features/helper_specs/helper_spec.feature +36 -3
  15. data/features/mocks/mock_model.feature +3 -3
  16. data/features/model_specs/README.md +19 -0
  17. data/features/routing_specs/README.md +16 -0
  18. data/features/{matchers → routing_specs}/be_routable_matcher.feature +18 -18
  19. data/features/routing_specs/{access_to_named_routes.feature → named_routes.feature} +6 -3
  20. data/features/routing_specs/route_to_matcher.feature +38 -0
  21. data/lib/generators/rspec/scaffold/scaffold_generator.rb +6 -6
  22. data/lib/generators/rspec/scaffold/templates/controller_spec.rb +22 -24
  23. data/lib/rspec/rails.rb +0 -1
  24. data/lib/rspec/rails/example.rb +29 -1
  25. data/lib/rspec/rails/example/controller_example_group.rb +1 -5
  26. data/lib/rspec/rails/example/helper_example_group.rb +5 -6
  27. data/lib/rspec/rails/example/mailer_example_group.rb +1 -5
  28. data/lib/rspec/rails/example/model_example_group.rb +0 -3
  29. data/lib/rspec/rails/example/request_example_group.rb +1 -5
  30. data/lib/rspec/rails/example/routing_example_group.rb +1 -5
  31. data/lib/rspec/rails/example/view_example_group.rb +1 -4
  32. data/lib/rspec/rails/matchers/redirect_to.rb +6 -2
  33. data/lib/rspec/rails/matchers/render_template.rb +5 -1
  34. data/lib/rspec/rails/matchers/routing_matchers.rb +1 -1
  35. data/lib/rspec/rails/module_inclusion.rb +17 -0
  36. data/lib/rspec/rails/version.rb +1 -1
  37. data/lib/rspec/rails/view_rendering.rb +23 -7
  38. data/spec/rspec/rails/configuration_spec.rb +26 -0
  39. data/spec/rspec/rails/example/helper_example_group_spec.rb +18 -0
  40. data/spec/rspec/rails/example/request_example_group_spec.rb +2 -0
  41. data/spec/rspec/rails/matchers/be_routable_spec.rb +41 -0
  42. data/spec/rspec/rails/matchers/redirect_to_spec.rb +67 -8
  43. data/spec/rspec/rails/matchers/render_template_spec.rb +67 -10
  44. data/spec/rspec/rails/matchers/route_to_spec.rb +64 -33
  45. data/spec/rspec/rails/view_rendering_spec.rb +105 -0
  46. metadata +38 -20
  47. data/spec/rspec/rails/example/view_rendering_spec.rb +0 -110
data/History.md CHANGED
@@ -1,8 +1,28 @@
1
1
  ## rspec-rails-2 release history
2
2
 
3
+ ### 2.4.0 / 2011-01-02
4
+
5
+ [full changelog](http://github.com/rspec/rspec-rails/compare/v2.3.1...2.4.0)
6
+
7
+ * Enhancements
8
+ * include ApplicationHelper in helper object in helper specs
9
+ * include request spec extensions in files in spec/integration
10
+ * include controller spec extensions in groups that use :type => :controller
11
+ * same for :model, :view, :helper, :mailer, :request, :routing
12
+
13
+ * Bug fixes
14
+ * restore global config.render_views so you only need to say it once
15
+ * support overriding render_views in nested groups
16
+ * matchers that delegate to Rails' assertions capture
17
+ ActiveSupport::TestCase::Assertion (so they work properly now with
18
+ should_not in Ruby 1.8.7 and 1.9.1)
19
+
20
+ * Deprecations
21
+ * include_self_when_dir_matches
22
+
3
23
  ### 2.3.1 / 2010-12-16
4
24
 
5
- [full changelog](http://github.com/rspec/rspec-rails/compare/v2.3.0...master)
25
+ [full changelog](http://github.com/rspec/rspec-rails/compare/v2.3.0...v2.3.1)
6
26
 
7
27
  * Bug fixes
8
28
  * respond_to? correctly handles 2 args
data/README.md CHANGED
@@ -60,7 +60,7 @@ out of the box for the default scenario (`ActiveRecord` + `Webrat`).
60
60
 
61
61
  ### Autotest
62
62
 
63
- The `rspec:install` generator creates an `./autotest/discover.rb` file, which
63
+ The `rspec:install` generator creates an `.rspec` file, which
64
64
  tells Autotest that you're using RSpec and Rails. You'll also need to add the
65
65
  autotest (not autotest-rails) gem to your Gemfile:
66
66
 
@@ -142,8 +142,8 @@ You can use RSpec expectations/matchers or Test::Unit assertions.
142
142
  ## `render_views`
143
143
  By default, controller specs do not render views. This supports specifying
144
144
  controllers without concern for whether the views they render work correctly
145
- (NOTE: the template must exist, unlike rspec-rails-1. See Upgrade.markdown for
146
- more information about this). If you prefer to render the views (a la Rails'
145
+ (NOTE: the template must exist, unlike rspec-rails-1. See Upgrade.md for more
146
+ information about this). If you prefer to render the views (a la Rails'
147
147
  functional tests), you can use the `render_views` declaration in each example
148
148
  group:
149
149
 
data/Rakefile CHANGED
@@ -105,10 +105,10 @@ namespace :clobber do
105
105
  end
106
106
  end
107
107
 
108
- desc "Push cukes to relishapp using the relish-client-gem"
108
+ desc "Push docs/cukes to relishapp using the relish-client-gem"
109
109
  task :relish, :version do |t, args|
110
110
  raise "rake relish[VERSION]" unless args[:version]
111
- sh "relish push --organization rspec --project rspec-rails -v #{args[:version]}"
111
+ sh "relish push rspec/rspec-rails:#{args[:version]}"
112
112
  end
113
113
 
114
114
  task :default => [:spec, "clobber:app", "generate:app", "generate:stuff", :smoke, :cucumber]
File without changes
@@ -1,10 +1,10 @@
1
+ - GettingStarted.md (Getting started)
2
+ - Upgrade.md
3
+ - Generators.md (Rails generators)
4
+ - Autotest.md (Autotest integration)
5
+ - transactional_examples.feature
1
6
  - model_specs:
2
- - transactional_examples.feature
3
7
  - errors_on.feature
4
- - view_specs:
5
- - view_spec.feature
6
- - stub_template.feature
7
- - inferred_controller_path.feature
8
8
  - controller_specs:
9
9
  - controller_spec.feature
10
10
  - isolation_from_views.feature
@@ -15,12 +15,17 @@
15
15
  - mailer_specs:
16
16
  - url_helpers.feature
17
17
  - routing_specs:
18
- - access_to_named_routes.feature
18
+ - route_to_matcher.feature
19
+ - be_routable_matcher.feature
20
+ - named_routes.feature
21
+ - view_specs:
22
+ - view_spec.feature
23
+ - stub_template.feature
24
+ - inferred_controller_path.feature
19
25
  - matchers:
20
26
  - new_record_matcher.feature
21
27
  - render_template_matcher.feature
22
28
  - redirect_to_matcher.feature
23
- - be_routable_matcher.feature
24
29
  - mocks:
25
30
  - mock_model.feature
26
31
  - stub_model.feature
@@ -0,0 +1,10 @@
1
+ The rspec:install generator creates a .rspec file, which tells RSpec to tell
2
+ Autotest that you're using RSpec and Rails. You'll also need to add the ZenTest
3
+ gem to your Gemfile:
4
+
5
+ gem "ZenTest"
6
+
7
+ At this point, if all of the gems in your Gemfile are installed in system gems,
8
+ you can just type autotest. If, however, Bundler is managing any gems for you
9
+ directly (i.e. you've got :git or :path attributes in the Gemfile), you'll need
10
+ to run bundle exec autotest.
@@ -0,0 +1,8 @@
1
+ If you type script/rails generate, the only RSpec generator you'll actually see
2
+ is rspec:install. That's because RSpec is registered with Rails as the test
3
+ framework, so whenever you generate application components like models,
4
+ controllers, etc, RSpec specs are generated instead of Test::Unit tests.
5
+
6
+ Note that the generators are there to help you get started, but they are no
7
+ substitute for writing your own examples, and they are only guaranteed to work
8
+ out of the box for the default scenario (ActiveRecord + Webrat).
@@ -0,0 +1,40 @@
1
+ Install Rails-3
2
+
3
+ $ gem install rails -v "~> 3.0.0"
4
+
5
+ ### Generate an app
6
+
7
+ $ rails new example
8
+ $ cd example
9
+
10
+ ### Add rspec-rails to the Gemfile
11
+
12
+ $ echo 'gem "rspec-rails", :group => [:development, :test]' >> Gemfile
13
+
14
+ ### Install the bundle
15
+
16
+ $ bundle install
17
+
18
+ ### Generate a scaffold
19
+
20
+ $ rails generate scaffold Widgets name:string
21
+
22
+ This generates files in the `app` and `spec` directories. The files in the
23
+ `app` directory are generated by Rails, and Rails delegates the generation of
24
+ the files in the `spec` directory to RSpec.
25
+
26
+ ### Run migrations
27
+
28
+ $ rake db:migrate && rake db:test:prepare
29
+
30
+ ### Run RSpec
31
+
32
+ $ rake spec
33
+
34
+ or
35
+
36
+ $ rspec spec
37
+
38
+ If all went well, you should see output ending with:
39
+
40
+ 29 examples, 0 failures, 2 pending
@@ -1,5 +1,5 @@
1
1
  rspec-rails extends Rails' built-in testing framework to support rspec examples
2
- for requests, controllers, models, views, and helpers.
2
+ for requests, controllers, models, views, helpers, mailers and routing.
3
3
 
4
4
  ## Rails-3
5
5
 
@@ -36,30 +36,6 @@ Now you can run:
36
36
  This adds the spec directory and some skeleton files, including a .rspec
37
37
  file.
38
38
 
39
- ## Generators
40
-
41
- If you type script/rails generate, the only RSpec generator you'll actually see
42
- is rspec:install. That's because RSpec is registered with Rails as the test
43
- framework, so whenever you generate application components like models,
44
- controllers, etc, RSpec specs are generated instead of Test::Unit tests.
45
-
46
- Note that the generators are there to help you get started, but they are no
47
- substitute for writing your own examples, and they are only guaranteed to work
48
- out of the box for the default scenario (ActiveRecord + Webrat).
49
-
50
- ## Autotest
51
-
52
- The rspec:install generator creates a .rspec file, which tells RSpec to tell
53
- Autotest that you're using RSpec and Rails. You'll also need to add the ZenTest
54
- gem to your Gemfile:
55
-
56
- gem "ZenTest"
57
-
58
- At this point, if all of the gems in your Gemfile are installed in system gems,
59
- you can just type autotest. If, however, Bundler is managing any gems for you
60
- directly (i.e. you've got :git or :path attributes in the Gemfile), you'll need
61
- to run bundle exec autotest.
62
-
63
39
  ## Webrat and Capybara
64
40
 
65
41
  You can choose between webrat or capybara for simulating a browser, automating
@@ -80,4 +56,3 @@ incomplete or confusing, or, better yet, wish to write a missing Cucumber
80
56
  feature yourself, please [submit an
81
57
  issue](http://github.com/rspec/rspec-rails/issues) or a [pull
82
58
  request](http://github.com/rspec/rspec-rails).
83
-
@@ -0,0 +1,56 @@
1
+ # Upgrading from rspec-rails-1.x to rspec-rails-2.
2
+
3
+ This is a work in progress. Please submit errata, missing steps, or patches to
4
+ the [rspec-rails issue tracker](https://github.com/rspec/rspec-rails/issues).
5
+
6
+ ## Rake tasks
7
+
8
+ Delete lib/tasks/rspec.rake, if present. Rake tasks now live in the rspec-rails
9
+ gem.
10
+
11
+ ## `spec_helper.rb`
12
+
13
+ There were a few changes to the generated `spec/spec_helper.rb` file. We
14
+ recommend the following:
15
+
16
+ 1. set aside a copy of your existing `spec/spec_helper.rb` file.
17
+ 2. run `rails generate spec:install`
18
+ 3. copy any customizations from your old spec_helper to the new one
19
+
20
+ If you prefer to make the changes manually in the existing spec_helper, here
21
+ is what you need to change:
22
+
23
+ # rspec-1
24
+ require 'spec/autorun'
25
+
26
+ Spec::Runner.configure do |config|
27
+ ...
28
+ end
29
+
30
+ # rspec-2
31
+ require 'rspec/core'
32
+
33
+ RSpec.configure do |config|
34
+ ...
35
+ end
36
+
37
+ ## Controller specs
38
+
39
+ ### `response.should render_template`
40
+
41
+ This needs to move from before the action to after. For example:
42
+
43
+ # rspec-rails-1
44
+ controller.should render_template("edit")
45
+ get :edit, :id => "37"
46
+
47
+ # rspec-rails-2
48
+ get :edit, :id => "37"
49
+ response.should render_template("edit")
50
+
51
+ rspec-1 had to monkey patch Rails to get render_template to work before the
52
+ action, and this broke a couple of times with Rails releases (requiring urgent
53
+ fix releases in RSpec). Part of the philosophy of rspec-rails-2 is to rely on
54
+ public APIs in Rails as much as possible. In this case, `render_template`
55
+ delegates directly to Rails' `assert_template`, which only works after the
56
+ action.
@@ -1,25 +1,36 @@
1
- A controller spec is an RSpec wrapper for a Rails functional test. It allows
2
- you to simulate a single http request in each example, and then specify
3
- expected outcomes, such as:
1
+ Controller specs live in `spec/controllers` or any example group with
2
+ `:type => :controller`.
3
+
4
+ A controller spec is an RSpec wrapper for a Rails functional test
5
+ (ActionController::TestCase::Behavior). It allows you to simulate a single
6
+ http request in each example, and then specify expected outcomes, including:
4
7
 
5
8
  * templates that are rendered by the action
6
- * instance variables that are assigned in the controller to be shared with
7
- the view
9
+ * instance variables that are assigned in the controller to be shared with the
10
+ view
8
11
  * cookies that get sent back with the response
9
12
 
10
13
  To specify outcomes, you can use:
11
14
 
12
- * standard rspec matchers (response.code.should eq(200))
13
- * standard test/unit assertions (assert_equal 200, response.code)
14
- * rails assertions (assert_response 200)
15
+ * standard rspec matchers (`response.code.should eq(200)`)
16
+ * standard test/unit assertions (`assert_equal 200, response.code`)
17
+ * rails assertions (`assert_response 200`)
15
18
  * rails-specific matchers:
16
- * response.should render_template (wraps assert_template)
17
- * response.should redirect_to (wraps assert_redirected_to)
18
- * assigns(:widget).should be_a_new(Widget)
19
+ * `response.should render_template (wraps assert_template)`
20
+ * `response.should redirect_to (wraps assert_redirected_to)`
21
+ * `assigns(:widget).should be_a_new(Widget)`
19
22
 
20
- Conventions:
23
+ ## Conventions:
24
+
25
+ ### Controller
26
+
27
+ * pass the controller being specified to the outermost `describe` method.
28
+
29
+ describe AccountController do
30
+ # ...
31
+
32
+ ### Views
21
33
 
22
- * pass the controller being spec'd to the describe method
23
- * this is only necessary for the outermost example group
24
- * by default, views are not rendered. See "isolation from views" and
25
- "render_views" for details
34
+ * by default, views are not rendered. See
35
+ [views are stubbed by default](controller-specs/views-are-stubbed-by-default) and
36
+ [render_views](controller-specs/render-views) for details.
@@ -1,10 +1,11 @@
1
- Feature: do not render views
1
+ Feature: views are stubbed by default
2
2
 
3
- By default, controller specs do not render views. This allows you specify
4
- which view template an action should try to render regardless of whether or
5
- not the template compiles cleanly.
3
+ By default, controller specs stub views with template that renders an empty
4
+ string instead of the views in the app. This allows you specify which view
5
+ template an action should try to render regardless of whether the template
6
+ compiles cleanly.
6
7
 
7
- NOTE: unlike rspec-rails-1.x, the template must exist.
8
+ NOTE: unlike rspec-rails-1.x, the real template must exist.
8
9
 
9
10
  Scenario: expect template that is rendered by controller action (passes)
10
11
  Given a file named "spec/controllers/widgets_controller_spec.rb" with:
@@ -1,4 +1,4 @@
1
- Feature: render views
1
+ Feature: render_views
2
2
 
3
3
  You can tell a controller example group to render views with the render_views
4
4
  declaration.
@@ -101,3 +101,32 @@ Feature: render views
101
101
  """
102
102
  When I run "rspec spec"
103
103
  Then the output should contain "4 examples, 0 failures"
104
+
105
+ Scenario: render_views globally
106
+ Given a file named "spec/support/render_views.rb" with:
107
+ """
108
+ RSpec.configure do |config|
109
+ config.render_views
110
+ end
111
+ """
112
+ And a file named "spec/controllers/widgets_controller_spec.rb" with:
113
+ """
114
+ require "spec_helper"
115
+
116
+ describe WidgetsController do
117
+ describe "index" do
118
+ it "renders the index template" do
119
+ get :index
120
+ response.should contain("Listing widgets")
121
+ end
122
+
123
+ it "renders the widgets/index template" do
124
+ get :index
125
+ response.should contain("Listing widgets")
126
+ end
127
+ end
128
+ end
129
+ """
130
+ When I run "rspec spec"
131
+ Then the output should contain "2 examples, 0 failures"
132
+
@@ -1,7 +1,7 @@
1
1
  Feature: helper spec
2
2
 
3
- Helper specs live in spec/helpers. In order to access
4
- the helper methods you can call them on the "helper" object.
3
+ Helper specs live in `spec/helpers`. In order to access the helper methods
4
+ you can call them on the `helper` object.
5
5
 
6
6
  Scenario: helper method that returns true
7
7
  Given a file named "spec/helpers/application_helper_spec.rb" with:
@@ -50,4 +50,37 @@ Feature: helper spec
50
50
  end
51
51
  """
52
52
  When I run "rspec spec/helpers/application_helper_spec.rb"
53
- Then the output should contain "1 example, 0 failures"
53
+ Then the output should contain "1 example, 0 failures"
54
+
55
+ Scenario: application helper is included in helper object
56
+ Given a file named "spec/helpers/widgets_helper_spec.rb" with:
57
+ """
58
+ require "spec_helper"
59
+
60
+ describe WidgetsHelper do
61
+ describe "#page_title" do
62
+ it "includes the app name" do
63
+ assign(:title, "This Page")
64
+ helper.page_title.should eq("The App: This Page")
65
+ end
66
+ end
67
+ end
68
+ """
69
+ And a file named "app/helpers/application_helper.rb" with:
70
+ """
71
+ module ApplicationHelper
72
+ def app_name
73
+ "The App"
74
+ end
75
+ end
76
+ """
77
+ And a file named "app/helpers/widgets_helper.rb" with:
78
+ """
79
+ module WidgetsHelper
80
+ def page_title
81
+ "#{app_name}: #{@title}"
82
+ end
83
+ end
84
+ """
85
+ When I run "rspec spec/helpers/widgets_helper_spec.rb"
86
+ Then the output should contain "1 example, 0 failures"
@@ -1,8 +1,8 @@
1
1
  Feature: mock_model
2
2
 
3
- The mock_model method generates a test double object that acts like an
4
- Active Model model. This is different from the stub_model method which
5
- generates an instance of a real ActiveModel class.
3
+ The mock_model method generates a test double that acts like an Active Model
4
+ model. This is different from the stub_model method which generates an
5
+ instance of a real ActiveModel class.
6
6
 
7
7
  The benefit of mock_model over stub_model is that its a true double, so the
8
8
  examples are not dependent on the behaviour (or mis-behaviour), or even the
@@ -0,0 +1,19 @@
1
+ Model specs live in spec/models, e.g. spec/models/account_spec.rb. A model spec
2
+ is a thin wrapper for an ActiveSupport::TestCase, and includes all of the
3
+ behavior and assertions that it provides, in addition to RSpec's own behavior
4
+ and expectations.
5
+
6
+ ## Examples
7
+
8
+ require "spec_helper"
9
+
10
+ describe Post do
11
+ context "with 2 or more comments" do
12
+ it "orders them in reverse" do
13
+ post = Post.create
14
+ comment1 = post.comment("first")
15
+ comment2 = post.comment("second")
16
+ post.reload.comments.should eq([comment2, comment1])
17
+ end
18
+ end
19
+ end