rspec-core 2.0.0.beta.17 → 2.0.0.beta.18
Sign up to get free protection for your applications and to get access to all the features.
- data/README.markdown +5 -1
- data/Rakefile +4 -1
- data/Upgrade.markdown +28 -2
- data/VERSION +1 -1
- data/autotest/discover.rb +1 -1
- data/features/command_line/configure.feature +19 -0
- data/features/example_groups/shared_example_group.feature +125 -0
- data/features/hooks/around_hooks.feature +11 -2
- data/features/pending/pending_examples.feature +18 -6
- data/lib/autotest/rspec2.rb +1 -1
- data/lib/rspec/core.rb +1 -0
- data/lib/rspec/core/command_line_configuration.rb +62 -0
- data/lib/rspec/core/configuration.rb +39 -12
- data/lib/rspec/core/configuration_options.rb +5 -5
- data/lib/rspec/core/deprecation.rb +6 -6
- data/lib/rspec/core/errors.rb +1 -1
- data/lib/rspec/core/example.rb +25 -25
- data/lib/rspec/core/example_group.rb +30 -14
- data/lib/rspec/core/formatters/base_formatter.rb +25 -25
- data/lib/rspec/core/formatters/base_text_formatter.rb +11 -10
- data/lib/rspec/core/formatters/documentation_formatter.rb +2 -2
- data/lib/rspec/core/formatters/helpers.rb +6 -6
- data/lib/rspec/core/formatters/html_formatter.rb +13 -12
- data/lib/rspec/core/formatters/progress_formatter.rb +1 -1
- data/lib/rspec/core/formatters/snippet_extractor.rb +5 -5
- data/lib/rspec/core/hooks.rb +3 -3
- data/lib/rspec/core/kernel_extensions.rb +1 -1
- data/lib/rspec/core/let.rb +5 -5
- data/lib/rspec/core/metadata.rb +2 -2
- data/lib/rspec/core/mocking/with_absolutely_nothing.rb +3 -3
- data/lib/rspec/core/mocking/with_mocha.rb +5 -5
- data/lib/rspec/core/mocking/with_rr.rb +3 -3
- data/lib/rspec/core/mocking/with_rspec.rb +3 -3
- data/lib/rspec/core/option_parser.rb +8 -4
- data/lib/rspec/core/rake_task.rb +5 -0
- data/lib/rspec/core/ruby_project.rb +1 -1
- data/lib/rspec/core/shared_example_group.rb +2 -2
- data/lib/rspec/core/subject.rb +10 -4
- data/lib/rspec/core/world.rb +5 -5
- data/rspec-core.gemspec +19 -11
- data/spec/autotest/rspec_spec.rb +14 -14
- data/spec/rspec/core/command_line_configuration_spec.rb +26 -0
- data/spec/rspec/core/command_line_spec.rb +5 -5
- data/spec/rspec/core/configuration_options_spec.rb +20 -20
- data/spec/rspec/core/configuration_spec.rb +10 -10
- data/spec/rspec/core/core_spec.rb +8 -8
- data/spec/rspec/core/deprecations_spec.rb +2 -2
- data/spec/rspec/core/drb_command_line_spec.rb +10 -10
- data/spec/rspec/core/example_group_spec.rb +46 -10
- data/spec/rspec/core/example_spec.rb +46 -12
- data/spec/rspec/core/formatters/base_formatter_spec.rb +2 -46
- data/spec/rspec/core/formatters/base_text_formatter_spec.rb +4 -3
- data/spec/rspec/core/formatters/documentation_formatter_spec.rb +1 -1
- data/spec/rspec/core/formatters/helpers_spec.rb +2 -2
- data/spec/rspec/core/formatters/html_formatted-1.8.7.html +1 -1
- data/spec/rspec/core/formatters/html_formatted-1.9.1.html +1 -1
- data/spec/rspec/core/formatters/html_formatted-1.9.2.html +1 -1
- data/spec/rspec/core/formatters/progress_formatter_spec.rb +10 -9
- data/spec/rspec/core/formatters/text_mate_formatted-1.8.7.html +13 -13
- data/spec/rspec/core/formatters/text_mate_formatted-1.9.2.html +1 -1
- data/spec/rspec/core/let_spec.rb +1 -1
- data/spec/rspec/core/metadata_spec.rb +9 -9
- data/spec/rspec/core/option_parser_spec.rb +3 -3
- data/spec/rspec/core/pending_example_spec.rb +1 -1
- data/spec/rspec/core/resources/custom_example_group_runner.rb +1 -1
- data/spec/rspec/core/runner_spec.rb +4 -4
- data/spec/rspec/core/shared_example_group_spec.rb +66 -162
- data/spec/rspec/core/subject_spec.rb +4 -4
- data/spec/rspec/core/world_spec.rb +38 -38
- metadata +21 -13
@@ -7,13 +7,13 @@ module RSpec
|
|
7
7
|
class ConfigurationOptions
|
8
8
|
LOCAL_OPTIONS_FILE = ".rspec"
|
9
9
|
GLOBAL_OPTIONS_FILE = File.join(File.expand_path("~"), ".rspec")
|
10
|
-
|
10
|
+
|
11
11
|
attr_reader :options
|
12
|
-
|
12
|
+
|
13
13
|
def initialize(args)
|
14
14
|
@args = args
|
15
15
|
end
|
16
|
-
|
16
|
+
|
17
17
|
def configure(config)
|
18
18
|
keys = options.keys
|
19
19
|
keys.unshift(:requires) if keys.delete(:requires)
|
@@ -22,7 +22,7 @@ module RSpec
|
|
22
22
|
config.send("#{key}=", options[key])
|
23
23
|
end
|
24
24
|
end
|
25
|
-
|
25
|
+
|
26
26
|
def drb_argv
|
27
27
|
argv = []
|
28
28
|
argv << "--color" if options[:color_enabled]
|
@@ -73,7 +73,7 @@ module RSpec
|
|
73
73
|
def parse_global_options
|
74
74
|
parse_options_file(GLOBAL_OPTIONS_FILE)
|
75
75
|
end
|
76
|
-
|
76
|
+
|
77
77
|
def parse_options_file(path)
|
78
78
|
Parser.parse(args_from_options_file(path))
|
79
79
|
end
|
@@ -1,8 +1,8 @@
|
|
1
1
|
module RSpec
|
2
|
-
|
2
|
+
|
3
3
|
class << self
|
4
4
|
def deprecate(method, alternate_method=nil, version=nil)
|
5
|
-
version_string = version ? "rspec-#{version}" : "a future version of RSpec"
|
5
|
+
version_string = version ? "rspec-#{version}" : "a future version of RSpec"
|
6
6
|
|
7
7
|
message = <<-NOTICE
|
8
8
|
|
@@ -30,16 +30,16 @@ ADDITIONAL
|
|
30
30
|
end
|
31
31
|
|
32
32
|
class HashWithDeprecationNotice < Hash
|
33
|
-
|
33
|
+
|
34
34
|
def initialize(method, alternate_method=nil, &block)
|
35
35
|
@method, @alternate_method = method, alternate_method
|
36
36
|
end
|
37
|
-
|
37
|
+
|
38
38
|
def []=(k,v)
|
39
39
|
RSpec.deprecate(@method, @alternate_method)
|
40
40
|
super
|
41
41
|
end
|
42
|
-
|
42
|
+
|
43
43
|
end
|
44
|
-
|
44
|
+
|
45
45
|
end
|
data/lib/rspec/core/errors.rb
CHANGED
data/lib/rspec/core/example.rb
CHANGED
@@ -12,14 +12,11 @@ module RSpec
|
|
12
12
|
|
13
13
|
delegate_to_metadata :description, :full_description, :execution_result, :file_path, :pending
|
14
14
|
|
15
|
-
alias_method :inspect, :full_description
|
16
|
-
alias_method :to_s, :full_description
|
17
|
-
|
18
15
|
def initialize(example_group_class, desc, options, example_block=nil)
|
19
16
|
@example_group_class, @options, @example_block = example_group_class, options, example_block
|
20
17
|
@metadata = @example_group_class.metadata.for_example(desc, options)
|
21
18
|
@exception = nil
|
22
|
-
@in_block
|
19
|
+
@pending_declared_in_example = @in_block = false
|
23
20
|
end
|
24
21
|
|
25
22
|
def example_group
|
@@ -35,6 +32,10 @@ module RSpec
|
|
35
32
|
@in_block
|
36
33
|
end
|
37
34
|
|
35
|
+
def pending?
|
36
|
+
!!pending
|
37
|
+
end
|
38
|
+
|
38
39
|
def run(example_group_instance, reporter)
|
39
40
|
@example_group_instance = example_group_instance
|
40
41
|
@example_group_instance.example = self
|
@@ -43,21 +44,20 @@ module RSpec
|
|
43
44
|
|
44
45
|
begin
|
45
46
|
unless pending
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
47
|
+
with_pending_capture do
|
48
|
+
with_around_hooks do
|
49
|
+
begin
|
50
|
+
run_before_each
|
51
|
+
@in_block = true
|
52
|
+
@example_group_instance.instance_eval(&@example_block)
|
53
|
+
rescue Exception => e
|
54
|
+
set_exception(e)
|
55
|
+
ensure
|
56
|
+
@in_block = false
|
57
|
+
run_after_each
|
58
|
+
end
|
56
59
|
end
|
57
|
-
|
58
|
-
# the with_around_hooks method, but it adds 4% to the run time.
|
59
|
-
# Why? (footnote - Dan North made me write this comment)
|
60
|
-
end.call
|
60
|
+
end
|
61
61
|
end
|
62
62
|
rescue Exception => e
|
63
63
|
set_exception(e)
|
@@ -75,15 +75,15 @@ module RSpec
|
|
75
75
|
|
76
76
|
private
|
77
77
|
|
78
|
-
def with_pending_capture
|
78
|
+
def with_pending_capture(&block)
|
79
79
|
@pending_declared_in_example = catch(:pending_declared_in_example) do
|
80
|
-
|
80
|
+
block.call
|
81
81
|
throw :pending_declared_in_example, false
|
82
82
|
end
|
83
83
|
end
|
84
84
|
|
85
85
|
def with_around_hooks(&wrapped_example)
|
86
|
-
@example_group_class.eval_around_eachs(@example_group_instance, wrapped_example)
|
86
|
+
@example_group_class.eval_around_eachs(@example_group_instance, wrapped_example).call
|
87
87
|
end
|
88
88
|
|
89
89
|
def start(reporter)
|
@@ -117,20 +117,20 @@ module RSpec
|
|
117
117
|
end
|
118
118
|
|
119
119
|
def run_before_each
|
120
|
-
@example_group_instance.
|
120
|
+
@example_group_instance.setup_mocks_for_rspec if @example_group_instance.respond_to?(:setup_mocks_for_rspec)
|
121
121
|
@example_group_class.eval_before_eachs(@example_group_instance)
|
122
122
|
end
|
123
123
|
|
124
124
|
def run_after_each
|
125
125
|
@example_group_class.eval_after_eachs(@example_group_instance)
|
126
|
-
@example_group_instance.
|
126
|
+
@example_group_instance.verify_mocks_for_rspec if @example_group_instance.respond_to?(:verify_mocks_for_rspec)
|
127
127
|
ensure
|
128
|
-
@example_group_instance.
|
128
|
+
@example_group_instance.teardown_mocks_for_rspec if @example_group_instance.respond_to?(:teardown_mocks_for_rspec)
|
129
129
|
end
|
130
130
|
|
131
131
|
def assign_auto_description
|
132
132
|
if description.empty?
|
133
|
-
metadata[:description] = RSpec::Matchers.generated_description
|
133
|
+
metadata[:description] = RSpec::Matchers.generated_description
|
134
134
|
RSpec::Matchers.clear_generated_description
|
135
135
|
end
|
136
136
|
end
|
@@ -59,16 +59,28 @@ module RSpec
|
|
59
59
|
alias_example_to :focused, :focused => true
|
60
60
|
alias_example_to :pending, :pending => true
|
61
61
|
|
62
|
-
def self.
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
raise "Could not find shared example group named
|
62
|
+
def self.define_shared_group_method(new_name, report_label=nil)
|
63
|
+
report_label = "it should behave like" unless report_label
|
64
|
+
module_eval(<<-END_RUBY, __FILE__, __LINE__)
|
65
|
+
def self.#{new_name}(name, &customization_block)
|
66
|
+
shared_block = world.shared_example_groups[name]
|
67
|
+
raise "Could not find shared example group named \#{name.inspect}" unless shared_block
|
68
|
+
|
69
|
+
shared_group = describe("#{report_label} \#{name}", &shared_block)
|
70
|
+
shared_group.class_eval(&customization_block) if customization_block
|
71
|
+
shared_group
|
68
72
|
end
|
69
|
-
|
73
|
+
END_RUBY
|
70
74
|
end
|
71
75
|
|
76
|
+
define_shared_group_method :it_should_behave_like
|
77
|
+
|
78
|
+
class << self
|
79
|
+
alias_method :alias_it_should_behave_like_to, :define_shared_group_method
|
80
|
+
end
|
81
|
+
|
82
|
+
alias_it_should_behave_like_to :it_behaves_like, "behaves like"
|
83
|
+
|
72
84
|
def self.examples
|
73
85
|
@examples ||= []
|
74
86
|
end
|
@@ -82,7 +94,7 @@ module RSpec
|
|
82
94
|
end
|
83
95
|
|
84
96
|
def self.metadata
|
85
|
-
@metadata
|
97
|
+
@metadata if defined?(@metadata)
|
86
98
|
end
|
87
99
|
|
88
100
|
def self.superclass_metadata
|
@@ -111,7 +123,7 @@ module RSpec
|
|
111
123
|
|
112
124
|
def self.subclass(parent, args, &example_group_block)
|
113
125
|
subclass = Class.new(parent)
|
114
|
-
subclass.set_it_up(*args)
|
126
|
+
subclass.set_it_up(*args)
|
115
127
|
subclass.module_eval(&example_group_block) if example_group_block
|
116
128
|
subclass
|
117
129
|
end
|
@@ -128,6 +140,10 @@ module RSpec
|
|
128
140
|
@_ancestors ||= super().select {|a| a < RSpec::Core::ExampleGroup}
|
129
141
|
end
|
130
142
|
|
143
|
+
def self.top_level?
|
144
|
+
ancestors.size == 1
|
145
|
+
end
|
146
|
+
|
131
147
|
def self.set_it_up(*args)
|
132
148
|
@metadata = RSpec::Core::Metadata.new(superclass_metadata).process(*args)
|
133
149
|
|
@@ -143,7 +159,7 @@ module RSpec
|
|
143
159
|
def self.eval_before_alls(example)
|
144
160
|
return if descendant_filtered_examples.empty?
|
145
161
|
superclass.before_all_ivars.each { |ivar, val| example.instance_variable_set(ivar, val) }
|
146
|
-
world.run_hook_filtered(:before, :all, self, example)
|
162
|
+
world.run_hook_filtered(:before, :all, self, example) if top_level?
|
147
163
|
|
148
164
|
run_hook!(:before, :all, example)
|
149
165
|
example.instance_variables.each { |ivar| before_all_ivars[ivar] = example.instance_variable_get(ivar) }
|
@@ -173,13 +189,14 @@ module RSpec
|
|
173
189
|
def self.eval_after_alls(example)
|
174
190
|
return if descendant_filtered_examples.empty?
|
175
191
|
before_all_ivars.each { |ivar, val| example.instance_variable_set(ivar, val) }
|
176
|
-
|
177
|
-
world.run_hook_filtered(:after, :all, self, example)
|
192
|
+
run_hook!(:after, :all, example)
|
193
|
+
world.run_hook_filtered(:after, :all, self, example) if top_level?
|
178
194
|
end
|
179
195
|
|
180
196
|
def self.run(reporter)
|
197
|
+
@reporter = reporter
|
181
198
|
example_group_instance = new
|
182
|
-
reporter.
|
199
|
+
reporter.example_group_started(self)
|
183
200
|
begin
|
184
201
|
eval_before_alls(example_group_instance)
|
185
202
|
result_for_this_group = run_examples(example_group_instance, reporter)
|
@@ -248,7 +265,6 @@ module RSpec
|
|
248
265
|
:extend => extended_modules
|
249
266
|
}
|
250
267
|
end
|
251
|
-
|
252
268
|
end
|
253
269
|
end
|
254
270
|
end
|
@@ -35,9 +35,12 @@ module RSpec
|
|
35
35
|
start(count)
|
36
36
|
begin
|
37
37
|
yield self
|
38
|
-
ensure
|
39
38
|
stop
|
40
|
-
|
39
|
+
start_dump
|
40
|
+
dump_summary(duration, example_count, failure_count, pending_count)
|
41
|
+
dump_pending
|
42
|
+
dump_failures
|
43
|
+
ensure
|
41
44
|
close
|
42
45
|
end
|
43
46
|
end
|
@@ -47,15 +50,25 @@ module RSpec
|
|
47
50
|
# they have all been collected. This can be useful for special
|
48
51
|
# formatters that need to provide progress on feedback (graphical ones)
|
49
52
|
#
|
50
|
-
# This
|
51
|
-
# is #
|
53
|
+
# This will only be invoked once, and the next one to be invoked
|
54
|
+
# is #example_group_started
|
52
55
|
def start(example_count)
|
53
|
-
@start = Time.now
|
54
56
|
@example_count = example_count
|
57
|
+
@start = Time.now
|
55
58
|
end
|
56
59
|
|
57
|
-
|
58
|
-
|
60
|
+
# This method is invoked at the beginning of the execution of each example group.
|
61
|
+
# +example_group+ is the example_group.
|
62
|
+
#
|
63
|
+
# The next method to be invoked after this is +example_passed+,
|
64
|
+
# +example_pending+, or +example_finished+
|
65
|
+
def example_group_started(example_group)
|
66
|
+
@example_group = example_group
|
67
|
+
end
|
68
|
+
|
69
|
+
def add_example_group(example_group)
|
70
|
+
RSpec.deprecate("add_example_group", "example_group_started")
|
71
|
+
example_group_started(example_group)
|
59
72
|
end
|
60
73
|
|
61
74
|
def example_started(example)
|
@@ -74,26 +87,13 @@ module RSpec
|
|
74
87
|
def message(message)
|
75
88
|
end
|
76
89
|
|
77
|
-
|
78
|
-
|
79
|
-
#
|
80
|
-
# The next method to be invoked after this is +example_passed+,
|
81
|
-
# +example_pending+, or +example_finished+
|
82
|
-
def add_example_group(example_group)
|
83
|
-
@example_group = example_group
|
84
|
-
end
|
85
|
-
|
86
|
-
def dump(duration)
|
87
|
-
start_dump(duration)
|
88
|
-
dump_failures
|
89
|
-
dump_summary
|
90
|
-
dump_pending
|
90
|
+
def stop
|
91
|
+
@duration = Time.now - @start
|
91
92
|
end
|
92
93
|
|
93
94
|
# This method is invoked after all of the examples have executed. The next method
|
94
95
|
# to be invoked after this one is #dump_failure (once for each failed example),
|
95
|
-
def start_dump
|
96
|
-
@duration = duration
|
96
|
+
def start_dump
|
97
97
|
end
|
98
98
|
|
99
99
|
# Dumps detailed information about each example failure.
|
@@ -101,7 +101,7 @@ module RSpec
|
|
101
101
|
end
|
102
102
|
|
103
103
|
# This method is invoked after the dumping of examples and failures.
|
104
|
-
def dump_summary
|
104
|
+
def dump_summary(duration, example_count, failure_count, pending_count)
|
105
105
|
end
|
106
106
|
|
107
107
|
# This gets invoked after the summary if option is set to do so.
|
@@ -118,7 +118,7 @@ module RSpec
|
|
118
118
|
|
119
119
|
cleansed = backtrace.select { |line| backtrace_line(line) }
|
120
120
|
# Kick the describe stack info off the list, just keep the line the problem happened on from that file
|
121
|
-
# cleansed = [cleansed.detect { |line| line.split(':').first == example.metadata[:caller].split(':').first }] if cleansed.size > 1
|
121
|
+
# cleansed = [cleansed.detect { |line| line.split(':').first == example.metadata[:caller].split(':').first }] if cleansed.size > 1
|
122
122
|
cleansed.empty? ? backtrace : cleansed
|
123
123
|
end
|
124
124
|
|
@@ -14,10 +14,10 @@ module RSpec
|
|
14
14
|
exception = failed_example.execution_result[:exception_encountered]
|
15
15
|
padding = ' '
|
16
16
|
if exception.is_a?(RSpec::Core::PendingExampleFixedError)
|
17
|
-
output.puts "#{index.next}) #{failed_example} FIXED"
|
17
|
+
output.puts "#{index.next}) #{failed_example.full_description} FIXED"
|
18
18
|
output.puts "#{padding}Expected pending '#{failed_example.metadata[:execution_result][:pending_message]}' to fail. No Error was raised."
|
19
19
|
else
|
20
|
-
output.puts "#{index.next}) #{failed_example}"
|
20
|
+
output.puts "#{index.next}) #{failed_example.full_description}"
|
21
21
|
output.puts "#{padding}Failure/Error: #{read_failed_line(exception, failed_example).strip}"
|
22
22
|
exception.message.split("\n").each do |line|
|
23
23
|
output.puts "#{padding}#{red(line)}"
|
@@ -28,7 +28,7 @@ module RSpec
|
|
28
28
|
output.puts grey("#{padding}# #{backtrace_info}")
|
29
29
|
end
|
30
30
|
|
31
|
-
output.puts
|
31
|
+
output.puts
|
32
32
|
end
|
33
33
|
end
|
34
34
|
|
@@ -43,8 +43,8 @@ module RSpec
|
|
43
43
|
red(summary)
|
44
44
|
end
|
45
45
|
end
|
46
|
-
|
47
|
-
def dump_summary
|
46
|
+
|
47
|
+
def dump_summary(duration, example_count, failure_count, pending_count)
|
48
48
|
output.puts "\nFinished in #{format_seconds(duration)} seconds\n"
|
49
49
|
|
50
50
|
output.puts colorise_summary(summary_line(example_count, failure_count, pending_count))
|
@@ -52,7 +52,7 @@ module RSpec
|
|
52
52
|
# Don't print out profiled info if there are failures, it just clutters the output
|
53
53
|
if profile_examples? && failure_count == 0
|
54
54
|
sorted_examples = examples.sort_by { |example| example.execution_result[:run_time] }.reverse.first(10)
|
55
|
-
output.puts "\nTop #{sorted_examples.size} slowest examples:\n"
|
55
|
+
output.puts "\nTop #{sorted_examples.size} slowest examples:\n"
|
56
56
|
sorted_examples.each do |example|
|
57
57
|
output.puts " (#{format_seconds(example.execution_result[:run_time])} seconds) #{example}"
|
58
58
|
output.puts grey(" # #{format_caller(example.metadata[:location])}")
|
@@ -63,7 +63,7 @@ module RSpec
|
|
63
63
|
def summary_line(example_count, failure_count, pending_count)
|
64
64
|
summary = pluralize(example_count, "example")
|
65
65
|
summary << ", " << pluralize(failure_count, "failure")
|
66
|
-
summary << ", #{pending_count} pending" if pending_count > 0
|
66
|
+
summary << ", #{pending_count} pending" if pending_count > 0
|
67
67
|
summary
|
68
68
|
end
|
69
69
|
|
@@ -72,8 +72,9 @@ module RSpec
|
|
72
72
|
output.puts
|
73
73
|
output.puts "Pending:"
|
74
74
|
pending_examples.each do |pending_example|
|
75
|
-
output.puts " #{pending_example
|
76
|
-
output.puts grey("
|
75
|
+
output.puts yellow(" #{pending_example.full_description}")
|
76
|
+
output.puts grey(" # #{pending_example.metadata[:execution_result][:pending_message]}")
|
77
|
+
output.puts grey(" # #{format_caller(pending_example.metadata[:location])}")
|
77
78
|
end
|
78
79
|
end
|
79
80
|
end
|
@@ -127,7 +128,7 @@ module RSpec
|
|
127
128
|
end
|
128
129
|
|
129
130
|
def format_caller(caller_info)
|
130
|
-
caller_info.to_s.split(':in `block').first
|
131
|
+
backtrace_line(caller_info.to_s.split(':in `block').first)
|
131
132
|
end
|
132
133
|
|
133
134
|
end
|
@@ -9,7 +9,7 @@ module RSpec
|
|
9
9
|
@previous_nested_example_groups = []
|
10
10
|
end
|
11
11
|
|
12
|
-
def
|
12
|
+
def example_group_started(example_group)
|
13
13
|
super
|
14
14
|
|
15
15
|
example_group_chain.each_with_index do |nested_example_group, i|
|
@@ -21,7 +21,7 @@ module RSpec
|
|
21
21
|
|
22
22
|
@previous_nested_example_groups = example_group_chain
|
23
23
|
end
|
24
|
-
|
24
|
+
|
25
25
|
def example_passed(example)
|
26
26
|
super
|
27
27
|
output.puts passed_output(example)
|