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 +0 -1
- data/.rspec +1 -0
- data/.travis.yml +3 -5
- data/README.md +2 -0
- data/Rakefile +16 -27
- data/features/.nav +2 -0
- data/features/Changelog.md +14 -1
- data/features/GettingStarted.md +45 -1
- data/features/controller_specs/controller_spec.feature +0 -1
- data/features/controller_specs/isolation_from_views.feature +47 -1
- data/features/request_specs/request_spec.feature +49 -0
- data/features/support/env.rb +0 -1
- data/features/view_specs/view_spec.feature +10 -10
- data/gemfiles/.bundle/config +2 -0
- data/gemfiles/base.rb +29 -16
- data/gemfiles/rails-3.0.7 +5 -0
- data/lib/generators/rspec/scaffold/templates/controller_spec.rb +74 -42
- data/lib/rspec/rails/browser_simulators.rb +5 -0
- data/lib/rspec/rails/example/controller_example_group.rb +6 -1
- data/lib/rspec/rails/example/helper_example_group.rb +4 -0
- data/lib/rspec/rails/example/mailer_example_group.rb +5 -1
- data/lib/rspec/rails/example/request_example_group.rb +1 -1
- data/lib/rspec/rails/example/view_example_group.rb +4 -0
- data/lib/rspec/rails/version.rb +1 -1
- data/lib/rspec/rails/view_rendering.rb +24 -8
- data/spec/spec_helper.rb +0 -22
- data/spec/support/matchers.rb +9 -0
- data/templates/generate_stuff.rb +7 -0
- metadata +27 -21
data/.gitignore
CHANGED
data/.rspec
CHANGED
@@ -0,0 +1 @@
|
|
1
|
+
--color
|
data/.travis.yml
CHANGED
data/README.md
CHANGED
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
|
+
"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
|
-
|
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 "
|
73
|
+
sh "rails new ./tmp/example_app"
|
87
74
|
bindir = File.expand_path("gemfiles/bin")
|
88
|
-
|
89
|
-
|
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
|
data/features/.nav
CHANGED
data/features/Changelog.md
CHANGED
@@ -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.
|
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)
|
data/features/GettingStarted.md
CHANGED
@@ -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.
|
@@ -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
|
data/features/support/env.rb
CHANGED
@@ -16,8 +16,8 @@ Feature: view spec
|
|
16
16
|
|
17
17
|
render
|
18
18
|
|
19
|
-
rendered.should
|
20
|
-
rendered.should
|
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
|
46
|
-
rendered.should
|
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
|
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
|
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
|
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
|
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
|
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
|
180
|
+
rendered.should =~ /Secret admin area/
|
181
181
|
end
|
182
182
|
end
|
183
183
|
"""
|
data/gemfiles/base.rb
CHANGED
@@ -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["
|
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
|
-
|
19
|
-
|
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
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
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
|
-
|
33
|
-
|
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
|
-
|
36
|
-
|
37
|
-
|
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
|
@@ -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
|
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
|
-
|
10
|
-
|
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
|
-
<%=
|
33
|
+
<%= file_name %> = <%= class_name %>.create! valid_attributes
|
17
34
|
get :index
|
18
|
-
assigns(:<%= table_name %>).should eq([<%=
|
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
|
-
<%=
|
26
|
-
get :show, :id =>
|
27
|
-
assigns(:<%= ns_file_name %>).should
|
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
|
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
|
-
<%=
|
42
|
-
get :edit, :id =>
|
43
|
-
assigns(:<%= ns_file_name %>).should
|
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
|
-
|
51
|
-
|
52
|
-
assigns(:<%= ns_file_name %>).should
|
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
|
-
|
57
|
-
|
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
|
-
|
65
|
-
|
66
|
-
|
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
|
-
|
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
|
-
<%=
|
81
|
-
|
82
|
-
|
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
|
-
<%=
|
87
|
-
put :update, :id =>
|
88
|
-
assigns(:<%= ns_file_name %>).should
|
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
|
-
<%=
|
93
|
-
put :update, :id =>
|
94
|
-
response.should redirect_to(<%=
|
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
|
-
<%=
|
101
|
-
|
102
|
-
|
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
|
-
<%=
|
107
|
-
|
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
|
-
<%=
|
116
|
-
|
117
|
-
|
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
|
-
<%=
|
122
|
-
delete :destroy, :id =>
|
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
|
@@ -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
|
data/lib/rspec/rails/version.rb
CHANGED
@@ -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
|
53
|
-
attr_reader :
|
52
|
+
class EmptyTemplatePathSetDecorator < ::ActionView::Resolver
|
53
|
+
attr_reader :original_path_set
|
54
54
|
|
55
|
-
def initialize(
|
56
|
-
@
|
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
|
-
|
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
|
-
@
|
78
|
-
controller.class.view_paths = ::ActionView::PathSet.new.push(@
|
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 = @
|
100
|
+
controller.class.view_paths = @_empty_view_path_set_delegator.original_path_set
|
85
101
|
end
|
86
102
|
end
|
87
103
|
end
|
data/spec/spec_helper.rb
CHANGED
@@ -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)
|
data/templates/generate_stuff.rb
CHANGED
@@ -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:
|
4
|
+
hash: 15424061
|
5
5
|
prerelease: 6
|
6
6
|
segments:
|
7
7
|
- 2
|
8
8
|
- 6
|
9
9
|
- 0
|
10
10
|
- rc
|
11
|
-
-
|
12
|
-
version: 2.6.0.
|
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-
|
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
|
-
|
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
|
-
|
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
|
-
|
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:
|
74
|
+
hash: 15424061
|
78
75
|
segments:
|
79
76
|
- 2
|
80
77
|
- 6
|
81
78
|
- 0
|
82
79
|
- rc
|
83
|
-
-
|
84
|
-
version: 2.6.0.
|
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.
|
274
|
+
rubygems_version: 1.6.2
|
271
275
|
signing_key:
|
272
276
|
specification_version: 3
|
273
|
-
summary: rspec-rails-2.6.0.
|
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
|