rspec-rails 2.0.0.beta.8 → 2.0.0.beta.9.1

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 (61) hide show
  1. data/README.markdown +82 -27
  2. data/Rakefile +7 -7
  3. data/Upgrade.markdown +12 -0
  4. data/VERSION +1 -1
  5. data/autotest/discover.rb +1 -0
  6. data/cucumber.yml +3 -0
  7. data/example_app_template.rb +2 -2
  8. data/features/controller_specs/do_not_render_views.feature +61 -0
  9. data/features/controller_specs/readers.feature +18 -0
  10. data/features/controller_specs/render_views.feature +53 -0
  11. data/features/model_specs/errors_on.feature +32 -0
  12. data/features/model_specs/transactional_examples.feature +2 -2
  13. data/features/view_specs/view_spec.feature +102 -1
  14. data/lib/autotest/rails_rspec2.rb +1 -1
  15. data/lib/generators/rspec/helper/helper_generator.rb +1 -0
  16. data/lib/generators/rspec/helper/templates/helper_spec.rb +3 -3
  17. data/lib/generators/rspec/install/install_generator.rb +7 -7
  18. data/lib/generators/rspec/scaffold/scaffold_generator.rb +10 -1
  19. data/lib/generators/rspec/scaffold/templates/edit_spec.rb +1 -1
  20. data/lib/generators/rspec/scaffold/templates/index_spec.rb +1 -1
  21. data/lib/generators/rspec/scaffold/templates/new_spec.rb +1 -1
  22. data/lib/generators/rspec/scaffold/templates/show_spec.rb +2 -2
  23. data/lib/rspec-rails.rb +12 -0
  24. data/lib/rspec/rails.rb +8 -0
  25. data/lib/rspec/rails/adapters.rb +12 -8
  26. data/lib/rspec/rails/example.rb +1 -0
  27. data/lib/rspec/rails/example/controller_example_group.rb +13 -12
  28. data/lib/rspec/rails/example/helper_example_group.rb +43 -0
  29. data/lib/rspec/rails/example/mailer_example_group.rb +10 -5
  30. data/lib/rspec/rails/example/request_example_group.rb +7 -7
  31. data/lib/rspec/rails/example/view_example_group.rb +44 -62
  32. data/lib/rspec/rails/extensions.rb +1 -0
  33. data/lib/rspec/rails/extensions/active_record/base.rb +46 -0
  34. data/lib/rspec/rails/matchers.rb +28 -3
  35. data/lib/rspec/rails/mocks.rb +3 -3
  36. data/lib/rspec/rails/monkey.rb +1 -0
  37. data/lib/rspec/rails/monkey/action_controller/test_case.rb +153 -145
  38. data/lib/rspec/rails/monkey/action_view/test_case.rb +201 -0
  39. data/lib/rspec/rails/null_resolver.rb +10 -0
  40. data/lib/{generators/rspec/install/templates/lib → rspec/rails}/tasks/rspec.rake +4 -5
  41. data/lib/rspec/rails/transactional_database_support.rb +4 -6
  42. data/lib/rspec/rails/version.rb +1 -1
  43. data/lib/rspec/rails/view_assigns.rb +28 -0
  44. data/lib/rspec/rails/view_rendering.rb +33 -0
  45. data/rspec-rails.gemspec +41 -11
  46. data/spec/rspec/rails/example/controller_example_group_spec.rb +11 -0
  47. data/spec/rspec/rails/example/helper_example_group_spec.rb +20 -0
  48. data/spec/rspec/rails/example/mailer_example_group_spec.rb +11 -0
  49. data/spec/rspec/rails/example/request_example_group_spec.rb +11 -0
  50. data/spec/rspec/rails/example/view_example_group_spec.rb +75 -0
  51. data/spec/rspec/rails/example/view_rendering_spec.rb +68 -0
  52. data/spec/rspec/rails/matchers/errors_on_spec.rb +38 -0
  53. data/spec/rspec/rails/mocks/ar_classes.rb +1 -1
  54. data/spec/rspec/rails/mocks/mock_model_spec.rb +88 -65
  55. data/spec/rspec/rails/mocks/stub_model_spec.rb +1 -1
  56. data/spec/rspec/rails/transactional_database_support_spec.rb +2 -2
  57. data/spec/spec_helper.rb +18 -2
  58. data/spec/support/helpers.rb +20 -0
  59. data/specs.watchr +10 -10
  60. data/templates/generate_stuff.rb +3 -1
  61. metadata +40 -9
