rspec-rails 2.6.0.rc2 → 2.6.0.rc4

Sign up to get free protection for your applications and to get access to all the features.
data/.gitignore CHANGED
@@ -2,7 +2,6 @@ tmp
2
2
  doc
3
3
  pkg
4
4
  vendor
5
- .bundle
6
5
  *.gem
7
6
  Gemfile
8
7
  Gemfile.lock
data/.rspec CHANGED
@@ -0,0 +1 @@
1
+ --color
@@ -1,11 +1,9 @@
1
- script: "rake"
1
+ script: "rake --trace 2>&1"
2
2
  rvm:
3
3
  - 1.8.7
4
- - 1.9.1
5
4
  - 1.9.2
6
5
  gemfile:
7
- - gemfiles/rails-3.0.6
6
+ - gemfiles/rails-3.0.7
8
7
  - gemfiles/rails-3-0-stable
9
- - gemfiles/rails-master
10
8
  env:
11
- - USE_GIT_REPOS=true
9
+ - CI=true
data/README.md CHANGED
@@ -2,6 +2,8 @@
2
2
 
3
3
  rspec-2 for rails-3 with lightweight extensions to each
4
4
 
5
+ [![build status](http://travis-ci.org/rspec/rspec-rails.png)](http://travis-ci.org/rspec/rspec-rails)
6
+
5
7
  NOTE: rspec-2 does _not_ support rails-2. Use rspec-rails-1.3.x for rails-2.
6
8
 
7
9
  ## Documentation
data/Rakefile CHANGED
@@ -1,42 +1,29 @@
1
- unless File.exist?("./.gemfile")
2
- warn <<-MESSAGE
3
- =============================================================================
4
- You must set the version of rails you want to run against. The simplest way
5
- to accomplish this is to install thor (if you don't already have it) and run:
6
-
7
- thor rails:use 3.0.6
8
-
9
- You can use any of the following versions/branches:
10
-
11
- 3.0.0 .. 3.0.6
12
- master
13
- 3-0-stable
14
-
15
- See the README_DEV.md file for more information.
16
- =============================================================================
17
-
18
- MESSAGE
19
- exit 1
20
- end
21
-
22
1
  require 'pathname'
23
2
  ENV["BUNDLE_GEMFILE"] ||= begin
24
3
  version = if File.exist?("./.gemfile")
25
4
  File.read("./.gemfile").chomp
26
5
  else
27
- "rails-3.0.6"
6
+ "rails-3.0.7"
28
7
  end
29
8
  File.expand_path("../gemfiles/#{version}", __FILE__)
30
9
  end
31
10
  puts "Using gemfile: #{ENV["BUNDLE_GEMFILE"].gsub(Pathname.new(__FILE__).dirname.to_s,'').sub(/^\//,'')}"
32
11
  require "bundler"
33
- Bundler.setup
12
+ begin
13
+ Bundler.setup
14
+ rescue
15
+ if ENV["CI"]
16
+ sh "bundle install"
17
+ Bundler.setup
18
+ else
19
+ raise "You need to install a bundle first. Try 'thor rails:use 3.0.7'"
20
+ end
21
+ end
34
22
  Bundler::GemHelper.install_tasks
35
23
 
36
24
  require 'rake'
37
25
  require 'yaml'
38
26
 
39
- require 'rake/rdoctask'
40
27
  require 'rspec'
41
28
  require 'rspec/core/rake_task'
42
29
 
@@ -83,10 +70,12 @@ namespace :generate do
83
70
  desc "generate a fresh app with rspec installed"
84
71
  task :app do |t|
85
72
  unless File.directory?('./tmp/example_app')
86
- sh "bin/rails new ./tmp/example_app"
73
+ sh "rails new ./tmp/example_app"
87
74
  bindir = File.expand_path("gemfiles/bin")
88
- Dir.chdir("./tmp/example_app") do
89
- sh "ln -s #{bindir}"
75
+ if test ?d, bindir
76
+ Dir.chdir("./tmp/example_app") do
77
+ sh "ln -s #{bindir}"
78
+ end
90
79
  end
91
80
  end
92
81
  end
@@ -4,6 +4,8 @@
4
4
  - Autotest.md (Autotest integration)
5
5
  - Changelog.md
6
6
  - Upgrade.md
7
+ - request_specs:
8
+ - request_spec.feature
7
9
  - model_specs:
8
10
  - errors_on.feature
9
11
  - controller_specs:
@@ -1,6 +1,19 @@
1
+ ### 2.6.0.rc4 / 2011-05-01
2
+
3
+ [full changelog](http://github.com/rspec/rspec-rails/compare/v2.6.0.rc2...v2.6.0.rc4)
4
+
5
+ * Enhancements
6
+ * Update the controller spec generated by the rails scaffold generator:
7
+ * Add documentation to the generated spec
8
+ * Use `any_instance` to avoid stubbing finders
9
+ * Use real objects instead of `mock_model`
10
+ * Update capybara integration to work with capy 0.4 and 1.0.0.beta
11
+ * Decorate paths passed to `[append|prepend]_view_paths` with empty templates
12
+ unless rendering views. (Mark Turner)
13
+
1
14
  ### 2.6.0.rc2 / 2011-04-18
2
15
 
3
- [full changelog](http://github.com/rspec/rspec-rails/compare/v2.5.0...v2.6.1.rc2)
16
+ [full changelog](http://github.com/rspec/rspec-rails/compare/v2.5.0...v2.6.0.rc2)
4
17
 
5
18
  * Enhancments
6
19
  * rails 3 shortcuts for routing specs (Joe Fiorini)
@@ -15,6 +15,10 @@ Install Rails-3
15
15
 
16
16
  $ bundle install
17
17
 
18
+ ### Bootstrap RSpec
19
+
20
+ $ rails generate rspec:install
21
+
18
22
  ### Generate a scaffold
19
23
 
20
24
  $ rails generate scaffold Widgets name:string
@@ -33,8 +37,48 @@ the files in the `spec` directory to RSpec.
33
37
 
34
38
  or
35
39
 
36
- $ rspec spec
40
+ $ rspec spec --format documentation
37
41
 
38
42
  If all went well, you should see output ending with:
39
43
 
40
44
  29 examples, 0 failures, 2 pending
45
+
46
+ This output also includes the following controller spec:
47
+
48
+ WidgetsController
49
+ GET index
50
+ assigns all widgets as @widgets
51
+ GET show
52
+ assigns the requested widget as @widget
53
+ GET new
54
+ assigns a new widget as @widget
55
+ GET edit
56
+ assigns the requested widget as @widget
57
+ POST create
58
+ with valid params
59
+ creates a new Widget
60
+ assigns a newly created widget as @widget
61
+ redirects to the created widget
62
+ with invalid params
63
+ assigns a newly created but unsaved widget as @widget
64
+ re-renders the 'new' template
65
+ PUT update
66
+ with valid params
67
+ updates the requested widget
68
+ assigns the requested widget as @widget
69
+ redirects to the widget
70
+ with invalid params
71
+ assigns the widget as @widget
72
+ re-renders the 'edit' template
73
+ DELETE destroy
74
+ destroys the requested widget
75
+ redirects to the widgets list
76
+
77
+ Output like this can help to quickly gain a high level understanding of how an
78
+ object behaves. It also exposes which cases have been specified and which have
79
+ not. Note the balance between the examples for the `create` and `update`
80
+ actions. If the `redirects to the widget` example was missing from one or the
81
+ other, it would be easy to spot.
82
+
83
+ Take a look at the generated `spec/controllers/widgets_controller_spec.rb` to
84
+ get a sense of how to organize your specs to generate output like this.
@@ -1,6 +1,5 @@
1
1
  Feature: controller spec
2
2
 
3
-
4
3
  Scenario: simple passing example
5
4
  Given a file named "spec/controllers/widgets_controller_spec.rb" with:
6
5
  """
@@ -5,7 +5,7 @@ Feature: views are stubbed by default
5
5
  template an action should try to render regardless of whether the template
6
6
  compiles cleanly.
7
7
 
8
- NOTE: unlike rspec-rails-1.x, the real template must exist.
8
+ NOTE: unlike rspec-rails-1.x, the real template must exist.
9
9
 
10
10
  Scenario: expect template that is rendered by controller action (passes)
11
11
  Given a file named "spec/controllers/widgets_controller_spec.rb" with:
@@ -47,3 +47,49 @@ Feature: views are stubbed by default
47
47
  When I run `rspec spec`
48
48
  Then the output should contain "1 example, 1 failure"
49
49
 
50
+ Scenario: expect empty templates to render when view path is changed at runtime (passes)
51
+ Given a file named "spec/controllers/things_controller_spec.rb" with:
52
+ """
53
+ require "spec_helper"
54
+
55
+ describe ThingsController do
56
+ describe "custom_action" do
57
+ it "renders an empty custom_action template" do
58
+ controller.prepend_view_path 'app/views'
59
+ controller.append_view_path 'app/views'
60
+ get :custom_action
61
+ response.should render_template("custom_action")
62
+ response.body.should == ""
63
+ end
64
+ end
65
+ end
66
+ """
67
+ When I run `rspec spec`
68
+ Then the examples should all pass
69
+
70
+ Scenario: expect template to render when view path is changed at runtime (fails)
71
+ Given a file named "spec/controllers/things_controller_spec.rb" with:
72
+ """
73
+ require "spec_helper"
74
+
75
+ describe ThingsController do
76
+ describe "custom_action" do
77
+ it "renders the custom_action template" do
78
+ render_views
79
+ controller.prepend_view_path 'app/views'
80
+ get :custom_action
81
+ response.should render_template("custom_action")
82
+ response.body.should == ""
83
+ end
84
+
85
+ it "renders an empty custom_action template" do
86
+ controller.prepend_view_path 'app/views'
87
+ get :custom_action
88
+ response.should render_template("custom_action")
89
+ response.body.should == ""
90
+ end
91
+ end
92
+ end
93
+ """
94
+ When I run `rspec spec`
95
+ Then the output should contain "2 examples, 1 failure"
@@ -0,0 +1,49 @@
1
+ Feature: request spec
2
+
3
+ Request specs provide a thin wrapper around Rails' integration tests, and are
4
+ designed to drive behavior through the full stack, including routing
5
+ (provided by Rails) and without stubbing (that's up to you).
6
+
7
+ With request specs, you can:
8
+
9
+ * specify a single request
10
+ * specify multiple requests across multiple controllers
11
+ * specify multiple requests across multiple sessions
12
+
13
+ Check the rails documentation on integration tests for more information.
14
+
15
+ RSpec provides two matchers that delegate to Rails assertions:
16
+
17
+ render_template # delegates to assert_template
18
+ redirect_to # delegates to assert_redirected_to
19
+
20
+ Check the Rails docs for details on these methods as well.
21
+
22
+ If you would like to use webrat or capybara with your request specs, all you
23
+ have to do is include one of them in your Gemfile and RSpec will
24
+ automatically load them in a request spec.
25
+
26
+ Scenario: specify managing a Widget with Rails integration methods
27
+ Given a file named "spec/requests/widget_management_spec.rb" with:
28
+ """
29
+ require "spec_helper"
30
+
31
+ describe "Widget management" do
32
+
33
+ it "creates a Widget and redirects to the Widget's page" do
34
+ get "/widgets/new"
35
+ response.should render_template(:new)
36
+
37
+ post "/widgets", :widget => {:name => "My Widget"}
38
+
39
+ response.should redirect_to(assigns(:widget))
40
+ follow_redirect!
41
+
42
+ response.should render_template(:show)
43
+ response.body.should include("Widget was successfully created.")
44
+ end
45
+
46
+ end
47
+ """
48
+ When I run `rspec spec/requests/widget_management_spec.rb`
49
+ Then the example should pass
@@ -1,5 +1,4 @@
1
1
  require 'aruba/cucumber'
2
- require 'webrat'
3
2
 
4
3
  module ArubaExt
5
4
  def run(cmd)
@@ -16,8 +16,8 @@ Feature: view spec
16
16
 
17
17
  render
18
18
 
19
- rendered.should contain("slicer")
20
- rendered.should contain("dicer")
19
+ rendered.should =~ /slicer/
20
+ rendered.should =~ /dicer/
21
21
  end
22
22
  end
23
23
  """
@@ -42,8 +42,8 @@ Feature: view spec
42
42
  it "displays both widgets" do
43
43
  render
44
44
 
45
- rendered.should contain("slicer")
46
- rendered.should contain("dicer")
45
+ rendered.should =~ /slicer/
46
+ rendered.should =~ /dicer/
47
47
  end
48
48
  end
49
49
  end
@@ -62,7 +62,7 @@ Feature: view spec
62
62
 
63
63
  render :template => "widgets/widget.html.erb"
64
64
 
65
- rendered.should contain("slicer")
65
+ rendered.should =~ /slicer/
66
66
  end
67
67
  end
68
68
  """
@@ -84,7 +84,7 @@ Feature: view spec
84
84
 
85
85
  render :partial => "widgets/widget.html.erb", :locals => {:widget => widget}
86
86
 
87
- rendered.should contain("slicer")
87
+ rendered.should =~ /slicer/
88
88
  end
89
89
  end
90
90
  """
@@ -106,7 +106,7 @@ Feature: view spec
106
106
 
107
107
  render "widgets/widget", :widget => widget
108
108
 
109
- rendered.should contain("slicer")
109
+ rendered.should =~ /slicer/
110
110
  end
111
111
  end
112
112
  """
@@ -127,7 +127,7 @@ Feature: view spec
127
127
 
128
128
  render :text => "This is directly rendered"
129
129
 
130
- rendered.should contain("directly rendered")
130
+ rendered.should =~ /directly rendered/
131
131
  end
132
132
  end
133
133
  """
@@ -146,7 +146,7 @@ Feature: view spec
146
146
  page.hide 'status-indicator'
147
147
  end
148
148
 
149
- rendered.should contain("Element.hide(\"status-indicator\")")
149
+ rendered.should =~ /Element.hide\(\"status-indicator\"\);/
150
150
  end
151
151
  end
152
152
  """
@@ -177,7 +177,7 @@ Feature: view spec
177
177
 
178
178
  it 'checks for admin access' do
179
179
  render
180
- rendered.should contain('Secret admin area')
180
+ rendered.should =~ /Secret admin area/
181
181
  end
182
182
  end
183
183
  """
@@ -0,0 +1,2 @@
1
+ ---
2
+ BUNDLE_BIN: bin
@@ -7,7 +7,7 @@ module GemfileBase
7
7
  library_path = File.expand_path("../../../#{lib}", __FILE__)
8
8
  if File.exist?(library_path)
9
9
  gem lib, :path => library_path
10
- elsif ENV["USE_GIT_REPOS"] == 'true'
10
+ elsif ENV["CI"] || ENV["USE_GIT_REPOS"]
11
11
  gem lib, :git => "git://github.com/rspec/#{lib}.git"
12
12
  else
13
13
  gem lib
@@ -15,26 +15,39 @@ module GemfileBase
15
15
  end
16
16
 
17
17
  gem 'sqlite3-ruby', :require => 'sqlite3'
18
- # gem "cucumber", "~> 0.10.2"
19
- # gem "aruba", :git => "git://github.com/aslakhellesoy/aruba"
20
- gem "rcov", "0.9.9"
21
- gem "relish", "0.2.0"
22
- gem "guard-rspec", "0.1.9"
18
+ gem "cucumber", "~> 0.10.2"
19
+ gem "aruba", "~> 0.3.6"
23
20
  gem "growl", "1.0.3"
24
21
  gem "ZenTest", "~> 4.4.2"
25
- gem "webrat", "0.7.2"
26
22
 
27
- if RUBY_PLATFORM =~ /darwin/
28
- gem "autotest-fsevent", "~> 0.2.4"
29
- gem "autotest-growl", "~> 0.2.9"
30
- end
23
+ # gem "webrat", "0.7.2"
24
+ # gem "capybara", "~> 0.4"
25
+ # gem "capybara", "1.0.0.beta1"
26
+
27
+ unless ENV['CI']
28
+ gem "rcov", "0.9.9"
29
+ gem "relish", "0.2.0"
30
+ gem "guard-rspec", "0.1.9"
31
+
32
+ if RUBY_PLATFORM =~ /darwin/
33
+ gem "autotest-fsevent", "~> 0.2.4"
34
+ gem "autotest-growl", "~> 0.2.9"
35
+ end
31
36
 
32
- gem "ruby-debug", :platforms => :ruby_18
33
- gem "ruby-debug19", "~> 0.11.6", :platforms => :ruby_19
37
+ platforms :mri_18 do
38
+ gem 'ruby-debug'
39
+ end
40
+
41
+ platforms :mri_19 do
42
+ gem 'linecache19', '0.5.11' # 0.5.12 cannot install on 1.9.1, and 0.5.11 appears to work with both 1.9.1 & 1.9.2
43
+ gem 'ruby-debug19'
44
+ gem 'ruby-debug-base19', RUBY_VERSION == '1.9.1' ? '0.11.23' : '~> 0.11.24'
45
+ end
34
46
 
35
- platforms :ruby_18, :ruby_19 do
36
- gem "rb-fsevent", "~> 0.3.9"
37
- gem "ruby-prof", "~> 0.9.2"
47
+ platforms :ruby_18, :ruby_19 do
48
+ gem "rb-fsevent", "~> 0.3.9"
49
+ gem "ruby-prof", "~> 0.9.2"
50
+ end
38
51
  end
39
52
 
40
53
  platforms :jruby do
@@ -0,0 +1,5 @@
1
+ require File.expand_path("../base.rb", __FILE__)
2
+
3
+ extend GemfileBase
4
+
5
+ gem "rails", "3.0.7"
@@ -2,72 +2,95 @@ require 'spec_helper'
2
2
 
3
3
  # This spec was generated by rspec-rails when you ran the scaffold generator.
4
4
  # It demonstrates how one might use RSpec to specify the controller code that
5
- # was generated by the Rails when you ran the scaffold generator.
5
+ # was generated by Rails when you ran the scaffold generator.
6
+ #
7
+ # It assumes that the implementation code is generated by the rails scaffold
8
+ # generator. If you are using any extension libraries to generate different
9
+ # controller code, this generated spec may or may not pass.
10
+ #
11
+ # It only uses APIs available in rails and/or rspec-rails. There are a number
12
+ # of tools you can use to make these specs even more expressive, but we're
13
+ # sticking to rails and rspec-rails APIs to keep things simple and stable.
14
+ #
15
+ # Compared to earlier versions of this generator, there is very limited use of
16
+ # stubs and message expectations in this spec. Stubs are only used when there
17
+ # is no simpler way to get a handle on the object needed for the example.
18
+ # Message expectations are only used when there is no simpler way to specify
19
+ # that an instance is receiving a specific message.
6
20
 
7
21
  describe <%= controller_class_name %>Controller do
8
22
 
9
- def <%= mock_file_name %>(stubs={})
10
- @<%= mock_file_name %> ||= mock_model(<%= class_name %>, stubs).as_null_object
23
+ # This should return the minimal set of attributes required to create a valid
24
+ # <%= class_name %>. As you add validations to <%= class_name %>, be sure to
25
+ # update the return value of this method accordingly.
26
+ def valid_attributes
27
+ {}
11
28
  end
12
29
 
13
30
  <% unless options[:singleton] -%>
14
31
  describe "GET index" do
15
32
  it "assigns all <%= table_name.pluralize %> as @<%= table_name.pluralize %>" do
16
- <%= stub orm_class.all(class_name) %> { [<%= mock_file_name %>] }
33
+ <%= file_name %> = <%= class_name %>.create! valid_attributes
17
34
  get :index
18
- assigns(:<%= table_name %>).should eq([<%= mock_file_name %>])
35
+ assigns(:<%= table_name %>).should eq([<%= file_name %>])
19
36
  end
20
37
  end
21
38
 
22
39
  <% end -%>
23
40
  describe "GET show" do
24
41
  it "assigns the requested <%= ns_file_name %> as @<%= ns_file_name %>" do
25
- <%= stub orm_class.find(class_name, "37".inspect) %> { <%= mock_file_name %> }
26
- get :show, :id => "37"
27
- assigns(:<%= ns_file_name %>).should be(<%= mock_file_name %>)
42
+ <%= file_name %> = <%= class_name %>.create! valid_attributes
43
+ get :show, :id => <%= file_name %>.id.to_s
44
+ assigns(:<%= ns_file_name %>).should eq(<%= file_name %>)
28
45
  end
29
46
  end
30
47
 
31
48
  describe "GET new" do
32
49
  it "assigns a new <%= ns_file_name %> as @<%= ns_file_name %>" do
33
- <%= stub orm_class.build(class_name) %> { <%= mock_file_name %> }
34
50
  get :new
35
- assigns(:<%= ns_file_name %>).should be(<%= mock_file_name %>)
51
+ assigns(:<%= ns_file_name %>).should be_a_new(<%= class_name %>)
36
52
  end
37
53
  end
38
54
 
39
55
  describe "GET edit" do
40
56
  it "assigns the requested <%= ns_file_name %> as @<%= ns_file_name %>" do
41
- <%= stub orm_class.find(class_name, "37".inspect) %> { <%= mock_file_name %> }
42
- get :edit, :id => "37"
43
- assigns(:<%= ns_file_name %>).should be(<%= mock_file_name %>)
57
+ <%= file_name %> = <%= class_name %>.create! valid_attributes
58
+ get :edit, :id => <%= file_name %>.id.to_s
59
+ assigns(:<%= ns_file_name %>).should eq(<%= file_name %>)
44
60
  end
45
61
  end
46
62
 
47
63
  describe "POST create" do
48
64
  describe "with valid params" do
65
+ it "creates a new <%= class_name %>" do
66
+ expect {
67
+ post :create, :<%= ns_file_name %> => valid_attributes
68
+ }.to change(<%= class_name %>, :count).by(1)
69
+ end
70
+
49
71
  it "assigns a newly created <%= ns_file_name %> as @<%= ns_file_name %>" do
50
- <%= stub orm_class.build(class_name, params) %> { <%= mock_file_name(:save => true) %> }
51
- post :create, :<%= ns_file_name %> => <%= params %>
52
- assigns(:<%= ns_file_name %>).should be(<%= mock_file_name %>)
72
+ post :create, :<%= ns_file_name %> => valid_attributes
73
+ assigns(:<%= ns_file_name %>).should be_a(<%= class_name %>)
74
+ assigns(:<%= ns_file_name %>).should be_persisted
53
75
  end
54
76
 
55
77
  it "redirects to the created <%= ns_file_name %>" do
56
- <%= stub orm_class.build(class_name) %> { <%= mock_file_name(:save => true) %> }
57
- post :create, :<%= ns_file_name %> => {}
58
- response.should redirect_to(<%= table_name.singularize %>_url(<%= mock_file_name %>))
78
+ post :create, :<%= ns_file_name %> => valid_attributes
79
+ response.should redirect_to(<%= class_name %>.last)
59
80
  end
60
81
  end
61
82
 
62
83
  describe "with invalid params" do
63
84
  it "assigns a newly created but unsaved <%= ns_file_name %> as @<%= ns_file_name %>" do
64
- <%= stub orm_class.build(class_name, params) %> { <%= mock_file_name(:save => false) %> }
65
- post :create, :<%= ns_file_name %> => <%= params %>
66
- assigns(:<%= ns_file_name %>).should be(<%= mock_file_name %>)
85
+ # Trigger the behavior that occurs when invalid params are submitted
86
+ <%= class_name %>.any_instance.stub(:save).and_return(false)
87
+ post :create, :<%= ns_file_name %> => {}
88
+ assigns(:<%= ns_file_name %>).should be_a_new(<%= class_name %>)
67
89
  end
68
90
 
69
91
  it "re-renders the 'new' template" do
70
- <%= stub orm_class.build(class_name) %> { <%= mock_file_name(:save => false) %> }
92
+ # Trigger the behavior that occurs when invalid params are submitted
93
+ <%= class_name %>.any_instance.stub(:save).and_return(false)
71
94
  post :create, :<%= ns_file_name %> => {}
72
95
  response.should render_template("new")
73
96
  end
@@ -77,34 +100,42 @@ describe <%= controller_class_name %>Controller do
77
100
  describe "PUT update" do
78
101
  describe "with valid params" do
79
102
  it "updates the requested <%= ns_file_name %>" do
80
- <%= stub orm_class.find(class_name, "37".inspect) %> { <%= mock_file_name %> }
81
- mock_<%= should_receive orm_instance.update_attributes(params) %>
82
- put :update, :id => "37", :<%= ns_file_name %> => <%= params %>
103
+ <%= file_name %> = <%= class_name %>.create! valid_attributes
104
+ # Assuming there are no other <%= table_name %> in the database, this
105
+ # specifies that the <%= class_name %> created on the previous line
106
+ # receives the :update_attributes message with whatever params are
107
+ # submitted in the request.
108
+ <%= class_name %>.any_instance.should_receive(:update_attributes).with(<%= params %>)
109
+ put :update, :id => <%= file_name %>.id, :<%= ns_file_name %> => <%= params %>
83
110
  end
84
111
 
85
112
  it "assigns the requested <%= ns_file_name %> as @<%= ns_file_name %>" do
86
- <%= stub orm_class.find(class_name) %> { <%= mock_file_name(:update_attributes => true) %> }
87
- put :update, :id => "1"
88
- assigns(:<%= ns_file_name %>).should be(<%= mock_file_name %>)
113
+ <%= file_name %> = <%= class_name %>.create! valid_attributes
114
+ put :update, :id => <%= file_name %>.id, :<%= ns_file_name %> => valid_attributes
115
+ assigns(:<%= ns_file_name %>).should eq(<%= file_name %>)
89
116
  end
90
117
 
91
118
  it "redirects to the <%= ns_file_name %>" do
92
- <%= stub orm_class.find(class_name) %> { <%= mock_file_name(:update_attributes => true) %> }
93
- put :update, :id => "1"
94
- response.should redirect_to(<%= table_name.singularize %>_url(<%= mock_file_name %>))
119
+ <%= file_name %> = <%= class_name %>.create! valid_attributes
120
+ put :update, :id => <%= file_name %>.id, :<%= ns_file_name %> => valid_attributes
121
+ response.should redirect_to(<%= file_name %>)
95
122
  end
96
123
  end
97
124
 
98
125
  describe "with invalid params" do
99
126
  it "assigns the <%= ns_file_name %> as @<%= ns_file_name %>" do
100
- <%= stub orm_class.find(class_name) %> { <%= mock_file_name(:update_attributes => false) %> }
101
- put :update, :id => "1"
102
- assigns(:<%= ns_file_name %>).should be(<%= mock_file_name %>)
127
+ <%= file_name %> = <%= class_name %>.create! valid_attributes
128
+ # Trigger the behavior that occurs when invalid params are submitted
129
+ <%= class_name %>.any_instance.stub(:save).and_return(false)
130
+ put :update, :id => <%= file_name %>.id.to_s
131
+ assigns(:<%= ns_file_name %>).should eq(<%= file_name %>)
103
132
  end
104
133
 
105
134
  it "re-renders the 'edit' template" do
106
- <%= stub orm_class.find(class_name) %> { <%= mock_file_name(:update_attributes => false) %> }
107
- put :update, :id => "1"
135
+ <%= file_name %> = <%= class_name %>.create! valid_attributes
136
+ # Trigger the behavior that occurs when invalid params are submitted
137
+ <%= class_name %>.any_instance.stub(:save).and_return(false)
138
+ put :update, :id => <%= file_name %>.id.to_s
108
139
  response.should render_template("edit")
109
140
  end
110
141
  end
@@ -112,14 +143,15 @@ describe <%= controller_class_name %>Controller do
112
143
 
113
144
  describe "DELETE destroy" do
114
145
  it "destroys the requested <%= ns_file_name %>" do
115
- <%= stub orm_class.find(class_name, "37".inspect) %> { <%= mock_file_name %> }
116
- mock_<%= should_receive orm_instance.destroy %>
117
- delete :destroy, :id => "37"
146
+ <%= file_name %> = <%= class_name %>.create! valid_attributes
147
+ expect {
148
+ delete :destroy, :id => <%= file_name %>.id.to_s
149
+ }.to change(<%= class_name %>, :count).by(-1)
118
150
  end
119
151
 
120
152
  it "redirects to the <%= table_name %> list" do
121
- <%= stub orm_class.find(class_name) %> { <%= mock_file_name %> }
122
- delete :destroy, :id => "1"
153
+ <%= file_name %> = <%= class_name %>.create! valid_attributes
154
+ delete :destroy, :id => <%= file_name %>.id.to_s
123
155
  response.should redirect_to(<%= index_helper %>_url)
124
156
  end
125
157
  end
@@ -1,3 +1,8 @@
1
+ begin
2
+ require 'capybara/rspec'
3
+ rescue LoadError
4
+ end
5
+
1
6
  begin
2
7
  require 'capybara/rails'
3
8
  rescue LoadError
@@ -90,7 +90,12 @@ module RSpec::Rails
90
90
  end
91
91
 
92
92
  capybara do
93
- include Capybara
93
+ begin
94
+ include Capybara::DSL
95
+ include Capybara::RSpecMatchers
96
+ rescue
97
+ include Capybara
98
+ end
94
99
  end
95
100
 
96
101
  module ClassMethods
@@ -36,6 +36,10 @@ module RSpec::Rails
36
36
  include Webrat::Matchers
37
37
  end
38
38
 
39
+ capybara do
40
+ include Capybara::RSpecMatchers if defined?(Capybara::RSpecMatchers)
41
+ end
42
+
39
43
  module ClassMethods
40
44
  def determine_default_helper_class(ignore)
41
45
  describes
@@ -11,7 +11,11 @@ if defined?(ActionMailer)
11
11
  end
12
12
 
13
13
  capybara do
14
- include Capybara
14
+ begin
15
+ include Capybara::RSpecMatchers
16
+ rescue
17
+ include Capybara
18
+ end
15
19
  end
16
20
 
17
21
  included do
@@ -37,7 +37,7 @@ module RSpec::Rails
37
37
  end
38
38
 
39
39
  capybara do
40
- include Capybara
40
+ include Capybara unless defined?(Capybara::DSL)
41
41
  end
42
42
 
43
43
  include RSpec::Rails::Matchers::RedirectTo
@@ -29,6 +29,10 @@ module RSpec::Rails
29
29
  include Webrat::Matchers
30
30
  end
31
31
 
32
+ capybara do
33
+ include Capybara::RSpecMatchers if defined?(Capybara::RSpecMatchers)
34
+ end
35
+
32
36
  module ClassMethods
33
37
  def _default_helper
34
38
  base = metadata[:example_group][:description].split('/').first
@@ -1,7 +1,7 @@
1
1
  module RSpec # :nodoc:
2
2
  module Rails # :nodoc:
3
3
  module Version # :nodoc:
4
- STRING = '2.6.0.rc2'
4
+ STRING = '2.6.0.rc4'
5
5
  end
6
6
  end
7
7
  end
@@ -49,15 +49,15 @@ module RSpec
49
49
 
50
50
  # Delegates find_all to the submitted path set and then returns templates
51
51
  # with modified source
52
- class PathSetDelegatorResolver < ::ActionView::Resolver
53
- attr_reader :path_set
52
+ class EmptyTemplatePathSetDecorator < ::ActionView::Resolver
53
+ attr_reader :original_path_set
54
54
 
55
- def initialize(path_set)
56
- @path_set = path_set
55
+ def initialize(original_path_set)
56
+ @original_path_set = original_path_set
57
57
  end
58
58
 
59
59
  def find_all(*args)
60
- path_set.find_all(*args).collect do |template|
60
+ original_path_set.find_all(*args).collect do |template|
61
61
  ::ActionView::Template.new(
62
62
  "",
63
63
  template.identifier,
@@ -71,17 +71,33 @@ module RSpec
71
71
  end
72
72
  end
73
73
 
74
+ module EmptyTemplates
75
+ def prepend_view_path(new_path)
76
+ lookup_context.view_paths.unshift(*_path_decorator(new_path))
77
+ end
78
+
79
+ def append_view_path(new_path)
80
+ lookup_context.view_paths.push(*_path_decorator(new_path))
81
+ end
82
+
83
+ private
84
+ def _path_decorator(path)
85
+ EmptyTemplatePathSetDecorator.new(::ActionView::Base::process_view_paths(path))
86
+ end
87
+ end
88
+
74
89
  included do
75
90
  before do
76
91
  unless render_views?
77
- @_path_set_delegator_resolver = PathSetDelegatorResolver.new(controller.class.view_paths)
78
- controller.class.view_paths = ::ActionView::PathSet.new.push(@_path_set_delegator_resolver)
92
+ @_empty_view_path_set_delegator = EmptyTemplatePathSetDecorator.new(controller.class.view_paths)
93
+ controller.class.view_paths = ::ActionView::PathSet.new.push(@_empty_view_path_set_delegator)
94
+ controller.extend(EmptyTemplates)
79
95
  end
80
96
  end
81
97
 
82
98
  after do
83
99
  unless render_views?
84
- controller.class.view_paths = @_path_set_delegator_resolver.path_set
100
+ controller.class.view_paths = @_empty_view_path_set_delegator.original_path_set
85
101
  end
86
102
  end
87
103
  end
@@ -9,35 +9,13 @@ require 'rspec/rails'
9
9
 
10
10
  Dir["#{File.dirname(__FILE__)}/support/**/*.rb"].each {|f| require f}
11
11
 
12
- # TODO - most of this is borrowed from rspec-core's spec_helper - should
13
- # be extracted to something we can use here
14
- def in_editor?
15
- ENV.has_key?('TM_MODE') || ENV.has_key?('EMACS') || ENV.has_key?('VIM')
16
- end
17
-
18
12
  class RSpec::Core::ExampleGroup
19
13
  def self.run_all(reporter=nil)
20
14
  run(reporter || RSpec::Mocks::Mock.new('reporter').as_null_object)
21
15
  end
22
16
  end
23
17
 
24
- module MatchesForRSpecRailsSpecs
25
- extend RSpec::Matchers::DSL
26
-
27
- matcher :be_included_in_files_in do |path|
28
- match do |mod|
29
- stub_metadata(
30
- :example_group => {:file_path => "#{path}whatever_spec.rb:15"}
31
- )
32
- group = RSpec::Core::ExampleGroup.describe
33
- group.included_modules.include?(mod)
34
- end
35
- end
36
- end
37
-
38
18
  RSpec.configure do |c|
39
- c.include MatchesForRSpecRailsSpecs
40
- c.color_enabled = !in_editor?
41
19
  c.before(:each) do
42
20
  @real_world = RSpec.world
43
21
  RSpec.instance_variable_set(:@world, RSpec::Core::World.new)
@@ -0,0 +1,9 @@
1
+ RSpec::Matchers::define :be_included_in_files_in do |path|
2
+ match do |mod|
3
+ stub_metadata(
4
+ :example_group => {:file_path => "#{path}whatever_spec.rb:15"}
5
+ )
6
+ group = RSpec::Core::ExampleGroup.describe
7
+ group.included_modules.include?(mod)
8
+ end
9
+ end
@@ -10,5 +10,12 @@ generate('observer widget')
10
10
  generate('scaffold gadget') # scaffold with no attributes
11
11
  generate('scaffold admin/accounts name:string') # scaffold with nested resource
12
12
 
13
+ generate('controller things custom_action')
14
+ template_code= <<-TEMPLATE
15
+ <% raise 'Error from custom_action because we should never render this template....derp derp derp' %>
16
+ TEMPLATE
17
+
18
+ file "app/views/things/custom_action.html.erb", template_code, {:force=>true}
19
+
13
20
  run('rake db:migrate')
14
21
  run('rake db:test:prepare')
metadata CHANGED
@@ -1,15 +1,15 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rspec-rails
3
3
  version: !ruby/object:Gem::Version
4
- hash: 15424049
4
+ hash: 15424061
5
5
  prerelease: 6
6
6
  segments:
7
7
  - 2
8
8
  - 6
9
9
  - 0
10
10
  - rc
11
- - 2
12
- version: 2.6.0.rc2
11
+ - 4
12
+ version: 2.6.0.rc4
13
13
  platform: ruby
14
14
  authors:
15
15
  - David Chelimsky
@@ -17,13 +17,10 @@ autorequire:
17
17
  bindir: bin
18
18
  cert_chain: []
19
19
 
20
- date: 2011-04-18 00:00:00 -05:00
20
+ date: 2011-05-01 00:00:00 -04:00
21
21
  default_executable:
22
22
  dependencies:
23
23
  - !ruby/object:Gem::Dependency
24
- prerelease: false
25
- type: :runtime
26
- name: activesupport
27
24
  version_requirements: &id001 !ruby/object:Gem::Requirement
28
25
  none: false
29
26
  requirements:
@@ -34,11 +31,11 @@ dependencies:
34
31
  - 3
35
32
  - 0
36
33
  version: "3.0"
37
- requirement: *id001
38
- - !ruby/object:Gem::Dependency
39
34
  prerelease: false
40
35
  type: :runtime
41
- name: actionpack
36
+ requirement: *id001
37
+ name: activesupport
38
+ - !ruby/object:Gem::Dependency
42
39
  version_requirements: &id002 !ruby/object:Gem::Requirement
43
40
  none: false
44
41
  requirements:
@@ -49,11 +46,11 @@ dependencies:
49
46
  - 3
50
47
  - 0
51
48
  version: "3.0"
52
- requirement: *id002
53
- - !ruby/object:Gem::Dependency
54
49
  prerelease: false
55
50
  type: :runtime
56
- name: railties
51
+ requirement: *id002
52
+ name: actionpack
53
+ - !ruby/object:Gem::Dependency
57
54
  version_requirements: &id003 !ruby/object:Gem::Requirement
58
55
  none: false
59
56
  requirements:
@@ -64,25 +61,28 @@ dependencies:
64
61
  - 3
65
62
  - 0
66
63
  version: "3.0"
67
- requirement: *id003
68
- - !ruby/object:Gem::Dependency
69
64
  prerelease: false
70
65
  type: :runtime
71
- name: rspec
66
+ requirement: *id003
67
+ name: railties
68
+ - !ruby/object:Gem::Dependency
72
69
  version_requirements: &id004 !ruby/object:Gem::Requirement
73
70
  none: false
74
71
  requirements:
75
72
  - - "="
76
73
  - !ruby/object:Gem::Version
77
- hash: 15424049
74
+ hash: 15424061
78
75
  segments:
79
76
  - 2
80
77
  - 6
81
78
  - 0
82
79
  - rc
83
- - 2
84
- version: 2.6.0.rc2
80
+ - 4
81
+ version: 2.6.0.rc4
82
+ prerelease: false
83
+ type: :runtime
85
84
  requirement: *id004
85
+ name: rspec
86
86
  description: RSpec-2 for Rails-3
87
87
  email: dchelimsky@gmail.com
88
88
  executables: []
@@ -127,6 +127,7 @@ files:
127
127
  - features/model_specs/README.md
128
128
  - features/model_specs/errors_on.feature
129
129
  - features/model_specs/transactional_examples.feature
130
+ - features/request_specs/request_spec.feature
130
131
  - features/routing_specs/README.md
131
132
  - features/routing_specs/be_routable_matcher.feature
132
133
  - features/routing_specs/named_routes.feature
@@ -137,6 +138,7 @@ files:
137
138
  - features/view_specs/inferred_controller_path.feature
138
139
  - features/view_specs/stub_template.feature
139
140
  - features/view_specs/view_spec.feature
141
+ - gemfiles/.bundle/config
140
142
  - gemfiles/base.rb
141
143
  - gemfiles/rails-3-0-stable
142
144
  - gemfiles/rails-3.0.0
@@ -146,6 +148,7 @@ files:
146
148
  - gemfiles/rails-3.0.4
147
149
  - gemfiles/rails-3.0.5
148
150
  - gemfiles/rails-3.0.6
151
+ - gemfiles/rails-3.0.7
149
152
  - gemfiles/rails-master
150
153
  - lib/autotest/rails_rspec2.rb
151
154
  - lib/generators/rspec.rb
@@ -233,6 +236,7 @@ files:
233
236
  - spec/rspec/rails/view_rendering_spec.rb
234
237
  - spec/spec_helper.rb
235
238
  - spec/support/helpers.rb
239
+ - spec/support/matchers.rb
236
240
  - templates/generate_stuff.rb
237
241
  - templates/run_specs.rb
238
242
  has_rdoc: true
@@ -267,10 +271,10 @@ required_rubygems_version: !ruby/object:Gem::Requirement
267
271
  requirements: []
268
272
 
269
273
  rubyforge_project: rspec
270
- rubygems_version: 1.5.2
274
+ rubygems_version: 1.6.2
271
275
  signing_key:
272
276
  specification_version: 3
273
- summary: rspec-rails-2.6.0.rc2
277
+ summary: rspec-rails-2.6.0.rc4
274
278
  test_files:
275
279
  - features/Autotest.md
276
280
  - features/Changelog.md
@@ -294,6 +298,7 @@ test_files:
294
298
  - features/model_specs/README.md
295
299
  - features/model_specs/errors_on.feature
296
300
  - features/model_specs/transactional_examples.feature
301
+ - features/request_specs/request_spec.feature
297
302
  - features/routing_specs/README.md
298
303
  - features/routing_specs/be_routable_matcher.feature
299
304
  - features/routing_specs/named_routes.feature
@@ -331,3 +336,4 @@ test_files:
331
336
  - spec/rspec/rails/view_rendering_spec.rb
332
337
  - spec/spec_helper.rb
333
338
  - spec/support/helpers.rb
339
+ - spec/support/matchers.rb