rspec-rails 2.13.0 → 2.13.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/Capybara.md +1 -3
- data/Changelog.md +14 -0
- data/README.md +46 -16
- data/features/Transactions.md +2 -2
- data/features/Upgrade.md +4 -0
- data/features/controller_specs/Cookies.md +1 -1
- data/features/controller_specs/README.md +9 -9
- data/features/controller_specs/controller_spec.feature +1 -1
- data/features/controller_specs/engine_routes.feature +51 -0
- data/features/helper_specs/helper_spec.feature +26 -0
- data/features/matchers/README.md +3 -3
- data/features/model_specs/errors_on.feature +1 -1
- data/features/routing_specs/README.md +6 -7
- data/features/routing_specs/engine_routes.feature +38 -0
- data/features/support/rails_versions.rb +4 -0
- data/lib/generators/rspec.rb +2 -1
- data/lib/generators/rspec/controller/controller_generator.rb +1 -1
- data/lib/generators/rspec/install/install_generator.rb +2 -0
- data/lib/generators/rspec/install/templates/spec/spec_helper.rb.tt +2 -2
- data/lib/generators/rspec/scaffold/scaffold_generator.rb +1 -1
- data/lib/generators/rspec/scaffold/templates/controller_spec.rb +4 -8
- data/lib/rspec/rails.rb +1 -0
- data/lib/rspec/rails/adapters.rb +30 -1
- data/lib/rspec/rails/example/controller_example_group.rb +43 -6
- data/lib/rspec/rails/example/rails_example_group.rb +2 -0
- data/lib/rspec/rails/example/routing_example_group.rb +28 -2
- data/lib/rspec/rails/example/view_example_group.rb +1 -1
- data/lib/rspec/rails/fixture_support.rb +1 -0
- data/lib/rspec/rails/matchers/routing_matchers.rb +1 -1
- data/lib/rspec/rails/mocks.rb +1 -1
- data/lib/rspec/rails/rails_version.rb +17 -0
- data/lib/rspec/rails/tasks/rspec.rake +8 -6
- data/lib/rspec/rails/version.rb +1 -1
- data/spec/generators/rspec/controller/controller_generator_spec.rb +11 -0
- data/spec/generators/rspec/install/install_generator_spec.rb +1 -1
- data/spec/generators/rspec/scaffold/scaffold_generator_spec.rb +23 -0
- data/spec/rspec/rails/assertion_delegator_spec.rb +13 -0
- data/spec/rspec/rails/example/view_example_group_spec.rb +1 -1
- data/spec/rspec/rails/matchers/have_rendered_spec.rb +3 -3
- data/spec/rspec/rails/matchers/relation_match_array_spec.rb +1 -1
- data/spec/rspec/rails/matchers/route_to_spec.rb +9 -10
- data/spec/rspec/rails/minitest_lifecycle_adapter_spec.rb +22 -0
- data/spec/rspec/rails/rails_version_spec.rb +29 -0
- data/spec/support/null_object.rb +6 -0
- metadata +67 -86
@@ -6,9 +6,9 @@ require 'rspec/autorun'
|
|
6
6
|
|
7
7
|
# Requires supporting ruby files with custom matchers and macros, etc,
|
8
8
|
# in spec/support/ and its subdirectories.
|
9
|
-
Dir[Rails.root.join("spec/support/**/*.rb")].each {|f| require f}
|
9
|
+
Dir[Rails.root.join("spec/support/**/*.rb")].each { |f| require f }
|
10
10
|
|
11
|
-
<% if ::Rails.
|
11
|
+
<% if RSpec::Rails.rails_version_satisfied_by?('>= 4.0.0.beta1') -%>
|
12
12
|
# Checks for pending migrations before tests are run.
|
13
13
|
# If you are not using ActiveRecord, you can remove this line.
|
14
14
|
ActiveRecord::Migration.check_pending! if defined?(ActiveRecord::Migration)
|
@@ -23,17 +23,13 @@ describe <%= controller_class_name %>Controller do
|
|
23
23
|
|
24
24
|
# This should return the minimal set of attributes required to create a valid
|
25
25
|
# <%= class_name %>. As you add validations to <%= class_name %>, be sure to
|
26
|
-
#
|
27
|
-
|
28
|
-
<%= formatted_hash(example_valid_attributes) %>
|
29
|
-
end
|
26
|
+
# adjust the attributes here as well.
|
27
|
+
let(:valid_attributes) { <%= formatted_hash(example_valid_attributes) %> }
|
30
28
|
|
31
29
|
# This should return the minimal set of values that should be in the session
|
32
30
|
# in order to pass any filters (e.g. authentication) defined in
|
33
31
|
# <%= controller_class_name %>Controller. Be sure to keep this updated too.
|
34
|
-
|
35
|
-
{}
|
36
|
-
end
|
32
|
+
let(:valid_session) { {} }
|
37
33
|
|
38
34
|
<% unless options[:singleton] -%>
|
39
35
|
describe "GET index" do
|
@@ -113,7 +109,7 @@ describe <%= controller_class_name %>Controller do
|
|
113
109
|
# specifies that the <%= class_name %> created on the previous line
|
114
110
|
# receives the :update_attributes message with whatever params are
|
115
111
|
# submitted in the request.
|
116
|
-
<%- if Rails.
|
112
|
+
<%- if RSpec::Rails.rails_version_satisfied_by?('>= 4.0.0.beta1') -%>
|
117
113
|
<%= class_name %>.any_instance.should_receive(:update).with(<%= formatted_hash(example_params_for_update) %>)
|
118
114
|
<%- else -%>
|
119
115
|
<%= class_name %>.any_instance.should_receive(:update_attributes).with(<%= formatted_hash(example_params_for_update) %>)
|
data/lib/rspec/rails.rb
CHANGED
data/lib/rspec/rails/adapters.rb
CHANGED
@@ -24,7 +24,8 @@ module RSpec
|
|
24
24
|
end
|
25
25
|
|
26
26
|
assertion_modules.each do |mod|
|
27
|
-
mod.
|
27
|
+
mod.public_instance_methods.each do |method|
|
28
|
+
next if method == :method_missing || method == "method_missing"
|
28
29
|
class_eval <<-EOM, __FILE__, __LINE__ + 1
|
29
30
|
def #{method}(*args, &block)
|
30
31
|
assertion_instance.send(:#{method}, *args, &block)
|
@@ -36,6 +37,34 @@ module RSpec
|
|
36
37
|
end
|
37
38
|
end
|
38
39
|
|
40
|
+
# MiniTest::Unit::LifecycleHooks
|
41
|
+
module MiniTestLifecycleAdapter
|
42
|
+
extend ActiveSupport::Concern
|
43
|
+
|
44
|
+
included do |group|
|
45
|
+
group.before { after_setup }
|
46
|
+
group.after { before_teardown }
|
47
|
+
|
48
|
+
group.around do |example|
|
49
|
+
before_setup
|
50
|
+
example.run
|
51
|
+
after_teardown
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
def before_setup
|
56
|
+
end
|
57
|
+
|
58
|
+
def after_setup
|
59
|
+
end
|
60
|
+
|
61
|
+
def before_teardown
|
62
|
+
end
|
63
|
+
|
64
|
+
def after_teardown
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
39
68
|
module SetupAndTeardownAdapter
|
40
69
|
extend ActiveSupport::Concern
|
41
70
|
|
@@ -11,6 +11,7 @@ module RSpec::Rails
|
|
11
11
|
include RSpec::Rails::Matchers::RedirectTo
|
12
12
|
include RSpec::Rails::Matchers::RenderTemplate
|
13
13
|
include RSpec::Rails::Matchers::RoutingMatchers
|
14
|
+
include RSpec::Rails::AssertionDelegator.new(ActionDispatch::Assertions::RoutingAssertions)
|
14
15
|
|
15
16
|
module ClassMethods
|
16
17
|
# @private
|
@@ -64,18 +65,43 @@ module RSpec::Rails
|
|
64
65
|
metadata[:example_group][:described_class].class_eval(&body)
|
65
66
|
|
66
67
|
before do
|
67
|
-
@orig_routes
|
68
|
-
|
68
|
+
@orig_routes = self.routes
|
69
|
+
self.routes = ActionDispatch::Routing::RouteSet.new.tap { |r|
|
70
|
+
r.draw { resources :anonymous }
|
71
|
+
}
|
69
72
|
end
|
70
73
|
|
71
74
|
after do
|
72
|
-
|
75
|
+
self.routes = @orig_routes
|
76
|
+
@orig_routes = nil
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
# Specifies the routeset that will be used for the example group. This
|
81
|
+
# is most useful when testing Rails engines.
|
82
|
+
#
|
83
|
+
# @example
|
84
|
+
#
|
85
|
+
# describe MyEngine::PostsController do
|
86
|
+
# routes { MyEngine::Engine.routes }
|
87
|
+
#
|
88
|
+
# # ...
|
89
|
+
# end
|
90
|
+
def routes(&blk)
|
91
|
+
before do
|
92
|
+
self.routes = blk.call
|
73
93
|
end
|
74
94
|
end
|
75
95
|
end
|
76
96
|
|
77
97
|
attr_reader :controller, :routes
|
78
98
|
|
99
|
+
# @api private
|
100
|
+
def routes=(routes)
|
101
|
+
@routes = routes
|
102
|
+
assertion_instance.instance_variable_set(:@routes, routes)
|
103
|
+
end
|
104
|
+
|
79
105
|
module BypassRescue
|
80
106
|
def rescue_with_handler(exception)
|
81
107
|
raise exception
|
@@ -107,7 +133,9 @@ module RSpec::Rails
|
|
107
133
|
# If method is a named_route, delegates to the RouteSet associated with
|
108
134
|
# this controller.
|
109
135
|
def method_missing(method, *args, &block)
|
110
|
-
if @
|
136
|
+
if @routes && @routes.named_routes.helpers.include?(method)
|
137
|
+
controller.send(method, *args, &block)
|
138
|
+
elsif @orig_routes && @orig_routes.named_routes.helpers.include?(method)
|
111
139
|
controller.send(method, *args, &block)
|
112
140
|
else
|
113
141
|
super
|
@@ -120,8 +148,17 @@ module RSpec::Rails
|
|
120
148
|
metadata[:type] = :controller
|
121
149
|
|
122
150
|
before do
|
123
|
-
|
124
|
-
|
151
|
+
self.routes = ::Rails.application.routes
|
152
|
+
end
|
153
|
+
|
154
|
+
around do |ex|
|
155
|
+
previous_allow_forgery_protection_value = ActionController::Base.allow_forgery_protection
|
156
|
+
begin
|
157
|
+
ActionController::Base.allow_forgery_protection = false
|
158
|
+
ex.call
|
159
|
+
ensure
|
160
|
+
ActionController::Base.allow_forgery_protection = previous_allow_forgery_protection_value
|
161
|
+
end
|
125
162
|
end
|
126
163
|
end
|
127
164
|
end
|
@@ -1,12 +1,14 @@
|
|
1
1
|
# Temporary workaround to resolve circular dependency between rspec-rails' spec
|
2
2
|
# suite and ammeter.
|
3
3
|
require 'rspec/rails/matchers'
|
4
|
+
require 'rspec/rails/rails_version'
|
4
5
|
|
5
6
|
module RSpec
|
6
7
|
module Rails
|
7
8
|
module RailsExampleGroup
|
8
9
|
extend ActiveSupport::Concern
|
9
10
|
include RSpec::Rails::SetupAndTeardownAdapter
|
11
|
+
include RSpec::Rails::MiniTestLifecycleAdapter if RSpec::Rails.rails_version_satisfied_by?('>= 4.0.0.beta1')
|
10
12
|
include RSpec::Rails::TestUnitAssertionAdapter
|
11
13
|
include RSpec::Rails::Matchers
|
12
14
|
end
|
@@ -8,17 +8,43 @@ module RSpec::Rails
|
|
8
8
|
include RSpec::Rails::Matchers::RoutingMatchers::RouteHelpers
|
9
9
|
include RSpec::Rails::AssertionDelegator.new(ActionDispatch::Assertions::RoutingAssertions)
|
10
10
|
|
11
|
+
module ClassMethods
|
12
|
+
# Specifies the routeset that will be used for the example group. This
|
13
|
+
# is most useful when testing Rails engines.
|
14
|
+
#
|
15
|
+
# @example
|
16
|
+
#
|
17
|
+
# describe MyEngine::PostsController do
|
18
|
+
# routes { MyEngine::Engine.routes }
|
19
|
+
#
|
20
|
+
# it "routes posts#index" do
|
21
|
+
# expect(:get => "/posts").to
|
22
|
+
# route_to(:controller => "my_engine/posts", :action => "index")
|
23
|
+
# end
|
24
|
+
# end
|
25
|
+
def routes(&blk)
|
26
|
+
before do
|
27
|
+
self.routes = blk.call
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
11
32
|
included do
|
12
33
|
metadata[:type] = :routing
|
13
34
|
|
14
35
|
before do
|
15
|
-
|
16
|
-
assertion_instance.instance_variable_set(:@routes, @routes)
|
36
|
+
self.routes = ::Rails.application.routes
|
17
37
|
end
|
18
38
|
end
|
19
39
|
|
20
40
|
attr_reader :routes
|
21
41
|
|
42
|
+
# @api private
|
43
|
+
def routes=(routes)
|
44
|
+
@routes = routes
|
45
|
+
assertion_instance.instance_variable_set(:@routes, routes)
|
46
|
+
end
|
47
|
+
|
22
48
|
private
|
23
49
|
|
24
50
|
def method_missing(m, *args, &block)
|
@@ -107,7 +107,7 @@ module RSpec::Rails
|
|
107
107
|
end
|
108
108
|
|
109
109
|
def _default_render_options
|
110
|
-
if ::Rails.
|
110
|
+
if RSpec::Rails.rails_version_satisfied_by?('>= 3.2')
|
111
111
|
# pluck the handler, format, and locale out of, eg, posts/index.de.html.haml
|
112
112
|
template, *components = _default_file_to_render.split('.')
|
113
113
|
handler, format, locale = *components.reverse
|
@@ -4,6 +4,7 @@ module RSpec
|
|
4
4
|
module FixtureSupport
|
5
5
|
extend ActiveSupport::Concern
|
6
6
|
include RSpec::Rails::SetupAndTeardownAdapter
|
7
|
+
include RSpec::Rails::MiniTestLifecycleAdapter if RSpec::Rails.rails_version_satisfied_by?('>= 4.0.0.beta1')
|
7
8
|
include RSpec::Rails::TestUnitAssertionAdapter
|
8
9
|
include ActiveRecord::TestFixtures
|
9
10
|
|
@@ -97,7 +97,7 @@ module RSpec::Rails::Matchers
|
|
97
97
|
end
|
98
98
|
|
99
99
|
module RouteHelpers
|
100
|
-
%w(get post put delete options head).each do |method|
|
100
|
+
%w(get post put patch delete options head).each do |method|
|
101
101
|
define_method method do |path|
|
102
102
|
{ method.to_sym => path }
|
103
103
|
end
|
data/lib/rspec/rails/mocks.rb
CHANGED
@@ -96,7 +96,7 @@ EOM
|
|
96
96
|
:valid? => true,
|
97
97
|
:blank? => false)
|
98
98
|
|
99
|
-
|
99
|
+
double("#{model_class.name}_#{stubs[:id]}", stubs).tap do |m|
|
100
100
|
m.singleton_class.class_eval do
|
101
101
|
include ActiveModelInstanceMethods
|
102
102
|
include ActiveRecordInstanceMethods if defined?(ActiveRecord)
|
@@ -0,0 +1,17 @@
|
|
1
|
+
module RSpec
|
2
|
+
module Rails
|
3
|
+
# @api private
|
4
|
+
def self.rails_version_satisfied_by?(requirement)
|
5
|
+
Gem::Requirement.new(requirement).satisfied_by?(rails_version)
|
6
|
+
end
|
7
|
+
|
8
|
+
# @api private
|
9
|
+
def self.rails_version
|
10
|
+
@rails_version ||= if ::Rails.version.is_a?(Gem::Version)
|
11
|
+
::Rails.version
|
12
|
+
else
|
13
|
+
Gem::Version.new(::Rails.version.to_s)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -25,11 +25,14 @@ namespace :spec do
|
|
25
25
|
end
|
26
26
|
end
|
27
27
|
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
28
|
+
# RCov task only enabled for Ruby 1.8
|
29
|
+
if RUBY_VERSION < '1.9'
|
30
|
+
desc "Run all specs with rcov"
|
31
|
+
RSpec::Core::RakeTask.new(:rcov => spec_prereq) do |t|
|
32
|
+
t.rcov = true
|
33
|
+
t.pattern = "./spec/**/*_spec.rb"
|
34
|
+
t.rcov_opts = '--exclude /gems/,/Library/,/usr/,lib/tasks,.bundle,config,/lib/rspec/,/lib/rspec-,spec'
|
35
|
+
end
|
33
36
|
end
|
34
37
|
|
35
38
|
task :statsetup do
|
@@ -42,4 +45,3 @@ namespace :spec do
|
|
42
45
|
end
|
43
46
|
end
|
44
47
|
end
|
45
|
-
|
data/lib/rspec/rails/version.rb
CHANGED
@@ -50,6 +50,17 @@ describe Rspec::Generators::ControllerGenerator do
|
|
50
50
|
it { should_not exist }
|
51
51
|
end
|
52
52
|
end
|
53
|
+
|
54
|
+
describe 'with --no-template-engine' do
|
55
|
+
before do
|
56
|
+
run_generator %w(posts index --no-template-engine)
|
57
|
+
end
|
58
|
+
|
59
|
+
describe 'index.html.erb' do
|
60
|
+
subject { file('spec/views/posts/index.html._spec.rb') }
|
61
|
+
it { should_not exist }
|
62
|
+
end
|
63
|
+
end
|
53
64
|
end
|
54
65
|
|
55
66
|
describe 'are generated' do
|
@@ -16,7 +16,7 @@ describe Rspec::Generators::InstallGenerator do
|
|
16
16
|
File.read( file('spec/spec_helper.rb') ).should =~ /^require 'rspec\/autorun'$/m
|
17
17
|
end
|
18
18
|
|
19
|
-
if ::Rails.
|
19
|
+
if RSpec::Rails.rails_version_satisfied_by?('>= 4.0.0.beta1')
|
20
20
|
it "generates spec/spec_helper.rb with a check for pending migrations" do
|
21
21
|
run_generator
|
22
22
|
File.read( file('spec/spec_helper.rb') ).should =~ /ActiveRecord::Migration\.check_pending!/m
|
@@ -72,6 +72,29 @@ describe Rspec::Generators::ScaffoldGenerator do
|
|
72
72
|
end
|
73
73
|
end
|
74
74
|
|
75
|
+
describe 'with --no-template-engine' do
|
76
|
+
before { run_generator %w(posts --no-template-engine) }
|
77
|
+
describe 'edit' do
|
78
|
+
subject { file("spec/views/posts/edit.html._spec.rb") }
|
79
|
+
it { should_not exist }
|
80
|
+
end
|
81
|
+
|
82
|
+
describe 'index' do
|
83
|
+
subject { file("spec/views/posts/index.html._spec.rb") }
|
84
|
+
it { should_not exist }
|
85
|
+
end
|
86
|
+
|
87
|
+
describe 'new' do
|
88
|
+
subject { file("spec/views/posts/new.html._spec.rb") }
|
89
|
+
it { should_not exist }
|
90
|
+
end
|
91
|
+
|
92
|
+
describe 'show' do
|
93
|
+
subject { file("spec/views/posts/show.html._spec.rb") }
|
94
|
+
it { should_not exist }
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
75
98
|
describe 'with --no-view-specs' do
|
76
99
|
before { run_generator %w(posts --no-view-specs) }
|
77
100
|
|
@@ -27,4 +27,17 @@ describe RSpec::Rails::AssertionDelegator do
|
|
27
27
|
expect(klass.new).to have_thing(:a)
|
28
28
|
expect(klass.new).not_to have_thing(:b)
|
29
29
|
end
|
30
|
+
|
31
|
+
it "does not delegate method_missing" do
|
32
|
+
assertions = Module.new {
|
33
|
+
def method_missing(method, *args)
|
34
|
+
end
|
35
|
+
}
|
36
|
+
|
37
|
+
klass = Class.new {
|
38
|
+
include RSpec::Rails::AssertionDelegator.new(assertions)
|
39
|
+
}
|
40
|
+
|
41
|
+
expect { klass.new.abc123 }.to raise_error(NoMethodError)
|
42
|
+
end
|
30
43
|
end
|
@@ -118,7 +118,7 @@ module RSpec::Rails
|
|
118
118
|
view_spec.stub(:_default_file_to_render) { "widgets/new.en.html.erb" }
|
119
119
|
view_spec.render
|
120
120
|
|
121
|
-
if ::Rails.
|
121
|
+
if RSpec::Rails.rails_version_satisfied_by?('>= 3.2')
|
122
122
|
view_spec.received.first.should == [{:template => "widgets/new", :locales=>['en'], :formats=>['html'], :handlers=>['erb']}, {}, nil]
|
123
123
|
else
|
124
124
|
view_spec.received.first.should == [{:template => "widgets/new.en.html.erb"}, {}, nil]
|
@@ -29,7 +29,7 @@ require "spec_helper"
|
|
29
29
|
context "with should" do
|
30
30
|
context "when assert_template passes" do
|
31
31
|
it "passes" do
|
32
|
-
|
32
|
+
def assert_template(*); end
|
33
33
|
expect do
|
34
34
|
expect(response).to send(template_expectation, "template_name")
|
35
35
|
end.to_not raise_exception
|
@@ -38,7 +38,7 @@ require "spec_helper"
|
|
38
38
|
|
39
39
|
context "when assert_template fails" do
|
40
40
|
it "uses failure message from assert_template" do
|
41
|
-
|
41
|
+
def assert_template(*)
|
42
42
|
raise ActiveSupport::TestCase::Assertion.new("this message")
|
43
43
|
end
|
44
44
|
expect do
|
@@ -49,7 +49,7 @@ require "spec_helper"
|
|
49
49
|
|
50
50
|
context "when fails due to some other exception" do
|
51
51
|
it "raises that exception" do
|
52
|
-
|
52
|
+
def assert_template(*)
|
53
53
|
raise "oops"
|
54
54
|
end
|
55
55
|
expect do
|