@@ -1,17 +1,11 @@
1
- RSpec-2 for Rails-3
1
+ # rspec-rails-2
2
2
 
3
- ### Backwards compatibility
3
+ ## RSpec-2 for Rails-3
4
4
 
5
- None. This is a rewrite of the rspec-rails extension designed to work
6
- with rails-3.x and rspec-2.x. It will not work with older versions of
7
- either rspec or rails.
5
+ rspec-rails-2 brings rspec-2 to rails-3 with lightweight extensions to both
6
+ libraries.
8
7
 
9
- ### Current state
10
-
11
- Currently in alpha - some things work, some not so much - see Known Issues,
12
- below
13
-
14
- Install:
8
+ ## Install
15
9
 
16
10
  gem install rspec-rails --pre
17
11
 
@@ -23,7 +17,7 @@ This installs the following gems:
23
17
  * rspec-mocks
24
18
  * rspec-rails
25
19
 
26
- Configure:
20
+ ## Configure:
27
21
 
28
22
  Add this line to the Gemfile:
29
23
 
@@ -39,16 +33,36 @@ the "rake spec" task.
39
33
  Note that things are in flux, so some generators generate code that
40
34
  doesn't work all that well yet.
41
35
 
42
- ### What works (and what doesn't)
36
+ ## Living on edge
37
+
38
+ If you prefer to exploit bundler's support for pointing a gem at a github repo,
39
+ be sure to do so for all five of the relevant rspec gems:
40
+
41
+ gem "rspec-rails", :git => "git://github.com/rspec/rspec-rails.git"
42
+ gem "rspec", :git => "git://github.com/rspec/rspec.git"
43
+ gem "rspec-core", :git => "git://github.com/rspec/rspec-core.git"
44
+ gem "rspec-expectations", :git => "git://github.com/rspec/rspec-expectations.git"
45
+ gem "rspec-mocks", :git => "git://github.com/rspec/rspec-mocks.git"
46
+
47
+ Keep in mind that each of these repos is under active development, which means
48
+ that its very likely that you'll pull from these repos and they won't play nice
49
+ together. If playing nice is important to you, stick to the published gems.
50
+
51
+ ## Backwards compatibility
52
+
53
+ This is a complete rewrite of the rspec-rails extension designed to work with
54
+ rails-3.x and rspec-2.x. It will not work with older versions of either rspec
55
+ or rails. Many of the APIs from rspec-rails-1 have been carried forward,
56
+ however, so upgrading an app from rspec-1/rails-2, while not pain-free, should
57
+ not send you to the doctor with a migraine.
43
58
 
44
- Currently supported:
59
+ ## Synopsis
45
60
 
46
61
  * each example runs in its own transaction
47
- * configurable in Rspec.configure
48
- * see generated spec/spec_helper.rb
62
+ * configurable in RSpec.configure
63
+ * see generated spec/spec\_helper.rb
49
64
  * model specs in spec/models
50
65
  * controller specs in spec/controllers
51
- * no view isolation yet
52
66
  * view specs in spec/views
53
67
  * mailer specs in spec/mailers
54
68
  * observer specs in spec/models
@@ -56,20 +70,23 @@ Currently supported:
56
70
  * these wrap rails integration tests
57
71
  * rails assertions
58
72
  * assertion-wrapping matchers
59
- * redirect_to
60
- * render_template
61
- * template must exist (unlike rspec-rails-1.x)
73
+ * redirect\_to
74
+ * render\_template
75
+ * helper specs
62
76
  * webrat matchers
63
77
  * generators
64
78
  * run "script/rails g" to see the list of available generators
65
79
 
66
- ### Known issues
80
+ ## Known issues
67
81
 
