rspec-core 2.0.1 → 2.1.0
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/Gemfile +8 -3
- data/Guardfile +5 -0
- data/History.markdown +32 -2
- data/README.markdown +10 -3
- data/Rakefile +12 -13
- data/Upgrade.markdown +175 -121
- data/bin/autospec +13 -0
- data/bin/rspec +24 -1
- data/features/command_line/line_number_appended_to_path.feature +3 -1
- data/features/command_line/line_number_option.feature +3 -1
- data/features/command_line/tag.feature +74 -0
- data/features/filtering/exclusion_filters.feature +1 -1
- data/features/filtering/implicit_filters.feature +166 -0
- data/features/hooks/around_hooks.feature +51 -44
- data/features/metadata/described_class.feature +3 -0
- data/features/pending/pending_examples.feature +76 -0
- data/features/step_definitions/additional_cli_steps.rb +11 -0
- data/features/subject/attribute_of_subject.feature +8 -0
- data/features/subject/explicit_subject.feature +8 -13
- data/features/subject/implicit_receiver.feature +29 -0
- data/features/subject/implicit_subject.feature +6 -7
- data/lib/rspec/core.rb +3 -21
- data/lib/rspec/core/backward_compatibility.rb +22 -3
- data/lib/rspec/core/command_line.rb +1 -0
- data/lib/rspec/core/configuration.rb +34 -6
- data/lib/rspec/core/configuration_options.rb +1 -3
- data/lib/rspec/core/example.rb +0 -5
- data/lib/rspec/core/example_group.rb +9 -8
- data/lib/rspec/core/expecting/with_rspec.rb +11 -0
- data/lib/rspec/core/extensions/object.rb +1 -1
- data/lib/rspec/core/formatters/base_formatter.rb +1 -6
- data/lib/rspec/core/hooks.rb +1 -1
- data/lib/rspec/core/metadata.rb +15 -5
- data/lib/rspec/core/option_parser.rb +17 -0
- data/lib/rspec/core/pending.rb +10 -1
- data/lib/rspec/core/rake_task.rb +32 -10
- data/lib/rspec/core/reporter.rb +1 -0
- data/lib/rspec/core/subject.rb +58 -59
- data/lib/rspec/core/version.rb +1 -1
- data/lib/rspec/core/world.rb +9 -4
- data/rspec-core.gemspec +4 -11
- data/spec/rspec/core/command_line_spec.rb +16 -5
- data/spec/rspec/core/configuration_options_spec.rb +6 -0
- data/spec/rspec/core/configuration_spec.rb +89 -6
- data/spec/rspec/core/deprecations_spec.rb +17 -1
- data/spec/rspec/core/example_group_spec.rb +29 -14
- data/spec/rspec/core/example_spec.rb +0 -7
- data/spec/rspec/core/formatters/html_formatted-1.8.6.html +49 -33
- data/spec/rspec/core/formatters/html_formatted-1.8.7.html +5 -5
- data/spec/rspec/core/formatters/html_formatted-1.9.1.html +46 -26
- data/spec/rspec/core/formatters/html_formatted-1.9.2.html +5 -5
- data/spec/rspec/core/formatters/text_mate_formatted-1.8.6.html +49 -33
- data/spec/rspec/core/formatters/text_mate_formatted-1.8.7.html +19 -19
- data/spec/rspec/core/formatters/text_mate_formatted-1.9.1.html +56 -33
- data/spec/rspec/core/formatters/text_mate_formatted-1.9.2.html +26 -38
- data/spec/rspec/core/metadata_spec.rb +153 -132
- data/spec/rspec/core/pending_example_spec.rb +133 -25
- data/spec/rspec/core/rake_task_spec.rb +25 -32
- data/spec/rspec/core/subject_spec.rb +15 -0
- data/spec/rspec/core/world_spec.rb +72 -61
- data/spec/spec_helper.rb +0 -14
- metadata +25 -135
- data/features/hooks/halt.feature +0 -26
@@ -1,5 +1,8 @@
|
|
1
1
|
Feature: described class
|
2
2
|
|
3
|
+
If the first argument to the outermost example group is a class, the class is
|
4
|
+
exposed to each example via the described_class() method.
|
5
|
+
|
3
6
|
Scenario: access the described class from the example
|
4
7
|
Given a file named "spec/example_spec.rb" with:
|
5
8
|
"""
|
@@ -138,3 +138,79 @@ Feature: pending examples
|
|
138
138
|
checks something
|
139
139
|
(PENDING: Not Yet Implemented)
|
140
140
|
"""
|
141
|
+
|
142
|
+
Scenario: conditionally pending examples
|
143
|
+
Given a file named "conditionally_pending_spec.rb" with:
|
144
|
+
"""
|
145
|
+
describe "a failing spec" do
|
146
|
+
def run_test; raise "failure"; end
|
147
|
+
|
148
|
+
it "is pending when pending with a true :if condition" do
|
149
|
+
pending("true :if", :if => true) { run_test }
|
150
|
+
end
|
151
|
+
|
152
|
+
it "fails when pending with a false :if condition" do
|
153
|
+
pending("false :if", :if => false) { run_test }
|
154
|
+
end
|
155
|
+
|
156
|
+
it "is pending when pending with a false :unless condition" do
|
157
|
+
pending("false :unless", :unless => false) { run_test }
|
158
|
+
end
|
159
|
+
|
160
|
+
it "fails when pending with a true :unless condition" do
|
161
|
+
pending("true :unless", :unless => true) { run_test }
|
162
|
+
end
|
163
|
+
end
|
164
|
+
|
165
|
+
describe "a passing spec" do
|
166
|
+
def run_test; true.should be(true); end
|
167
|
+
|
168
|
+
it "fails when pending with a true :if condition" do
|
169
|
+
pending("true :if", :if => true) { run_test }
|
170
|
+
end
|
171
|
+
|
172
|
+
it "passes when pending with a false :if condition" do
|
173
|
+
pending("false :if", :if => false) { run_test }
|
174
|
+
end
|
175
|
+
|
176
|
+
it "fails when pending with a false :unless condition" do
|
177
|
+
pending("false :unless", :unless => false) { run_test }
|
178
|
+
end
|
179
|
+
|
180
|
+
it "passes when pending with a true :unless condition" do
|
181
|
+
pending("true :unless", :unless => true) { run_test }
|
182
|
+
end
|
183
|
+
end
|
184
|
+
"""
|
185
|
+
When I run "rspec ./conditionally_pending_spec.rb"
|
186
|
+
Then the output should contain "8 examples, 4 failures, 2 pending"
|
187
|
+
And the output should contain:
|
188
|
+
"""
|
189
|
+
Pending:
|
190
|
+
a failing spec is pending when pending with a true :if condition
|
191
|
+
# true :if
|
192
|
+
# ./conditionally_pending_spec.rb:4
|
193
|
+
a failing spec is pending when pending with a false :unless condition
|
194
|
+
# false :unless
|
195
|
+
# ./conditionally_pending_spec.rb:12
|
196
|
+
"""
|
197
|
+
And the output should contain:
|
198
|
+
"""
|
199
|
+
1) a failing spec fails when pending with a false :if condition
|
200
|
+
Failure/Error: def run_test; raise "failure"; end
|
201
|
+
"""
|
202
|
+
And the output should contain:
|
203
|
+
"""
|
204
|
+
2) a failing spec fails when pending with a true :unless condition
|
205
|
+
Failure/Error: def run_test; raise "failure"; end
|
206
|
+
"""
|
207
|
+
And the output should contain:
|
208
|
+
"""
|
209
|
+
3) a passing spec fails when pending with a true :if condition FIXED
|
210
|
+
Expected pending 'true :if' to fail. No Error was raised.
|
211
|
+
"""
|
212
|
+
And the output should contain:
|
213
|
+
"""
|
214
|
+
4) a passing spec fails when pending with a false :unless condition FIXED
|
215
|
+
Expected pending 'false :unless' to fail. No Error was raised.
|
216
|
+
"""
|
@@ -0,0 +1,11 @@
|
|
1
|
+
Then /^the output should contain all of these:$/ do |table|
|
2
|
+
table.raw.flatten.each do |string|
|
3
|
+
assert_partial_output(string)
|
4
|
+
end
|
5
|
+
end
|
6
|
+
|
7
|
+
Then /^the output should not contain any of these:$/ do |table|
|
8
|
+
table.raw.flatten.each do |string|
|
9
|
+
combined_output.should_not =~ compile_and_escape(string)
|
10
|
+
end
|
11
|
+
end
|
@@ -1,5 +1,13 @@
|
|
1
1
|
Feature: attribute of subject
|
2
2
|
|
3
|
+
Use the its() method as a short-hand to generate a nested example group with
|
4
|
+
a single example that specifies the expected value of an attribute of the subject.
|
5
|
+
This can be used with an implicit or explicit subject.
|
6
|
+
|
7
|
+
its() accepts a symbol or a string, and a block representing the example. Use
|
8
|
+
a string with dots to specify a nested attribute (i.e. an attribute of the
|
9
|
+
attribute of the subject).
|
10
|
+
|
3
11
|
Scenario: simple attribute
|
4
12
|
Given a file named "example_spec.rb" with:
|
5
13
|
"""
|
@@ -1,12 +1,11 @@
|
|
1
1
|
Feature: explicit subject
|
2
2
|
|
3
|
-
|
4
|
-
|
3
|
+
Use subject() in the group scope to explicitly define the value that is
|
4
|
+
returned by the subject() method in the example scope.
|
5
|
+
|
5
6
|
Scenario: subject in top level group
|
6
7
|
Given a file named "top_level_subject_spec.rb" with:
|
7
8
|
"""
|
8
|
-
require 'rspec/expectations'
|
9
|
-
|
10
9
|
describe Array, "with some elements" do
|
11
10
|
subject { [1,2,3] }
|
12
11
|
it "should have the prescribed elements" do
|
@@ -14,14 +13,12 @@ Feature: explicit subject
|
|
14
13
|
end
|
15
14
|
end
|
16
15
|
"""
|
17
|
-
When I run "rspec
|
16
|
+
When I run "rspec top_level_subject_spec.rb"
|
18
17
|
Then the output should contain "1 example, 0 failures"
|
19
18
|
|
20
19
|
Scenario: subject in a nested group
|
21
20
|
Given a file named "nested_subject_spec.rb" with:
|
22
21
|
"""
|
23
|
-
require 'rspec/expectations'
|
24
|
-
|
25
22
|
describe Array do
|
26
23
|
subject { [1,2,3] }
|
27
24
|
describe "with some elements" do
|
@@ -31,7 +28,7 @@ Feature: explicit subject
|
|
31
28
|
end
|
32
29
|
end
|
33
30
|
"""
|
34
|
-
When I run "rspec
|
31
|
+
When I run "rspec nested_subject_spec.rb"
|
35
32
|
Then the output should contain "1 example, 0 failures"
|
36
33
|
|
37
34
|
Scenario: access subject from before block
|
@@ -45,14 +42,12 @@ Feature: explicit subject
|
|
45
42
|
end
|
46
43
|
end
|
47
44
|
"""
|
48
|
-
When I run "rspec
|
45
|
+
When I run "rspec top_level_subject_spec.rb"
|
49
46
|
Then the output should contain "1 example, 0 failures"
|
50
47
|
|
51
|
-
Scenario:
|
48
|
+
Scenario: invoke helper method from subject block
|
52
49
|
Given a file named "helper_subject_spec.rb" with:
|
53
50
|
"""
|
54
|
-
require 'rspec/expectations'
|
55
|
-
|
56
51
|
describe Array do
|
57
52
|
def prepared_array; [1,2,3] end
|
58
53
|
subject { prepared_array }
|
@@ -63,5 +58,5 @@ Feature: explicit subject
|
|
63
58
|
end
|
64
59
|
end
|
65
60
|
"""
|
66
|
-
When I run "rspec
|
61
|
+
When I run "rspec helper_subject_spec.rb"
|
67
62
|
Then the output should contain "1 example, 0 failures"
|
@@ -0,0 +1,29 @@
|
|
1
|
+
Feature: implicit receiver
|
2
|
+
|
3
|
+
When should() is called in an example without an explicit receiver, it is
|
4
|
+
invoked against the subject (explicit or implicit).
|
5
|
+
|
6
|
+
Scenario: implicit subject
|
7
|
+
Given a file named "example_spec.rb" with:
|
8
|
+
"""
|
9
|
+
describe Array do
|
10
|
+
describe "when first created" do
|
11
|
+
it { should be_empty }
|
12
|
+
end
|
13
|
+
end
|
14
|
+
"""
|
15
|
+
When I run "rspec example_spec.rb"
|
16
|
+
Then the output should contain "1 example, 0 failures"
|
17
|
+
|
18
|
+
Scenario: explicit subject
|
19
|
+
Given a file named "example_spec.rb" with:
|
20
|
+
"""
|
21
|
+
describe Array do
|
22
|
+
describe "with 3 items" do
|
23
|
+
subject { [1,2,3] }
|
24
|
+
it { should_not be_empty }
|
25
|
+
end
|
26
|
+
end
|
27
|
+
"""
|
28
|
+
When I run "rspec example_spec.rb"
|
29
|
+
Then the output should contain "1 example, 0 failures"
|
@@ -1,15 +1,14 @@
|
|
1
1
|
Feature: implicit subject
|
2
2
|
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
3
|
+
If the first argument to the outermost example group is a class, an instance
|
4
|
+
of that class is exposed to each example via the subject() method.
|
5
|
+
|
7
6
|
Scenario: subject in top level group
|
8
7
|
Given a file named "top_level_subject_spec.rb" with:
|
9
8
|
"""
|
10
9
|
describe Array, "when first created" do
|
11
10
|
it "should be empty" do
|
12
|
-
subject.should
|
11
|
+
subject.should eq([])
|
13
12
|
end
|
14
13
|
end
|
15
14
|
"""
|
@@ -22,10 +21,10 @@ Feature: implicit subject
|
|
22
21
|
describe Array do
|
23
22
|
describe "when first created" do
|
24
23
|
it "should be empty" do
|
25
|
-
subject.should
|
24
|
+
subject.should eq([])
|
26
25
|
end
|
27
26
|
end
|
28
27
|
end
|
29
28
|
"""
|
30
|
-
When I run "rspec
|
29
|
+
When I run "rspec nested_subject_spec.rb"
|
31
30
|
Then the output should contain "1 example, 0 failures"
|
data/lib/rspec/core.rb
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
require 'rspec/core/extensions'
|
2
2
|
require 'rspec/core/load_path'
|
3
3
|
require 'rspec/core/deprecation'
|
4
|
+
require 'rspec/core/backward_compatibility'
|
4
5
|
require 'rspec/core/reporter'
|
5
6
|
|
6
7
|
require 'rspec/core/hooks'
|
@@ -24,27 +25,12 @@ require 'rspec/core/version'
|
|
24
25
|
require 'rspec/core/errors'
|
25
26
|
|
26
27
|
module RSpec
|
27
|
-
|
28
|
+
autoload :Matchers, 'rspec/matchers'
|
28
29
|
|
30
|
+
module Core
|
29
31
|
def self.install_directory
|
30
32
|
@install_directory ||= File.expand_path(File.dirname(__FILE__))
|
31
33
|
end
|
32
|
-
|
33
|
-
def self.configuration
|
34
|
-
RSpec.deprecate('RSpec::Core.configuration', 'RSpec.configuration', '2.0.0')
|
35
|
-
RSpec.configuration
|
36
|
-
end
|
37
|
-
|
38
|
-
def self.configure
|
39
|
-
RSpec.deprecate('RSpec::Core.configure', 'RSpec.configure', '2.0.0')
|
40
|
-
yield RSpec.configuration if block_given?
|
41
|
-
end
|
42
|
-
|
43
|
-
def self.world
|
44
|
-
RSpec.deprecate('RSpec::Core.world', 'RSpec.world', '2.0.0')
|
45
|
-
RSpec.world
|
46
|
-
end
|
47
|
-
|
48
34
|
end
|
49
35
|
|
50
36
|
def self.wants_to_quit
|
@@ -73,8 +59,4 @@ module RSpec
|
|
73
59
|
end
|
74
60
|
|
75
61
|
require 'rspec/core/backward_compatibility'
|
76
|
-
|
77
|
-
# TODO - make this configurable with default 'on'
|
78
|
-
require 'rspec/expectations'
|
79
|
-
|
80
62
|
require 'rspec/monkey'
|
@@ -9,11 +9,11 @@ module RSpec
|
|
9
9
|
DEPRECATION WARNING: you are using a deprecated constant that will
|
10
10
|
be removed from a future version of RSpec.
|
11
11
|
|
12
|
+
#{caller(0)[2]}
|
13
|
+
|
12
14
|
* #{name} is deprecated.
|
13
15
|
* RSpec is the new top-level module in RSpec-2
|
14
|
-
|
15
|
-
#{caller(0)[1]}
|
16
|
-
*****************************************************************
|
16
|
+
***************************************************************
|
17
17
|
WARNING
|
18
18
|
RSpec
|
19
19
|
else
|
@@ -21,9 +21,28 @@ WARNING
|
|
21
21
|
end
|
22
22
|
end
|
23
23
|
end
|
24
|
+
end
|
24
25
|
|
26
|
+
module Runner
|
27
|
+
def self.configure(&block)
|
28
|
+
RSpec.deprecate("Spec::Runner.configure", "RSpec.configure")
|
29
|
+
RSpec.configure(&block)
|
30
|
+
end
|
25
31
|
end
|
26
32
|
|
33
|
+
module Rake
|
34
|
+
def self.const_missing(name)
|
35
|
+
case name
|
36
|
+
when :SpecTask
|
37
|
+
RSpec.deprecate("Spec::Rake::SpecTask", "RSpec::Core::RakeTask")
|
38
|
+
require 'rspec/core/rake_task'
|
39
|
+
RSpec::Core::RakeTask
|
40
|
+
else
|
41
|
+
super(name)
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
end
|
27
46
|
end
|
28
47
|
|
29
48
|
Object.extend(RSpec::Core::ConstMissing)
|
@@ -27,6 +27,7 @@ module RSpec
|
|
27
27
|
add_setting :fail_fast, :default => false
|
28
28
|
add_setting :run_all_when_everything_filtered
|
29
29
|
add_setting :mock_framework, :default => :rspec
|
30
|
+
add_setting :expectation_framework, :default => :rspec
|
30
31
|
add_setting :filter
|
31
32
|
add_setting :exclusion_filter
|
32
33
|
add_setting :filename_pattern, :default => '**/*_spec.rb'
|
@@ -46,6 +47,11 @@ module RSpec
|
|
46
47
|
/spec\/spec_helper\.rb/,
|
47
48
|
/lib\/rspec\/(core|expectations|matchers|mocks)/
|
48
49
|
]
|
50
|
+
|
51
|
+
filter_run_excluding(
|
52
|
+
:if => lambda { |value, metadata| metadata.has_key?(:if) && !value },
|
53
|
+
:unless => lambda { |value| value }
|
54
|
+
)
|
49
55
|
end
|
50
56
|
|
51
57
|
# :call-seq:
|
@@ -125,6 +131,19 @@ module RSpec
|
|
125
131
|
end
|
126
132
|
end
|
127
133
|
|
134
|
+
def expect_with(expectation_framework)
|
135
|
+
settings[:expectation_framework] = expectation_framework
|
136
|
+
end
|
137
|
+
|
138
|
+
def require_expectation_framework_adapter
|
139
|
+
require case expectation_framework.to_s
|
140
|
+
when /rspec/i
|
141
|
+
'rspec/core/expecting/with_rspec'
|
142
|
+
else
|
143
|
+
raise ArgumentError, "#{expectation_framework.inspect} is not supported"
|
144
|
+
end
|
145
|
+
end
|
146
|
+
|
128
147
|
def full_backtrace=(bool)
|
129
148
|
settings[:backtrace_clean_patterns] = []
|
130
149
|
end
|
@@ -181,11 +200,11 @@ EOM
|
|
181
200
|
end
|
182
201
|
|
183
202
|
def line_number=(line_number)
|
184
|
-
filter_run :line_number => line_number.to_i
|
203
|
+
filter_run({ :line_number => line_number.to_i }, true)
|
185
204
|
end
|
186
205
|
|
187
206
|
def full_description=(description)
|
188
|
-
filter_run :full_description => /#{description}/
|
207
|
+
filter_run({ :full_description => /#{description}/ }, true)
|
189
208
|
end
|
190
209
|
|
191
210
|
attr_writer :formatter_class
|
@@ -260,19 +279,23 @@ EOM
|
|
260
279
|
RSpec::Core::ExampleGroup.alias_it_should_behave_like_to(new_name, report_label)
|
261
280
|
end
|
262
281
|
|
263
|
-
def filter_run_including(options={})
|
282
|
+
def filter_run_including(options={}, force_overwrite = false)
|
264
283
|
if filter and filter[:line_number] || filter[:full_description]
|
265
284
|
warn "Filtering by #{options.inspect} is not possible since " \
|
266
285
|
"you are already filtering by #{filter.inspect}"
|
267
286
|
else
|
268
|
-
|
287
|
+
if force_overwrite
|
288
|
+
self.filter = options
|
289
|
+
else
|
290
|
+
self.filter = (filter || {}).merge(options)
|
291
|
+
end
|
269
292
|
end
|
270
293
|
end
|
271
294
|
|
272
295
|
alias_method :filter_run, :filter_run_including
|
273
296
|
|
274
297
|
def filter_run_excluding(options={})
|
275
|
-
self.exclusion_filter = options
|
298
|
+
self.exclusion_filter = (exclusion_filter || {}).merge(options)
|
276
299
|
end
|
277
300
|
|
278
301
|
def include(mod, filters={})
|
@@ -290,7 +313,7 @@ EOM
|
|
290
313
|
}
|
291
314
|
|
292
315
|
include_or_extend_modules.each do |include_or_extend, mod, filters|
|
293
|
-
next unless group.
|
316
|
+
next unless group.apply?(:all?, filters)
|
294
317
|
next if modules[include_or_extend].include?(mod)
|
295
318
|
modules[include_or_extend] << mod
|
296
319
|
group.send(include_or_extend, mod)
|
@@ -302,6 +325,11 @@ EOM
|
|
302
325
|
RSpec::Core::ExampleGroup.send(:include, RSpec::Core::MockFrameworkAdapter)
|
303
326
|
end
|
304
327
|
|
328
|
+
def configure_expectation_framework
|
329
|
+
require_expectation_framework_adapter
|
330
|
+
RSpec::Core::ExampleGroup.send(:include, RSpec::Core::ExpectationFrameworkAdapter)
|
331
|
+
end
|
332
|
+
|
305
333
|
def load_spec_files
|
306
334
|
files_to_run.map {|f| load File.expand_path(f) }
|
307
335
|
end
|
@@ -91,9 +91,7 @@ module RSpec
|
|
91
91
|
|
92
92
|
def local_options_file(options)
|
93
93
|
return options[:options_file] if options[:options_file]
|
94
|
-
|
95
|
-
RSpec.deprecate("spec/spec.opts", "./.rspec or ~/.rspec", "2.0.0") if File.exist?("spec/spec.opts")
|
96
|
-
"spec/spec.opts"
|
94
|
+
LOCAL_OPTIONS_FILE
|
97
95
|
end
|
98
96
|
end
|
99
97
|
end
|