rspec-rails 2.0.0.beta.22 → 2.0.0.rc
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.
- data/History.md +9 -0
- data/Thorfile +41 -0
- data/lib/generators/rspec/controller/controller_generator.rb +2 -2
- data/lib/generators/rspec/helper/helper_generator.rb +2 -2
- data/lib/generators/rspec/scaffold/scaffold_generator.rb +9 -0
- data/lib/generators/rspec/scaffold/templates/edit_spec.rb +9 -0
- data/lib/generators/rspec/scaffold/templates/index_spec.rb +5 -0
- data/lib/generators/rspec/scaffold/templates/new_spec.rb +9 -0
- data/lib/generators/rspec/scaffold/templates/show_spec.rb +5 -0
- data/lib/rspec-rails.rb +4 -2
- data/lib/rspec/rails/example/controller_example_group.rb +1 -0
- data/lib/rspec/rails/example/helper_example_group.rb +1 -1
- data/lib/rspec/rails/matchers.rb +1 -0
- data/lib/rspec/rails/matchers/be_new_record.rb +5 -0
- data/lib/rspec/rails/mocks.rb +91 -65
- data/lib/rspec/rails/version.rb +1 -1
- data/lib/rspec/rails/view_assigns.rb +13 -4
- data/rspec-rails.gemspec +1 -1
- data/spec/rspec/rails/example/controller_example_group_spec.rb +22 -5
- data/spec/rspec/rails/example/helper_example_group_spec.rb +1 -1
- data/spec/rspec/rails/example/view_example_group_spec.rb +1 -1
- data/spec/rspec/rails/matchers/be_new_record_spec.rb +17 -0
- data/spec/rspec/rails/mocks/ar_classes.rb +1 -0
- data/spec/rspec/rails/mocks/mock_model_spec.rb +11 -9
- data/spec/rspec/rails/mocks/stub_model_spec.rb +117 -68
- metadata +20 -15
data/History.md
CHANGED
@@ -1,5 +1,14 @@
|
|
1
1
|
## rspec-rails release history (incomplete)
|
2
2
|
|
3
|
+
### 2.0.0.rc / 2010-10-05
|
4
|
+
|
5
|
+
[full changelog](http://github.com/rspec/rspec-rails/compare/v2.0.0.beta.22...v2.0.0.rc)
|
6
|
+
|
7
|
+
* Enhancements
|
8
|
+
* add --webrat-matchers flag to scaffold generator (for view specs)
|
9
|
+
* separate ActiveModel and ActiveRecord APIs in mock_model and stub_model
|
10
|
+
* ControllerExampleGroup uses controller as the implicit subject by default (Paul Rosania)
|
11
|
+
|
3
12
|
### 2.0.0.beta.22 / 2010-09-12
|
4
13
|
|
5
14
|
[full changelog](http://github.com/rspec/rspec-rails/compare/v2.0.0.beta.20...v2.0.0.beta.22)
|
data/Thorfile
ADDED
@@ -0,0 +1,41 @@
|
|
1
|
+
class Rails < Thor
|
2
|
+
VERSIONS = {
|
3
|
+
:rails => {
|
4
|
+
"3.0.0" => "v3.0.0",
|
5
|
+
"master" => "master",
|
6
|
+
"3-0-stable" => "origin/3-0-stable"
|
7
|
+
},
|
8
|
+
:arel => {
|
9
|
+
"3.0.0" => "v1.0.0",
|
10
|
+
"master" => "master",
|
11
|
+
"3-0-stable" => "master"
|
12
|
+
}
|
13
|
+
}
|
14
|
+
|
15
|
+
desc "checkout VERSION", "checks it out (and arel)"
|
16
|
+
def checkout(version)
|
17
|
+
unless VERSIONS[:rails].has_key?(version)
|
18
|
+
raise "\n#{"*"*50}\nvalid versions are: #{VERSIONS[:rails].keys.join(", ")}\n#{"*"*50}\n"
|
19
|
+
end
|
20
|
+
|
21
|
+
puts "***** checking out rails at #{VERSIONS[:rails][version]} ..."
|
22
|
+
Dir.chdir("vendor/rails") do
|
23
|
+
`git checkout #{VERSIONS[:rails][version]}`
|
24
|
+
end
|
25
|
+
|
26
|
+
puts "***** checking out arel at #{VERSIONS[:arel][version]} ..."
|
27
|
+
Dir.chdir("vendor/arel") do
|
28
|
+
`git checkout #{VERSIONS[:arel][version]}`
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
desc "fetch", "update vendor/rails and vendor/arel"
|
33
|
+
def fetch
|
34
|
+
Dir.chdir("vendor/rails") do
|
35
|
+
`git fetch`
|
36
|
+
end
|
37
|
+
Dir.chdir("vendor/arel") do
|
38
|
+
`git fetch`
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
@@ -10,7 +10,7 @@ module Rspec
|
|
10
10
|
class_option :view_specs, :type => :boolean, :default => true
|
11
11
|
|
12
12
|
def create_controller_files
|
13
|
-
return unless options[:
|
13
|
+
return unless options[:controller_specs]
|
14
14
|
|
15
15
|
template 'controller_spec.rb',
|
16
16
|
File.join('spec/controllers', class_path, "#{file_name}_controller_spec.rb")
|
@@ -18,7 +18,7 @@ module Rspec
|
|
18
18
|
|
19
19
|
def create_view_files
|
20
20
|
return if actions.empty?
|
21
|
-
return unless options[:
|
21
|
+
return unless options[:view_specs]
|
22
22
|
|
23
23
|
empty_directory File.join("spec", "views", file_path)
|
24
24
|
|
@@ -3,10 +3,10 @@ require 'generators/rspec'
|
|
3
3
|
module Rspec
|
4
4
|
module Generators
|
5
5
|
class HelperGenerator < Base
|
6
|
-
class_option :
|
6
|
+
class_option :helper_specs, :type => :boolean, :default => true
|
7
7
|
|
8
8
|
def create_helper_files
|
9
|
-
return unless options[:
|
9
|
+
return unless options[:helper_specs]
|
10
10
|
|
11
11
|
template 'helper_spec.rb', File.join('spec/helpers', class_path, "#{file_name}_helper_spec.rb")
|
12
12
|
end
|
@@ -14,6 +14,7 @@ module Rspec
|
|
14
14
|
|
15
15
|
class_option :controller_specs, :type => :boolean, :default => true, :desc => "Generate controller specs"
|
16
16
|
class_option :view_specs, :type => :boolean, :default => true, :desc => "Generate view specs"
|
17
|
+
class_option :webrat_matchers, :type => :boolean, :default => false, :desc => "Use webrat matchers in view specs"
|
17
18
|
class_option :helper_specs, :type => :boolean, :default => true, :desc => "Generate helper specs"
|
18
19
|
class_option :routing_specs, :type => :boolean, :default => true, :desc => "Generate routing specs"
|
19
20
|
|
@@ -49,6 +50,10 @@ module Rspec
|
|
49
50
|
|
50
51
|
protected
|
51
52
|
|
53
|
+
def webrat?
|
54
|
+
options[:webrat_matchers] || @webrat_matchers_requested
|
55
|
+
end
|
56
|
+
|
52
57
|
def copy_view(view)
|
53
58
|
template "#{view}_spec.rb",
|
54
59
|
File.join("spec/views", controller_file_path, "#{view}.html.#{options[:template_engine]}_spec.rb")
|
@@ -126,6 +131,10 @@ module Rspec
|
|
126
131
|
end
|
127
132
|
end
|
128
133
|
|
134
|
+
def banner
|
135
|
+
self.class.banner
|
136
|
+
end
|
137
|
+
|
129
138
|
end
|
130
139
|
end
|
131
140
|
end
|
@@ -14,10 +14,19 @@ describe "<%= table_name %>/edit.html.<%= options[:template_engine] %>" do
|
|
14
14
|
it "renders the edit <%= file_name %> form" do
|
15
15
|
render
|
16
16
|
|
17
|
+
<% if webrat? -%>
|
17
18
|
rendered.should have_selector("form", :action => <%= file_name %>_path(@<%= file_name %>), :method => "post") do |form|
|
18
19
|
<% for attribute in output_attributes -%>
|
19
20
|
form.should have_selector("<%= attribute.input_type -%>#<%= file_name %>_<%= attribute.name %>", :name => "<%= file_name %>[<%= attribute.name %>]")
|
20
21
|
<% end -%>
|
21
22
|
end
|
23
|
+
<% else -%>
|
24
|
+
# Run the generator again with the --webrat-matchers flag if you want to use webrat matchers
|
25
|
+
assert_select "form", :action => <%= file_name %>_path(@<%= file_name %>), :method => "post" do
|
26
|
+
<% for attribute in output_attributes -%>
|
27
|
+
assert_select "<%= attribute.input_type -%>#<%= file_name %>_<%= attribute.name %>", :name => "<%= file_name %>[<%= attribute.name %>]"
|
28
|
+
<% end -%>
|
29
|
+
end
|
30
|
+
<% end -%>
|
22
31
|
end
|
23
32
|
end
|
@@ -19,7 +19,12 @@ describe "<%= table_name %>/index.html.<%= options[:template_engine] %>" do
|
|
19
19
|
it "renders a list of <%= table_name %>" do
|
20
20
|
render
|
21
21
|
<% for attribute in output_attributes -%>
|
22
|
+
<% if webrat? -%>
|
22
23
|
rendered.should have_selector("tr>td", :content => <%= value_for(attribute) %>.to_s, :count => 2)
|
24
|
+
<% else -%>
|
25
|
+
# Run the generator again with the --webrat-matchers flag if you want to use webrat matchers
|
26
|
+
assert_select "tr>td", :text => <%= value_for(attribute) %>.to_s, :count => 2
|
27
|
+
<% end -%>
|
23
28
|
<% end -%>
|
24
29
|
end
|
25
30
|
end
|
@@ -14,10 +14,19 @@ describe "<%= table_name %>/new.html.<%= options[:template_engine] %>" do
|
|
14
14
|
it "renders new <%= file_name %> form" do
|
15
15
|
render
|
16
16
|
|
17
|
+
<% if webrat? -%>
|
17
18
|
rendered.should have_selector("form", :action => <%= table_name %>_path, :method => "post") do |form|
|
18
19
|
<% for attribute in output_attributes -%>
|
19
20
|
form.should have_selector("<%= attribute.input_type -%>#<%= file_name %>_<%= attribute.name %>", :name => "<%= file_name %>[<%= attribute.name %>]")
|
20
21
|
<% end -%>
|
21
22
|
end
|
23
|
+
<% else -%>
|
24
|
+
# Run the generator again with the --webrat-matchers flag if you want to use webrat matchers
|
25
|
+
assert_select "form", :action => <%= table_name %>_path, :method => "post" do
|
26
|
+
<% for attribute in output_attributes -%>
|
27
|
+
assert_select "<%= attribute.input_type -%>#<%= file_name %>_<%= attribute.name %>", :name => "<%= file_name %>[<%= attribute.name %>]"
|
28
|
+
<% end -%>
|
29
|
+
end
|
30
|
+
<% end -%>
|
22
31
|
end
|
23
32
|
end
|
@@ -15,7 +15,12 @@ describe "<%= table_name %>/show.html.<%= options[:template_engine] %>" do
|
|
15
15
|
it "renders attributes in <p>" do
|
16
16
|
render
|
17
17
|
<% for attribute in output_attributes -%>
|
18
|
+
<% if webrat? -%>
|
18
19
|
rendered.should contain(<%= value_for(attribute) %>.to_s)
|
20
|
+
<% else -%>
|
21
|
+
# Run the generator again with the --webrat-matchers flag if you want to use webrat matchers
|
22
|
+
rendered.should match(/<%= eval(value_for(attribute)) %>/)
|
23
|
+
<% end -%>
|
19
24
|
<% end -%>
|
20
25
|
end
|
21
26
|
end
|
data/lib/rspec-rails.rb
CHANGED
@@ -1,8 +1,10 @@
|
|
1
1
|
module RSpec
|
2
2
|
module Rails
|
3
3
|
class Railtie < ::Rails::Railtie
|
4
|
-
config.
|
5
|
-
config.
|
4
|
+
# Rails-3.0.1 requires config.app_generators instead of 3.0.0's config.generators
|
5
|
+
generators = config.respond_to?(:app_generators) ? config.app_generators : config.generators
|
6
|
+
generators.integration_tool :rspec
|
7
|
+
generators.test_framework :rspec
|
6
8
|
|
7
9
|
rake_tasks do
|
8
10
|
load "rspec/rails/tasks/rspec.rake"
|
@@ -49,7 +49,7 @@ module RSpec::Rails
|
|
49
49
|
# Returns an instance of ActionView::Base with the helper being specified
|
50
50
|
# mixed in, along with any of the built-in rails helpers.
|
51
51
|
def helper
|
52
|
-
_view.tap {|v| v.assign(
|
52
|
+
_view.tap {|v| v.assign(view_assigns)}
|
53
53
|
end
|
54
54
|
|
55
55
|
private
|
data/lib/rspec/rails/matchers.rb
CHANGED
@@ -21,5 +21,6 @@ end
|
|
21
21
|
require 'rspec/rails/matchers/render_template'
|
22
22
|
require 'rspec/rails/matchers/redirect_to'
|
23
23
|
require 'rspec/rails/matchers/routing_matchers'
|
24
|
+
require 'rspec/rails/matchers/be_new_record'
|
24
25
|
require 'rspec/rails/matchers/be_a_new'
|
25
26
|
require 'rspec/rails/matchers/have_extension'
|
data/lib/rspec/rails/mocks.rb
CHANGED
@@ -5,27 +5,27 @@ module RSpec
|
|
5
5
|
|
6
6
|
module Mocks
|
7
7
|
|
8
|
-
module
|
9
|
-
def valid?
|
10
|
-
true
|
11
|
-
end
|
12
|
-
|
8
|
+
module ActiveModelInstanceMethods
|
13
9
|
def as_new_record
|
10
|
+
self.stub(:persisted?) { false }
|
14
11
|
self.stub(:id) { nil }
|
15
12
|
self
|
16
13
|
end
|
17
14
|
|
18
|
-
def new_record?
|
19
|
-
!persisted?
|
20
|
-
end
|
21
|
-
|
22
15
|
def persisted?
|
23
|
-
|
16
|
+
true
|
24
17
|
end
|
18
|
+
end
|
25
19
|
|
20
|
+
module ActiveRecordInstanceMethods
|
26
21
|
def destroy
|
22
|
+
self.stub(:persisted?) { false }
|
27
23
|
self.stub(:id) { nil }
|
28
24
|
end
|
25
|
+
|
26
|
+
def new_record?
|
27
|
+
!persisted?
|
28
|
+
end
|
29
29
|
end
|
30
30
|
|
31
31
|
# Creates a mock object instance for a +string_or_model_class+ with
|
@@ -37,7 +37,7 @@ module RSpec
|
|
37
37
|
# * A String representing a Class that does not exist
|
38
38
|
# * A String representing a Class that extends ActiveModel::Naming
|
39
39
|
# * A Class that extends ActiveModel::Naming
|
40
|
-
def mock_model(string_or_model_class,
|
40
|
+
def mock_model(string_or_model_class, stubs = {})
|
41
41
|
if String === string_or_model_class
|
42
42
|
if Object.const_defined?(string_or_model_class)
|
43
43
|
model_class = Object.const_get(string_or_model_class)
|
@@ -61,57 +61,71 @@ It received #{model_class.inspect}
|
|
61
61
|
EOM
|
62
62
|
end
|
63
63
|
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
})
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
64
|
+
stubs = stubs.reverse_merge(:id => next_id)
|
65
|
+
stubs = stubs.reverse_merge(:persisted? => !!stubs[:id])
|
66
|
+
stubs = stubs.reverse_merge(:destroyed? => false)
|
67
|
+
stubs = stubs.reverse_merge(:marked_for_destruction? => false)
|
68
|
+
|
69
|
+
mock("#{model_class.name}_#{stubs[:id]}", stubs).tap do |m|
|
70
|
+
m.extend ActiveModelInstanceMethods
|
71
|
+
m.singleton_class.__send__ :include, ActiveModel::Conversion
|
72
|
+
m.singleton_class.__send__ :include, ActiveModel::Validations
|
73
|
+
if RSpec::Rails::using_active_record?
|
74
|
+
m.extend ActiveRecordInstanceMethods
|
75
|
+
[:save, :update_attributes].each do |key|
|
76
|
+
if stubs[key] == false
|
77
|
+
m.errors.stub(:empty?) { false }
|
78
|
+
end
|
79
|
+
end
|
78
80
|
end
|
81
|
+
m.__send__(:__mock_proxy).instance_eval(<<-CODE, __FILE__, __LINE__)
|
82
|
+
def @object.is_a?(other)
|
83
|
+
#{model_class}.ancestors.include?(other)
|
84
|
+
end
|
85
|
+
def @object.kind_of?(other)
|
86
|
+
#{model_class}.ancestors.include?(other)
|
87
|
+
end
|
88
|
+
def @object.instance_of?(other)
|
89
|
+
other == #{model_class}
|
90
|
+
end
|
91
|
+
def @object.respond_to?(method_name)
|
92
|
+
#{model_class}.respond_to?(:column_names) && #{model_class}.column_names.include?(method_name.to_s) || super
|
93
|
+
end
|
94
|
+
def @object.class
|
95
|
+
#{model_class}
|
96
|
+
end
|
97
|
+
def @object.to_s
|
98
|
+
"#{model_class.name}_#{to_param}"
|
99
|
+
end
|
100
|
+
CODE
|
101
|
+
yield m if block_given?
|
79
102
|
end
|
80
|
-
m.stub(:errors) { errors }
|
81
|
-
m.__send__(:__mock_proxy).instance_eval(<<-CODE, __FILE__, __LINE__)
|
82
|
-
def @object.is_a?(other)
|
83
|
-
#{model_class}.ancestors.include?(other)
|
84
|
-
end
|
85
|
-
def @object.kind_of?(other)
|
86
|
-
#{model_class}.ancestors.include?(other)
|
87
|
-
end
|
88
|
-
def @object.instance_of?(other)
|
89
|
-
other == #{model_class}
|
90
|
-
end
|
91
|
-
def @object.respond_to?(method_name)
|
92
|
-
#{model_class}.respond_to?(:column_names) && #{model_class}.column_names.include?(method_name.to_s) || super
|
93
|
-
end
|
94
|
-
def @object.class
|
95
|
-
#{model_class}
|
96
|
-
end
|
97
|
-
def @object.to_s
|
98
|
-
"#{model_class.name}_#{id}"
|
99
|
-
end
|
100
|
-
CODE
|
101
|
-
yield m if block_given?
|
102
|
-
m
|
103
103
|
end
|
104
104
|
|
105
|
-
module
|
106
|
-
def
|
107
|
-
|
105
|
+
module ActiveModelStubExtensions
|
106
|
+
def as_new_record
|
107
|
+
self.stub(:persisted?) { false }
|
108
|
+
self.stub(:id) { nil }
|
109
|
+
self
|
108
110
|
end
|
109
|
-
|
110
|
-
|
111
|
+
|
112
|
+
def persisted?
|
113
|
+
true
|
111
114
|
end
|
115
|
+
end
|
116
|
+
|
117
|
+
module ActiveRecordStubExtensions
|
112
118
|
def as_new_record
|
113
119
|
self.__send__("#{self.class.primary_key}=", nil)
|
114
|
-
|
120
|
+
super
|
121
|
+
end
|
122
|
+
|
123
|
+
def new_record?
|
124
|
+
!persisted?
|
125
|
+
end
|
126
|
+
|
127
|
+
def connection
|
128
|
+
raise RSpec::Rails::IllegalDataAccessException.new("stubbed models are not allowed to access the database")
|
115
129
|
end
|
116
130
|
end
|
117
131
|
|
@@ -121,12 +135,15 @@ EOM
|
|
121
135
|
# stub_model(Model, hash_of_stubs)
|
122
136
|
# stub_model(Model, instance_variable_name, hash_of_stubs)
|
123
137
|
#
|
124
|
-
# Creates an instance of +Model+
|
125
|
-
#
|
126
|
-
#
|
127
|
-
#
|
128
|
-
# key
|
129
|
-
#
|
138
|
+
# Creates an instance of +Model+ with +to_param+ stubbed using a
|
139
|
+
# generated value that is unique to each object.. If +Model+ is an
|
140
|
+
# +ActiveRecord+ model, it is prohibited from accessing the database*.
|
141
|
+
#
|
142
|
+
# For each key in +hash_of_stubs+, if the model has a matching attribute
|
143
|
+
# (determined by asking it) are simply assigned the submitted values. If
|
144
|
+
# the model does not have a matching attribute, the key/value pair is
|
145
|
+
# assigned as a stub return value using RSpec's mocking/stubbing
|
146
|
+
# framework.
|
130
147
|
#
|
131
148
|
# <tt>new_record?</tt> is overridden to return the result of id.nil?
|
132
149
|
# This means that by default new_record? will return false. If you want
|
@@ -151,16 +168,25 @@ EOM
|
|
151
168
|
#
|
152
169
|
# stub_model(Person)
|
153
170
|
# stub_model(Person).as_new_record
|
154
|
-
# stub_model(Person, :
|
171
|
+
# stub_model(Person, :to_param => 37)
|
155
172
|
# stub_model(Person) do |person|
|
156
173
|
# person.first_name = "David"
|
157
174
|
# end
|
158
175
|
def stub_model(model_class, stubs={})
|
159
|
-
primary_key = model_class.primary_key.to_sym
|
160
|
-
stubs = {primary_key => next_id}.merge(stubs)
|
161
176
|
model_class.new.tap do |m|
|
162
|
-
m.
|
163
|
-
|
177
|
+
m.extend ActiveModelStubExtensions
|
178
|
+
if RSpec::Rails::using_active_record? && model_class < ActiveRecord::Base
|
179
|
+
m.extend ActiveRecordStubExtensions
|
180
|
+
primary_key = model_class.primary_key.to_sym
|
181
|
+
stubs = stubs.reverse_merge(primary_key => next_id)
|
182
|
+
stubs = stubs.reverse_merge(:persisted? => !!stubs[primary_key])
|
183
|
+
else
|
184
|
+
stubs = stubs.reverse_merge(:id => next_id)
|
185
|
+
stubs = stubs.reverse_merge(:persisted? => !!stubs[:id])
|
186
|
+
end
|
187
|
+
stubs.each do |k,v|
|
188
|
+
m.__send__("#{k}=", stubs.delete(k)) if m.respond_to?("#{k}=")
|
189
|
+
end
|
164
190
|
m.stub(stubs)
|
165
191
|
yield m if block_given?
|
166
192
|
end
|
data/lib/rspec/rails/version.rb
CHANGED
@@ -13,15 +13,24 @@ module RSpec
|
|
13
13
|
_encapsulated_assigns[key] = value
|
14
14
|
end
|
15
15
|
|
16
|
+
if ::Rails::VERSION::STRING == "3.0.0"
|
17
|
+
def _assigns
|
18
|
+
super.merge(_encapsulated_assigns)
|
19
|
+
end
|
20
|
+
def view_assigns
|
21
|
+
_assigns
|
22
|
+
end
|
23
|
+
else # >= 3.0.1
|
24
|
+
def view_assigns
|
25
|
+
super.merge(_encapsulated_assigns)
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
16
29
|
private
|
17
30
|
|
18
31
|
def _encapsulated_assigns
|
19
32
|
@_encapsulated_assigns ||= {}
|
20
33
|
end
|
21
|
-
|
22
|
-
def _assigns
|
23
|
-
super.merge(_encapsulated_assigns)
|
24
|
-
end
|
25
34
|
end
|
26
35
|
end
|
27
36
|
end
|
data/rspec-rails.gemspec
CHANGED
@@ -26,7 +26,7 @@ Gem::Specification.new do |s|
|
|
26
26
|
|
27
27
|
Thank you for installing #{s.summary}!
|
28
28
|
|
29
|
-
This version of rspec-rails only works with versions of rails >= 3.0.0
|
29
|
+
This version of rspec-rails only works with versions of rails >= 3.0.0
|
30
30
|
|
31
31
|
To configure your app to use rspec-rails, add a declaration to your Gemfile.
|
32
32
|
If you are using Bundler's grouping feature in your Gemfile, be sure to include
|
@@ -5,18 +5,35 @@ module RSpec::Rails
|
|
5
5
|
it { should be_included_in_files_in('./spec/controllers/') }
|
6
6
|
it { should be_included_in_files_in('.\\spec\\controllers\\') }
|
7
7
|
|
8
|
-
|
9
|
-
|
8
|
+
let(:group) do
|
9
|
+
RSpec::Core::ExampleGroup.describe do
|
10
10
|
include ControllerExampleGroup
|
11
11
|
end
|
12
|
+
end
|
13
|
+
|
14
|
+
it "includes routing matchers" do
|
12
15
|
group.included_modules.should include(RSpec::Rails::Matchers::RoutingMatchers)
|
13
16
|
end
|
14
17
|
|
15
18
|
it "adds :type => :controller to the metadata" do
|
16
|
-
group = RSpec::Core::ExampleGroup.describe do
|
17
|
-
include ControllerExampleGroup
|
18
|
-
end
|
19
19
|
group.metadata[:type].should eq(:controller)
|
20
20
|
end
|
21
|
+
|
22
|
+
context "with implicit subject" do
|
23
|
+
it "uses the controller as the subject" do
|
24
|
+
controller = double('controller')
|
25
|
+
example = group.new
|
26
|
+
example.stub(:controller => controller)
|
27
|
+
example.subject.should == controller
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
describe "with explicit subject" do
|
32
|
+
it "should use the specified subject instead of the controller" do
|
33
|
+
group.subject { 'explicit' }
|
34
|
+
example = group.new
|
35
|
+
example.subject.should == 'explicit'
|
36
|
+
end
|
37
|
+
end
|
21
38
|
end
|
22
39
|
end
|
@@ -24,7 +24,7 @@ module RSpec::Rails
|
|
24
24
|
describe "#helper" do
|
25
25
|
it "returns the instance of AV::Base provided by AV::TC::Behavior" do
|
26
26
|
helper_spec = Object.new.extend HelperExampleGroup::InstanceMethods
|
27
|
-
helper_spec.should_receive(:
|
27
|
+
helper_spec.should_receive(:view_assigns)
|
28
28
|
av_tc_b_view = double('_view')
|
29
29
|
av_tc_b_view.should_receive(:assign)
|
30
30
|
helper_spec.stub(:_view) { av_tc_b_view }
|
@@ -15,7 +15,7 @@ module RSpec::Rails
|
|
15
15
|
describe 'automatic inclusion of helpers' do
|
16
16
|
module ::ThingsHelper; end
|
17
17
|
|
18
|
-
|
18
|
+
pending 'includes the helper with the same name' do
|
19
19
|
group = RSpec::Core::ExampleGroup.describe 'things/show.html.erb'
|
20
20
|
group.should_receive(:helper).with(ThingsHelper)
|
21
21
|
group.class_eval do
|
@@ -0,0 +1,17 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
describe "be_new_record" do
|
4
|
+
context "un-persisted record" do
|
5
|
+
it "passes" do
|
6
|
+
record = double('record', :persisted? => false)
|
7
|
+
record.should be_new_record
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
context "persisted record" do
|
12
|
+
it "fails" do
|
13
|
+
record = double('record', :persisted? => true)
|
14
|
+
record.should_not be_new_record
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -41,19 +41,17 @@ describe "mock_model(RealModel)" do
|
|
41
41
|
before(:each) do
|
42
42
|
@model = mock_model(MockableModel, :id => 1)
|
43
43
|
end
|
44
|
+
|
44
45
|
it "is named using the stubbed id value" do
|
45
46
|
@model.instance_variable_get(:@name).should == "MockableModel_1"
|
46
47
|
end
|
47
|
-
it "returns string of id value for to_param" do
|
48
|
-
@model.to_param.should == "1"
|
49
|
-
end
|
50
48
|
end
|
51
49
|
|
52
50
|
describe "destroy" do
|
53
|
-
it "sets
|
51
|
+
it "sets persisted to false" do
|
54
52
|
model = mock_model(MockableModel)
|
55
53
|
model.destroy
|
56
|
-
model.
|
54
|
+
model.should_not be_persisted
|
57
55
|
end
|
58
56
|
end
|
59
57
|
|
@@ -181,26 +179,25 @@ describe "mock_model(RealModel)" do
|
|
181
179
|
end
|
182
180
|
|
183
181
|
describe "#persisted?" do
|
184
|
-
context "with default
|
182
|
+
context "with default identifier" do
|
185
183
|
it "returns true" do
|
186
184
|
mock_model(MockableModel).should be_persisted
|
187
185
|
end
|
188
186
|
end
|
189
187
|
|
190
|
-
context "with explicit id" do
|
188
|
+
context "with explicit identifier via :id" do
|
191
189
|
it "returns true" do
|
192
190
|
mock_model(MockableModel, :id => 37).should be_persisted
|
193
191
|
end
|
194
192
|
end
|
195
193
|
|
196
|
-
context "with id nil" do
|
194
|
+
context "with id => nil" do
|
197
195
|
it "returns false" do
|
198
196
|
mock_model(MockableModel, :id => nil).should_not be_persisted
|
199
197
|
end
|
200
198
|
end
|
201
199
|
end
|
202
200
|
|
203
|
-
|
204
201
|
describe "#valid?" do
|
205
202
|
context "default" do
|
206
203
|
it "returns true" do
|
@@ -220,6 +217,11 @@ describe "mock_model(RealModel)" do
|
|
220
217
|
m.as_new_record.should be_new_record
|
221
218
|
end
|
222
219
|
|
220
|
+
it "says it is not persisted" do
|
221
|
+
m = mock_model(MockableModel)
|
222
|
+
m.as_new_record.should_not be_persisted
|
223
|
+
end
|
224
|
+
|
223
225
|
it "has a nil id" do
|
224
226
|
mock_model(MockableModel).as_new_record.id.should be(nil)
|
225
227
|
end
|
@@ -2,100 +2,149 @@ require 'spec_helper'
|
|
2
2
|
require File.dirname(__FILE__) + '/ar_classes'
|
3
3
|
|
4
4
|
describe "stub_model" do
|
5
|
-
|
6
|
-
|
7
|
-
|
5
|
+
|
6
|
+
shared_examples_for "stub model" do
|
7
|
+
describe "with a block" do
|
8
|
+
it "yields the model" do
|
9
|
+
model = stub_model(model_class) do |block_arg|
|
10
|
+
@block_arg = block_arg
|
11
|
+
end
|
12
|
+
model.should be(@block_arg)
|
13
|
+
end
|
8
14
|
end
|
9
15
|
|
10
|
-
|
11
|
-
|
16
|
+
describe "#persisted?" do
|
17
|
+
context "default" do
|
18
|
+
it "returns true" do
|
19
|
+
model = stub_model(model_class)
|
20
|
+
model.should be_persisted
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
context "with as_new_record" do
|
25
|
+
it "returns false" do
|
26
|
+
model = stub_model(model_class).as_new_record
|
27
|
+
model.should_not be_persisted
|
28
|
+
end
|
29
|
+
end
|
12
30
|
end
|
13
|
-
end
|
14
31
|
|
15
|
-
|
16
|
-
|
17
|
-
|
32
|
+
it "increments the value returned by to_param" do
|
33
|
+
first = stub_model(model_class)
|
34
|
+
second = stub_model(model_class)
|
35
|
+
second.to_param.to_i.should == (first.to_param.to_i + 1)
|
36
|
+
end
|
18
37
|
|
19
|
-
it "says it is a new record when id is set to nil" do
|
20
|
-
stub_model(MockableModel, :id => nil).should be_new_record
|
21
38
|
end
|
22
39
|
|
23
|
-
|
24
|
-
|
40
|
+
context "with ActiveModel (not ActiveRecord)" do
|
41
|
+
it_behaves_like "stub model" do
|
42
|
+
def model_class
|
43
|
+
NonActiveRecordModel
|
44
|
+
end
|
45
|
+
end
|
25
46
|
end
|
26
47
|
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
48
|
+
context "with an ActiveRecord model" do
|
49
|
+
let(:model_class) { MockableModel }
|
50
|
+
|
51
|
+
it_behaves_like "stub model"
|
52
|
+
|
53
|
+
describe "#new_record?" do
|
54
|
+
context "default" do
|
55
|
+
it "returns false" do
|
56
|
+
model = stub_model(model_class)
|
57
|
+
model.new_record?.should be_false
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
context "with as_new_record" do
|
62
|
+
it "returns true" do
|
63
|
+
model = stub_model(model_class).as_new_record
|
64
|
+
model.new_record?.should be_true
|
65
|
+
end
|
66
|
+
end
|
34
67
|
end
|
35
|
-
|
36
|
-
|
37
|
-
|
68
|
+
|
69
|
+
describe "defaults" do
|
70
|
+
it "has an id" do
|
71
|
+
stub_model(MockableModel).id.should be > 0
|
72
|
+
end
|
73
|
+
|
74
|
+
it "says it is not a new record" do
|
75
|
+
stub_model(MockableModel).should_not be_new_record
|
76
|
+
end
|
38
77
|
end
|
39
|
-
|
40
|
-
|
41
|
-
|
78
|
+
|
79
|
+
describe "#as_new_record" do
|
80
|
+
it "has a nil id" do
|
81
|
+
stub_model(MockableModel).as_new_record.id.should be(nil)
|
82
|
+
end
|
42
83
|
end
|
43
|
-
|
44
|
-
it "
|
45
|
-
|
84
|
+
|
85
|
+
it "raises when hitting the db" do
|
86
|
+
lambda do
|
87
|
+
stub_model(ConnectableModel).connection
|
88
|
+
end.should raise_error(RSpec::Rails::IllegalDataAccessException, /stubbed models are not allowed to access the database/)
|
46
89
|
end
|
47
|
-
|
48
|
-
it "
|
49
|
-
stub_model(
|
90
|
+
|
91
|
+
it "increments the id" do
|
92
|
+
first = stub_model(model_class)
|
93
|
+
second = stub_model(model_class)
|
94
|
+
second.id.should == (first.id + 1)
|
50
95
|
end
|
51
|
-
end
|
52
96
|
|
53
|
-
|
54
|
-
|
55
|
-
stub_model(MockableModel).as_new_record.should be_new_record
|
97
|
+
it "accepts a stub id" do
|
98
|
+
stub_model(MockableModel, :id => 37).id.should == 37
|
56
99
|
end
|
57
100
|
|
58
|
-
it "
|
59
|
-
stub_model(MockableModel).
|
101
|
+
it "says it is a new record when id is set to nil" do
|
102
|
+
stub_model(MockableModel, :id => nil).should be_new_record
|
60
103
|
end
|
61
|
-
end
|
62
104
|
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
end.should raise_error(RSpec::Rails::IllegalDataAccessException, /stubbed models are not allowed to access the database/)
|
67
|
-
end
|
105
|
+
it "accepts a stub for save" do
|
106
|
+
stub_model(MockableModel, :save => false).save.should be(false)
|
107
|
+
end
|
68
108
|
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
end
|
109
|
+
describe "alternate primary key" do
|
110
|
+
it "has the correct primary_key name" do
|
111
|
+
stub_model(AlternatePrimaryKeyModel).class.primary_key.should eql('my_id')
|
112
|
+
end
|
74
113
|
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
@stub_model = stub_model(MockableModel)
|
79
|
-
@real.mockable_model = @stub_model
|
80
|
-
end
|
114
|
+
it "has a primary_key" do
|
115
|
+
stub_model(AlternatePrimaryKeyModel).my_id.should be > 0
|
116
|
+
end
|
81
117
|
|
82
|
-
|
83
|
-
|
84
|
-
|
118
|
+
it "says it is not a new record" do
|
119
|
+
stub_model(AlternatePrimaryKeyModel) do |m|
|
120
|
+
m.should_not be_new_record
|
121
|
+
end
|
122
|
+
end
|
85
123
|
|
86
|
-
|
87
|
-
|
124
|
+
it "says it is a new record if primary_key is nil" do
|
125
|
+
stub_model(AlternatePrimaryKeyModel, :my_id => nil).should be_new_record
|
126
|
+
end
|
127
|
+
|
128
|
+
it "accepts a stub for the primary_key" do
|
129
|
+
stub_model(AlternatePrimaryKeyModel, :my_id => 5).my_id.should == 5
|
130
|
+
end
|
88
131
|
end
|
89
|
-
end
|
90
132
|
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
@
|
133
|
+
describe "as association" do
|
134
|
+
before(:each) do
|
135
|
+
@real = AssociatedModel.create!
|
136
|
+
@stub_model = stub_model(MockableModel)
|
137
|
+
@real.mockable_model = @stub_model
|
138
|
+
end
|
139
|
+
|
140
|
+
it "passes associated_model == mock" do
|
141
|
+
@stub_model.should == @real.mockable_model
|
142
|
+
end
|
143
|
+
|
144
|
+
it "passes mock == associated_model" do
|
145
|
+
@real.mockable_model.should == @stub_model
|
95
146
|
end
|
96
|
-
model.should be(@block_arg)
|
97
147
|
end
|
148
|
+
|
98
149
|
end
|
99
150
|
end
|
100
|
-
|
101
|
-
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rspec-rails
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
+
hash: 7712058
|
4
5
|
prerelease: true
|
5
6
|
segments:
|
6
7
|
- 2
|
7
8
|
- 0
|
8
9
|
- 0
|
9
|
-
-
|
10
|
-
|
11
|
-
version: 2.0.0.beta.22
|
10
|
+
- rc
|
11
|
+
version: 2.0.0.rc
|
12
12
|
platform: ruby
|
13
13
|
authors:
|
14
14
|
- David Chelimsky
|
@@ -17,26 +17,26 @@ autorequire:
|
|
17
17
|
bindir: bin
|
18
18
|
cert_chain: []
|
19
19
|
|
20
|
-
date: 2010-
|
20
|
+
date: 2010-10-04 00:00:00 -05:00
|
21
21
|
default_executable:
|
22
22
|
dependencies:
|
23
23
|
- !ruby/object:Gem::Dependency
|
24
|
-
|
25
|
-
requirement: &id001 !ruby/object:Gem::Requirement
|
24
|
+
version_requirements: &id001 !ruby/object:Gem::Requirement
|
26
25
|
none: false
|
27
26
|
requirements:
|
28
27
|
- - "="
|
29
28
|
- !ruby/object:Gem::Version
|
29
|
+
hash: 7712058
|
30
30
|
segments:
|
31
31
|
- 2
|
32
32
|
- 0
|
33
33
|
- 0
|
34
|
-
-
|
35
|
-
|
36
|
-
|
34
|
+
- rc
|
35
|
+
version: 2.0.0.rc
|
36
|
+
requirement: *id001
|
37
37
|
type: :runtime
|
38
|
+
name: rspec
|
38
39
|
prerelease: false
|
39
|
-
version_requirements: *id001
|
40
40
|
description: RSpec-2 for Rails-3
|
41
41
|
email: dchelimsky@gmail.com;chad.humphries@gmail.com
|
42
42
|
executables: []
|
@@ -53,6 +53,7 @@ files:
|
|
53
53
|
- History.md
|
54
54
|
- README.markdown
|
55
55
|
- Rakefile
|
56
|
+
- Thorfile
|
56
57
|
- Upgrade.markdown
|
57
58
|
- autotest/discover.rb
|
58
59
|
- cucumber.yml
|
@@ -124,6 +125,7 @@ files:
|
|
124
125
|
- lib/rspec/rails/fixture_support.rb
|
125
126
|
- lib/rspec/rails/matchers.rb
|
126
127
|
- lib/rspec/rails/matchers/be_a_new.rb
|
128
|
+
- lib/rspec/rails/matchers/be_new_record.rb
|
127
129
|
- lib/rspec/rails/matchers/have_extension.rb
|
128
130
|
- lib/rspec/rails/matchers/redirect_to.rb
|
129
131
|
- lib/rspec/rails/matchers/render_template.rb
|
@@ -147,6 +149,7 @@ files:
|
|
147
149
|
- spec/rspec/rails/example/view_rendering_spec.rb
|
148
150
|
- spec/rspec/rails/fixture_support_spec.rb
|
149
151
|
- spec/rspec/rails/matchers/be_a_new_spec.rb
|
152
|
+
- spec/rspec/rails/matchers/be_new_record_spec.rb
|
150
153
|
- spec/rspec/rails/matchers/errors_on_spec.rb
|
151
154
|
- spec/rspec/rails/matchers/redirect_to_spec.rb
|
152
155
|
- spec/rspec/rails/matchers/render_template_spec.rb
|
@@ -167,9 +170,9 @@ licenses: []
|
|
167
170
|
post_install_message: |
|
168
171
|
**************************************************
|
169
172
|
|
170
|
-
Thank you for installing rspec-rails-2.0.0.
|
173
|
+
Thank you for installing rspec-rails-2.0.0.rc!
|
171
174
|
|
172
|
-
This version of rspec-rails only works with versions of rails >= 3.0.0
|
175
|
+
This version of rspec-rails only works with versions of rails >= 3.0.0
|
173
176
|
|
174
177
|
To configure your app to use rspec-rails, add a declaration to your Gemfile.
|
175
178
|
If you are using Bundler's grouping feature in your Gemfile, be sure to include
|
@@ -177,7 +180,7 @@ post_install_message: |
|
|
177
180
|
can access its generators and rake tasks.
|
178
181
|
|
179
182
|
group :development, :test do
|
180
|
-
gem "rspec-rails", ">= 2.0.0.
|
183
|
+
gem "rspec-rails", ">= 2.0.0.rc"
|
181
184
|
end
|
182
185
|
|
183
186
|
Be sure to run the following command in each of your Rails apps if you're
|
@@ -208,7 +211,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
208
211
|
requirements:
|
209
212
|
- - ">="
|
210
213
|
- !ruby/object:Gem::Version
|
211
|
-
hash:
|
214
|
+
hash: 3
|
212
215
|
segments:
|
213
216
|
- 0
|
214
217
|
version: "0"
|
@@ -217,6 +220,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
217
220
|
requirements:
|
218
221
|
- - ">"
|
219
222
|
- !ruby/object:Gem::Version
|
223
|
+
hash: 25
|
220
224
|
segments:
|
221
225
|
- 1
|
222
226
|
- 3
|
@@ -228,7 +232,7 @@ rubyforge_project: rspec
|
|
228
232
|
rubygems_version: 1.3.7
|
229
233
|
signing_key:
|
230
234
|
specification_version: 3
|
231
|
-
summary: rspec-rails-2.0.0.
|
235
|
+
summary: rspec-rails-2.0.0.rc
|
232
236
|
test_files:
|
233
237
|
- features/README.markdown
|
234
238
|
- features/controller_specs/anonymous_controller.feature
|
@@ -262,6 +266,7 @@ test_files:
|
|
262
266
|
- spec/rspec/rails/example/view_rendering_spec.rb
|
263
267
|
- spec/rspec/rails/fixture_support_spec.rb
|
264
268
|
- spec/rspec/rails/matchers/be_a_new_spec.rb
|
269
|
+
- spec/rspec/rails/matchers/be_new_record_spec.rb
|
265
270
|
- spec/rspec/rails/matchers/errors_on_spec.rb
|
266
271
|
- spec/rspec/rails/matchers/redirect_to_spec.rb
|
267
272
|
- spec/rspec/rails/matchers/render_template_spec.rb
|