68
- * no helper specs
69
- * no routing specs
70
- * only works with ActiveRecord
82
+ See http://github.com/rspec/rspec-rails/issues
71
83
 
72
- ## Controller Specs
84
+ # Request Specs
85
+
86
+ Request specs live in spec/requests, and mix in behavior
87
+ from Rails' integration tests.
88
+
89
+ # Controller Specs
73
90
 
74
91
  Controller specs live in spec/controllers, and mix in
75
92
  ActionController::TestCase::Behavior. See the documentation
@@ -78,12 +95,22 @@ available from Rails.
78
95
 
79
96
  You can use RSpec expectations/matchers or Test::Unit assertions.
80
97
 
98
+ ## rendering views
99
+ By default, controller specs do not render views (as of beta.9).
100
+ This supports specifying controllers without concern for whether
101
+ the views they render work correctly or even exist. If you prefer
102
+ to render the views (a la Rails' functional tests), you can use the
103
+ `render_views` declaration in each example group:
104
+
105
+ describe SomeController do
106
+ render_views
107
+ ...
108
+
109
+ ## Matchers
81
110
  In addition to what Rails offers, controller specs provide all
82
111
  of rspec-core's matchers and the rspec-rails' specific matchers
83
112
  as well.
84
113
 
85
- ## Matchers
86
-
87
114
  ### render_template
88
115
  Delegates to Rails' assert_template:
89
116
 
@@ -94,3 +121,31 @@ Delegates to assert_redirect
94
121
 
95
122
  response.should redirect_to(widgets_path)
96
123
 
124
+ # View specs
125
+
126
+ View specs live in spec/views, and mix in ActionView::TestCase::Behavior.
127
+
128
+ describe "events/show.html.erb" do
129
+ it "displays the event location" do
130
+ assign(:event, stub_model(Event,
131
+ :location => "Chicago"
132
+ )
133
+ render
134
+ rendered.should contain("Chicago")
135
+ end
136
+ end
137
+
138
+ # Helper specs
139
+
140
+ Helper specs live in spec/helpers, and mix in ActionView::TestCase::Behavior.
141
+
142
+ describe EventsHelper do
143
+ describe "#link_to_event" do
144
+ it "displays the title, and formatted date" do
145
+ event = Event.new("Ruby Kaigi", Date.new(2010, 8, 27))
146
+ # helper is an instance of ActionView::Base configured with the
147
+ # EventsHelper and all of Rails' built-in helpers
148
+ helper.link_to_event.should =~ /Ruby Kaigi, 27 Aug, 2010/
149
+ end
150
+ end
151
+ end
data/Rakefile CHANGED
@@ -1,7 +1,7 @@
1
1
  require 'rake'
2
2
  require 'yaml'
3
3
 
4
- $:.unshift File.expand_path(File.join(File.dirname(__FILE__),'lib'))
4
+ $LOAD_PATH.unshift File.expand_path('../lib', __FILE__)
5
5
 
6
6
  require 'rake/rdoctask'
7
7
  require 'rspec/rails/version'
@@ -9,7 +9,7 @@ require 'rspec'
9
9
  require 'rspec/core/rake_task'
10
10
  require 'cucumber/rake/task'
11
11
 
12
- Rspec::Core::RakeTask.new(:spec)
12
+ RSpec::Core::RakeTask.new(:spec)
13
13
  Cucumber::Rake::Task.new(:cucumber) do |t|
14
14
  t.cucumber_opts = %w{--format progress}
15
15
  end
@@ -18,14 +18,14 @@ begin
18
18
  require 'jeweler'
19
19
  Jeweler::Tasks.new do |gem|
20
20
  gem.name = "rspec-rails"
21
- gem.version = Rspec::Rails::Version::STRING
22
- gem.summary = "rspec-rails-#{Rspec::Rails::Version::STRING}"
23
- gem.description = "Rspec-2 for Rails-3"
21
+ gem.version = RSpec::Rails::Version::STRING
22
+ gem.summary = "rspec-rails-#{RSpec::Rails::Version::STRING}"
23
+ gem.description = "RSpec-2 for Rails-3"
24
24
  gem.email = "dchelimsky@gmail.com;chad.humphries@gmail.com"
25
25
  gem.homepage = "http://github.com/rspec/rspec-rails"
26
26
  gem.authors = ["David Chelimsky", "Chad Humphries"]
27
27
  gem.rubyforge_project = "rspec"
28
- gem.add_dependency "rspec", gem.version
28
+ gem.add_dependency "rspec", "2.0.0.beta.9" # gem.version
29
29
  gem.add_dependency "webrat", ">= 0.7.0"
30
30
  gem.post_install_message = <<-EOM
31
31
  #{"*"*50}
@@ -49,7 +49,7 @@ end
49
49
  namespace :gem do
50
50
  desc "push to gemcutter"
51
51
  task :push => :build do
52
- system "gem push pkg/rspec-rails-#{Rspec::Rails::Version::STRING}.gem"
52
+ system "gem push pkg/rspec-rails-#{RSpec::Rails::Version::STRING}.gem"
53
53
  end
54
54
  end
55
55
 
@@ -0,0 +1,12 @@
1
+ # Upgrade to rspec-rails-2
2
+
3
+ ## What's changed
4
+
5
+ ### View specs
6
+
7
+ Rails changed the way it renders partials, so to set an expectation that a partial
8
+ gets rendered:
9
+
10
+ view.should_receive(:_render_partial).
11
+ with(hash_including(:partial => "widget/row"))
12
+
data/VERSION CHANGED
@@ -1 +1 @@
1
- 2.0.0.beta.8
1
+ 2.0.0.beta.9.1
@@ -0,0 +1 @@
1
+ Autotest.add_discovery { "rspec2" }
@@ -0,0 +1,3 @@
1
+ default: --require features --format progress --tags ~@wip
2
+ pretty: --require features --format pretty --tags ~@wip
3
+ wip: --require features --tags @wip
@@ -1,5 +1,5 @@
1
- $LOAD_PATH.unshift(File.expand_path('../../../lib', __FILE__))
1
+ $LOAD_PATH.unshift(File.expand_path('../lib', __FILE__))
2
2
  require 'rspec/rails/version'
3
3
 
4
- gem 'rspec-rails', :path => File.expand_path('../../../', __FILE__)
4
+ gem 'rspec-rails', :path => File.expand_path('../', __FILE__)
5
5
 
@@ -0,0 +1,61 @@
1
+ Feature: do not render views
2
+
3
+ By default, controller specs do not render views. This
4
+ allows you specify which view template an action should
5
+ try to render regardless of whether that template exists
6
+ or compiles cleanly.
7
+
8
+ Scenario: expect template that exists and is rendered by controller (passes)
9
+ Given a file named "spec/controllers/widgets_controller_spec.rb" with:
10
+ """
11
+ require "spec_helper.rb"
12
+
13
+ describe WidgetsController do
14
+ describe "index" do
15
+ it "renders the index template" do
16
+ get :index
17
+ response.should render_template("index")
18
+ end
19
+ it "renders the widgets/index template" do
20
+ get :index
21
+ response.should render_template("widgets/index")
22
+ end
23
+ end
24
+ end
25
+ """
26
+ When I run "rspec ./spec"
27
+ Then I should see "2 examples, 0 failures"
28
+
29
+ Scenario: expect template that exists but is not rendered by controller (fails)
30
+ Given a file named "spec/controllers/widgets_controller_spec.rb" with:
31
+ """
32
+ require "spec_helper.rb"
33
+
34
+ describe WidgetsController do
35
+ describe "index" do
36
+ it "renders the 'new' template" do
37
+ get :index
38
+ response.should render_template("new")
39
+ end
40
+ end
41
+ end
42
+ """
43
+ When I run "rspec ./spec"
44
+ Then I should see "1 example, 1 failure"
45
+
46
+ Scenario: expect template that does not exist and is not rendered by controller (fails)
47
+ Given a file named "spec/controllers/widgets_controller_spec.rb" with:
48
+ """
49
+ require "spec_helper.rb"
50
+
51
+ describe WidgetsController do
52
+ describe "index" do
53
+ it "renders a template that does not exist" do
54
+ get :index
55
+ response.should render_template("does_not_exist")
56
+ end
57
+ end
58
+ end
59
+ """
60
+ When I run "rspec ./spec"
61
+ Then I should see "1 example, 1 failure"
@@ -0,0 +1,18 @@
1
+ Feature: controller spec readers
2
+
3
+ Controller specs expose a number of different
4
+ attribute readers.
5
+
6
+ Scenario: access controller
7
+ Given a file named "spec/controllers/widgets_controller_spec.rb" with:
8
+ """
9
+ require "spec_helper.rb"
10
+
11
+ describe WidgetsController do
12
+ it "is available before an action" do
13
+ controller.should be_an_instance_of(WidgetsController)
14
+ end
15
+ end
16
+ """
17
+ When I run "rspec ./spec"
18
+ Then I should see "1 example, 0 failures"
@@ -0,0 +1,53 @@
1
+ Feature: render views
2
+
3
+ You can tell a controller example group to render views
4
+ with the render_views declaration.
5
+
6
+ Scenario: expect template that exists and is rendered by controller (passes)
7
+ Given a file named "spec/controllers/widgets_controller_spec.rb" with:
8
+ """
9
+ require "spec_helper.rb"
10
+
11
+ describe WidgetsController do
12
+ render_views
13
+
14
+ describe "index" do
15
+ it "renders the index template" do
16
+ get :index
17
+ response.should render_template("index")
18
+ end
19
+
20
+ it "renders the widgets/index template" do
21
+ get :index
22
+ response.should render_template("widgets/index")
23
+ end
24
+ end
25
+ end
26
+ """
27
+ When I run "rspec ./spec"
28
+ Then I should see "2 examples, 0 failures"
29
+
30
+ Scenario: expect template that does not exist and is rendered by controller (passes)
31
+ Given a file named "spec/controllers/widgets_controller_spec.rb" with:
32
+ """
33
+ require "spec_helper.rb"
34
+
35
+ describe WidgetsController do
36
+ render_views
37
+
38
+ before do
39
+ def controller.index
40
+ render "other"
41
+ end
42
+ end
43
+
44
+ describe "index" do
45
+ it "renders the other template" do
46
+ get :index
47
+ response.should render_template("other")
48
+ end
49
+ end
50
+ end
51
+ """
52
+ When I run "rspec ./spec"
53
+ Then I should see "1 example, 1 failure"
@@ -0,0 +1,32 @@
1
+ Feature: errors_on
2
+
3
+ Scenario: with one validation error
4
+ Given a file named "spec/models/widget_spec.rb" with:
5
+ """
6
+ require "spec_helper"
7
+
8
+ class ValidatingWidget < ActiveRecord::Base
9
+ set_table_name :widgets
10
+ validates_presence_of :name
11
+ end
12
+
13
+ describe ValidatingWidget do
14
+ it "fails validation with no name (using error_on)" do
15
+ ValidatingWidget.new.should have(1).error_on(:name)
16
+ end
17
+
18
+ it "fails validation with no name (using errors_on)" do
19
+ ValidatingWidget.new.should have(1).errors_on(:name)
20
+ end
21
+
22
+ it "passes validation with a name (using 0)" do
23
+ ValidatingWidget.new(:name => "liquid nitrogen").should have(0).errors_on(:name)
24
+ end
25
+
26
+ it "passes validation with a name (using :no)" do
27
+ ValidatingWidget.new(:name => "liquid nitrogen").should have(:no).errors_on(:name)
28
+ end
29
+ end
30
+ """
31
+ When I run "rspec spec/models/widget_spec.rb"
32
+ Then I should see "4 examples, 0 failures"
@@ -28,7 +28,7 @@ Feature: transactional examples
28
28
  """
29
29
  require "spec_helper"
30
30
 
31
- Rspec.configure do |c|
31
+ RSpec.configure do |c|
32
32
  c.use_transactional_examples = true
33
33
  end
34
34
 
@@ -55,7 +55,7 @@ Feature: transactional examples
55
55
  """
56
56
  require "spec_helper"
57
57
 
58
- Rspec.configure do |c|
58
+ RSpec.configure do |c|
59
59
  c.use_transactional_examples = false
60
60
  end
61
61
 
@@ -2,7 +2,7 @@ Feature: view spec
2
2
 
3
3
  View specs live in spec/views and render view templates in isolation.
4
4
 
5
- Scenario: passing spec
5
+ Scenario: passing spec that renders the described view file
6
6
  Given a file named "spec/views/widgets/index.html.erb_spec.rb" with:
7
7
  """
8
8
  require "spec_helper"
@@ -51,3 +51,104 @@ Feature: view spec
51
51
  When I run "rspec spec/views"
52
52
  Then I should see "1 example, 0 failures"
53
53
 
54
+ Scenario: passing spec with explicit template rendering
55
+ Given a file named "spec/views/widgets/widget.html.erb_spec.rb" with:
56
+ """
57
+ require "spec_helper"
58
+
59
+ describe "rendering the widget template" do
60
+ it "displays the widget" do
61
+ assign(:widget, stub_model(Widget, :name => "slicer"))
62
+
63
+ render :template => "widgets/widget.html.erb"
64
+
65
+ response.should contain("slicer")
66
+ end
67
+ end
68
+ """
69
+ And a file named "app/views/widgets/widget.html.erb" with:
70
+ """
71
+ <h2><%= @widget.name %></h2>
72
+ """
73
+ When I run "rspec spec/views"
74
+ Then I should see "1 example, 0 failures"
75
+
76
+ Scenario: passing spec with rendering of locals in a partial
77
+ Given a file named "spec/views/widgets/_widget.html.erb_spec.rb" with:
78
+ """
79
+ require "spec_helper"
80
+
81
+ describe "rendering locals in a partial" do
82
+ it "displays the widget" do
83
+ widget = stub_model(Widget, :name => "slicer")
84
+
85
+ render :partial => "widgets/widget.html.erb", :locals => {:widget => widget}
86
+
87
+ response.should contain("slicer")
88
+ end
89
+ end
90
+ """
91
+ And a file named "app/views/widgets/_widget.html.erb" with:
92
+ """
93
+ <h3><%= widget.name %></h3>
94
+ """
95
+ When I run "rspec spec/views"
96
+ Then I should see "1 example, 0 failures"
97
+
98
+ Scenario: passing spec with rendering of locals in an implicit partial
99
+ Given a file named "spec/views/widgets/_widget.html.erb_spec.rb" with:
100
+ """
101
+ require "spec_helper"
102
+
103
+ describe "rendering locals in a partial" do
104
+ it "displays the widget" do
105
+ widget = stub_model(Widget, :name => "slicer")
106
+
107
+ render "widgets/widget", :widget => widget
108
+
109
+ response.should contain("slicer")
110
+ end
111
+ end
112
+ """
113
+ And a file named "app/views/widgets/_widget.html.erb" with:
114
+ """
115
+ <h3><%= widget.name %></h3>
116
+ """
117
+ When I run "rspec spec/views"
118
+ Then I should see "1 example, 0 failures"
119
+
120
+ Scenario: passing spec with rendering of text
121
+ Given a file named "spec/views/widgets/direct.html.erb_spec.rb" with:
122
+ """
123
+ require "spec_helper"
124
+
125
+ describe "rendering text directly" do
126
+ it "displays the given text" do
127
+
128
+ render :text => "This is directly rendered"
129
+
130
+ response.should contain("directly rendered")
131
+ end
132
+ end
133
+ """
134
+ When I run "rspec spec/views"
135
+ Then I should see "1 example, 0 failures"
136
+
137
+ Scenario: passing spec with rendering of Prototype helper update
138
+ Given a file named "spec/views/widgets/prototype_update.html.erb_spec.rb" with:
139
+ """
140
+ require "spec_helper"
141
+
142
+ describe "render a Prototype helper update" do
143
+ it "hides the status indicator" do
144
+
145
+ render :update do |page|
146
+ page.hide 'status-indicator'
147
+ end
148
+
149
+ response.should contain("Element.hide(\"status-indicator\")")
150
+ end
151
+ end
152
+ """
153
+ When I run "rspec spec/views"
154
+ Then I should see "1 example, 0 failures"