rspec-core 2.12.2 → 2.13.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/Changelog.md +31 -0
- data/README.md +11 -10
- data/features/command_line/example_name_option.feature +6 -10
- data/features/command_line/tag.feature +15 -8
- data/features/configuration/backtrace_clean_patterns.feature +102 -0
- data/features/configuration/failure_exit_code.feature +36 -0
- data/features/configuration/order_and_seed.feature +3 -0
- data/features/configuration/output_stream.feature +24 -0
- data/features/configuration/pattern.feature +30 -0
- data/features/configuration/profile.feature +163 -0
- data/features/configuration/run_all_when_everything_filtered.feature +60 -0
- data/features/configuration/show_failures_in_pending_blocks.feature +61 -0
- data/features/configuration/treat_symbols_as_metadata_keys_with_true_values.feature +52 -0
- data/features/filtering/exclusion_filters.feature +1 -2
- data/features/formatters/configurable_colors.feature +31 -0
- data/features/step_definitions/additional_cli_steps.rb +21 -0
- data/features/subject/explicit_subject.feature +19 -0
- data/lib/autotest/rspec2.rb +1 -1
- data/lib/rspec/core.rb +1 -2
- data/lib/rspec/core/configuration.rb +33 -3
- data/lib/rspec/core/configuration_options.rb +5 -5
- data/lib/rspec/core/deprecation.rb +1 -1
- data/lib/rspec/core/example.rb +2 -2
- data/lib/rspec/core/example_group.rb +1 -3
- data/lib/rspec/core/formatters/base_text_formatter.rb +93 -27
- data/lib/rspec/core/formatters/documentation_formatter.rb +3 -3
- data/lib/rspec/core/formatters/progress_formatter.rb +3 -3
- data/lib/rspec/core/memoized_helpers.rb +425 -0
- data/lib/rspec/core/metadata.rb +6 -2
- data/lib/rspec/core/option_parser.rb +8 -2
- data/lib/rspec/core/pending.rb +7 -0
- data/lib/rspec/core/shared_context.rb +1 -1
- data/lib/rspec/core/version.rb +1 -1
- data/spec/autotest/failed_results_re_spec.rb +4 -4
- data/spec/autotest/rspec_spec.rb +25 -20
- data/spec/command_line/order_spec.rb +21 -21
- data/spec/rspec/core/command_line_spec.rb +6 -6
- data/spec/rspec/core/configuration_options_spec.rb +86 -72
- data/spec/rspec/core/configuration_spec.rb +161 -156
- data/spec/rspec/core/deprecations_spec.rb +4 -4
- data/spec/rspec/core/drb_command_line_spec.rb +9 -9
- data/spec/rspec/core/drb_options_spec.rb +46 -33
- data/spec/rspec/core/dsl_spec.rb +3 -3
- data/spec/rspec/core/example_group_spec.rb +156 -124
- data/spec/rspec/core/example_spec.rb +68 -52
- data/spec/rspec/core/filter_manager_spec.rb +36 -36
- data/spec/rspec/core/formatters/base_formatter_spec.rb +9 -9
- data/spec/rspec/core/formatters/base_text_formatter_spec.rb +104 -42
- data/spec/rspec/core/formatters/documentation_formatter_spec.rb +4 -4
- data/spec/rspec/core/formatters/helpers_spec.rb +13 -13
- data/spec/rspec/core/formatters/html_formatted-1.8.7-jruby.html +5 -17
- data/spec/rspec/core/formatters/html_formatted-1.8.7-rbx.html +159 -44
- data/spec/rspec/core/formatters/html_formatted-1.8.7.html +14 -14
- data/spec/rspec/core/formatters/html_formatted-1.9.2.html +20 -20
- data/spec/rspec/core/formatters/html_formatted-1.9.3-jruby.html +5 -5
- data/spec/rspec/core/formatters/html_formatted-1.9.3-rbx.html +159 -44
- data/spec/rspec/core/formatters/html_formatted-1.9.3.html +20 -20
- data/spec/rspec/core/formatters/{html_formatted-1.9.2-jruby.html → html_formatted-2.0.0.html} +24 -18
- data/spec/rspec/core/formatters/html_formatter_spec.rb +9 -5
- data/spec/rspec/core/formatters/json_formatter_spec.rb +9 -9
- data/spec/rspec/core/formatters/progress_formatter_spec.rb +4 -4
- data/spec/rspec/core/formatters/snippet_extractor_spec.rb +3 -3
- data/spec/rspec/core/formatters/text_mate_formatted-1.8.7-jruby.html +5 -17
- data/spec/rspec/core/formatters/text_mate_formatted-1.8.7-rbx.html +159 -44
- data/spec/rspec/core/formatters/text_mate_formatted-1.8.7.html +16 -16
- data/spec/rspec/core/formatters/text_mate_formatted-1.9.2.html +23 -23
- data/spec/rspec/core/formatters/text_mate_formatted-1.9.3-jruby.html +5 -17
- data/spec/rspec/core/formatters/text_mate_formatted-1.9.3-rbx.html +159 -44
- data/spec/rspec/core/formatters/text_mate_formatted-1.9.3.html +23 -23
- data/spec/rspec/core/formatters/{text_mate_formatted-1.9.2-jruby.html → text_mate_formatted-2.0.0.html} +25 -19
- data/spec/rspec/core/formatters/text_mate_formatter_spec.rb +8 -4
- data/spec/rspec/core/hooks_filtering_spec.rb +16 -16
- data/spec/rspec/core/hooks_spec.rb +11 -11
- data/spec/rspec/core/kernel_extensions_spec.rb +1 -1
- data/spec/rspec/core/memoized_helpers_spec.rb +458 -0
- data/spec/rspec/core/metadata_spec.rb +74 -74
- data/spec/rspec/core/option_parser_spec.rb +27 -27
- data/spec/rspec/core/pending_example_spec.rb +32 -32
- data/spec/rspec/core/project_initializer_spec.rb +8 -8
- data/spec/rspec/core/rake_task_spec.rb +16 -16
- data/spec/rspec/core/reporter_spec.rb +3 -3
- data/spec/rspec/core/resources/formatter_specs.rb +4 -4
- data/spec/rspec/core/ruby_project_spec.rb +4 -2
- data/spec/rspec/core/shared_context_spec.rb +34 -7
- data/spec/rspec/core/shared_example_group_spec.rb +14 -14
- data/spec/rspec/core/world_spec.rb +9 -9
- data/spec/rspec/core_spec.rb +5 -5
- data/spec/spec_helper.rb +4 -0
- data/spec/support/shared_example_groups.rb +4 -4
- data/spec/support/spec_files.rb +2 -2
- metadata +158 -150
- data/lib/rspec/core/let.rb +0 -110
- data/lib/rspec/core/subject.rb +0 -223
- data/spec/rspec/core/let_spec.rb +0 -55
- data/spec/rspec/core/subject_spec.rb +0 -255
|
@@ -319,15 +319,17 @@ a {
|
|
|
319
319
|
<span class="duration">n.nnnns</span>
|
|
320
320
|
<div class="failure" id="failure_1">
|
|
321
321
|
<div class="message"><pre>RSpec::Core::Pending::PendingExampleFixedError</pre></div>
|
|
322
|
-
<div class="backtrace"><pre><a href="txmt://open?url=file:///Users/
|
|
323
|
-
<a href="txmt://open?url=file:///Users/
|
|
324
|
-
<a href="txmt://open?url=file:///Users/
|
|
325
|
-
<a href="txmt://open?url=file:///Users/
|
|
326
|
-
<a href="txmt://open?url=file:///Users/
|
|
322
|
+
<div class="backtrace"><pre><a href="txmt://open?url=file:///Users/myron/code/rspec-dev/repos/rspec-core/spec/rspec/core/resources/formatter_specs.rb&line=18">./spec/rspec/core/resources/formatter_specs.rb:18</a> :in `block (3 levels) in <top (required)>'
|
|
323
|
+
<a href="txmt://open?url=file:///Users/myron/code/rspec-dev/repos/rspec-core/spec/rspec/core/formatters/text_mate_formatter_spec.rb&line=36">./spec/rspec/core/formatters/text_mate_formatter_spec.rb:36</a> :in `block (2 levels) in <module:Formatters>'
|
|
324
|
+
<a href="txmt://open?url=file:///Users/myron/code/rspec-dev/repos/rspec-core/spec/rspec/core/formatters/text_mate_formatter_spec.rb&line=58">./spec/rspec/core/formatters/text_mate_formatter_spec.rb:58</a> :in `block (5 levels) in <module:Formatters>'
|
|
325
|
+
<a href="txmt://open?url=file:///Users/myron/code/rspec-dev/repos/rspec-core/spec/rspec/core/formatters/text_mate_formatter_spec.rb&line=58">./spec/rspec/core/formatters/text_mate_formatter_spec.rb:58</a> :in `open'
|
|
326
|
+
<a href="txmt://open?url=file:///Users/myron/code/rspec-dev/repos/rspec-core/spec/rspec/core/formatters/text_mate_formatter_spec.rb&line=58">./spec/rspec/core/formatters/text_mate_formatter_spec.rb:58</a> :in `block (4 levels) in <module:Formatters>'
|
|
327
|
+
<a href="txmt://open?url=file:///Users/myron/code/rspec-dev/repos/rspec-core/spec/rspec/core/formatters/text_mate_formatter_spec.rb&line=57">./spec/rspec/core/formatters/text_mate_formatter_spec.rb:57</a> :in `chdir'
|
|
328
|
+
<a href="txmt://open?url=file:///Users/myron/code/rspec-dev/repos/rspec-core/spec/rspec/core/formatters/text_mate_formatter_spec.rb&line=57">./spec/rspec/core/formatters/text_mate_formatter_spec.rb:57</a> :in `block (3 levels) in <module:Formatters>'</pre></div>
|
|
327
329
|
<pre class="ruby"><code><span class="linenum">16</span> <span class="ident">context</span> <span class="punct">"</span><span class="string">with content that would pass</span><span class="punct">"</span> <span class="keyword">do</span>
|
|
328
330
|
<span class="linenum">17</span> <span class="ident">it</span> <span class="punct">"</span><span class="string">fails</span><span class="punct">"</span> <span class="keyword">do</span>
|
|
329
331
|
<span class="offending"><span class="linenum">18</span> <span class="ident">pending</span> <span class="keyword">do</span></span>
|
|
330
|
-
<span class="linenum">19</span> <span class="number">1</span><span class="punct"
|
|
332
|
+
<span class="linenum">19</span> <span class="ident">expect</span><span class="punct">(</span><span class="number">1</span><span class="punct">).</span><span class="ident">to</span> <span class="ident">eq</span><span class="punct">(</span><span class="number">1</span><span class="punct">)</span>
|
|
331
333
|
<span class="linenum">20</span> <span class="keyword">end</span></code></pre>
|
|
332
334
|
</div>
|
|
333
335
|
</dd>
|
|
@@ -356,14 +358,16 @@ expected: 2
|
|
|
356
358
|
|
|
357
359
|
(compared using ==)
|
|
358
360
|
</pre></div>
|
|
359
|
-
<div class="backtrace"><pre><a href="txmt://open?url=file:///Users/
|
|
360
|
-
<a href="txmt://open?url=file:///Users/
|
|
361
|
-
<a href="txmt://open?url=file:///Users/
|
|
362
|
-
<a href="txmt://open?url=file:///Users/
|
|
363
|
-
<a href="txmt://open?url=file:///Users/
|
|
361
|
+
<div class="backtrace"><pre><a href="txmt://open?url=file:///Users/myron/code/rspec-dev/repos/rspec-core/spec/rspec/core/resources/formatter_specs.rb&line=33">./spec/rspec/core/resources/formatter_specs.rb:33</a> :in `block (2 levels) in <top (required)>'
|
|
362
|
+
<a href="txmt://open?url=file:///Users/myron/code/rspec-dev/repos/rspec-core/spec/rspec/core/formatters/text_mate_formatter_spec.rb&line=36">./spec/rspec/core/formatters/text_mate_formatter_spec.rb:36</a> :in `block (2 levels) in <module:Formatters>'
|
|
363
|
+
<a href="txmt://open?url=file:///Users/myron/code/rspec-dev/repos/rspec-core/spec/rspec/core/formatters/text_mate_formatter_spec.rb&line=58">./spec/rspec/core/formatters/text_mate_formatter_spec.rb:58</a> :in `block (5 levels) in <module:Formatters>'
|
|
364
|
+
<a href="txmt://open?url=file:///Users/myron/code/rspec-dev/repos/rspec-core/spec/rspec/core/formatters/text_mate_formatter_spec.rb&line=58">./spec/rspec/core/formatters/text_mate_formatter_spec.rb:58</a> :in `open'
|
|
365
|
+
<a href="txmt://open?url=file:///Users/myron/code/rspec-dev/repos/rspec-core/spec/rspec/core/formatters/text_mate_formatter_spec.rb&line=58">./spec/rspec/core/formatters/text_mate_formatter_spec.rb:58</a> :in `block (4 levels) in <module:Formatters>'
|
|
366
|
+
<a href="txmt://open?url=file:///Users/myron/code/rspec-dev/repos/rspec-core/spec/rspec/core/formatters/text_mate_formatter_spec.rb&line=57">./spec/rspec/core/formatters/text_mate_formatter_spec.rb:57</a> :in `chdir'
|
|
367
|
+
<a href="txmt://open?url=file:///Users/myron/code/rspec-dev/repos/rspec-core/spec/rspec/core/formatters/text_mate_formatter_spec.rb&line=57">./spec/rspec/core/formatters/text_mate_formatter_spec.rb:57</a> :in `block (3 levels) in <module:Formatters>'</pre></div>
|
|
364
368
|
<pre class="ruby"><code><span class="linenum">31</span><span class="ident">describe</span> <span class="punct">"</span><span class="string">failing spec</span><span class="punct">"</span> <span class="keyword">do</span>
|
|
365
369
|
<span class="linenum">32</span> <span class="ident">it</span> <span class="punct">"</span><span class="string">fails</span><span class="punct">"</span> <span class="keyword">do</span>
|
|
366
|
-
<span class="offending"><span class="linenum">33</span> <span class="number">1</span><span class="punct"
|
|
370
|
+
<span class="offending"><span class="linenum">33</span> <span class="ident">expect</span><span class="punct">(</span><span class="number">1</span><span class="punct">).</span><span class="ident">to</span> <span class="ident">eq</span><span class="punct">(</span><span class="number">2</span><span class="punct">)</span></span>
|
|
367
371
|
<span class="linenum">34</span> <span class="keyword">end</span>
|
|
368
372
|
<span class="linenum">35</span><span class="keyword">end</span></code></pre>
|
|
369
373
|
</div>
|
|
@@ -381,12 +385,14 @@ expected: 2
|
|
|
381
385
|
<span class="duration">n.nnnns</span>
|
|
382
386
|
<div class="failure" id="failure_3">
|
|
383
387
|
<div class="message"><pre>foo</pre></div>
|
|
384
|
-
<div class="backtrace"><pre>(erb):1:in
|
|
385
|
-
<a href="txmt://open?url=file:///Users/
|
|
386
|
-
<a href="txmt://open?url=file:///Users/
|
|
387
|
-
<a href="txmt://open?url=file:///Users/
|
|
388
|
-
<a href="txmt://open?url=file:///Users/
|
|
389
|
-
<a href="txmt://open?url=file:///Users/
|
|
388
|
+
<div class="backtrace"><pre>(erb):1:in `<main>'
|
|
389
|
+
<a href="txmt://open?url=file:///Users/myron/code/rspec-dev/repos/rspec-core/spec/rspec/core/resources/formatter_specs.rb&line=41">./spec/rspec/core/resources/formatter_specs.rb:41</a> :in `block (2 levels) in <top (required)>'
|
|
390
|
+
<a href="txmt://open?url=file:///Users/myron/code/rspec-dev/repos/rspec-core/spec/rspec/core/formatters/text_mate_formatter_spec.rb&line=36">./spec/rspec/core/formatters/text_mate_formatter_spec.rb:36</a> :in `block (2 levels) in <module:Formatters>'
|
|
391
|
+
<a href="txmt://open?url=file:///Users/myron/code/rspec-dev/repos/rspec-core/spec/rspec/core/formatters/text_mate_formatter_spec.rb&line=58">./spec/rspec/core/formatters/text_mate_formatter_spec.rb:58</a> :in `block (5 levels) in <module:Formatters>'
|
|
392
|
+
<a href="txmt://open?url=file:///Users/myron/code/rspec-dev/repos/rspec-core/spec/rspec/core/formatters/text_mate_formatter_spec.rb&line=58">./spec/rspec/core/formatters/text_mate_formatter_spec.rb:58</a> :in `open'
|
|
393
|
+
<a href="txmt://open?url=file:///Users/myron/code/rspec-dev/repos/rspec-core/spec/rspec/core/formatters/text_mate_formatter_spec.rb&line=58">./spec/rspec/core/formatters/text_mate_formatter_spec.rb:58</a> :in `block (4 levels) in <module:Formatters>'
|
|
394
|
+
<a href="txmt://open?url=file:///Users/myron/code/rspec-dev/repos/rspec-core/spec/rspec/core/formatters/text_mate_formatter_spec.rb&line=57">./spec/rspec/core/formatters/text_mate_formatter_spec.rb:57</a> :in `chdir'
|
|
395
|
+
<a href="txmt://open?url=file:///Users/myron/code/rspec-dev/repos/rspec-core/spec/rspec/core/formatters/text_mate_formatter_spec.rb&line=57">./spec/rspec/core/formatters/text_mate_formatter_spec.rb:57</a> :in `block (3 levels) in <module:Formatters>'</pre></div>
|
|
390
396
|
<pre class="ruby"><code><span class="linenum">-1</span><span class="comment"># Couldn't get snippet for (erb)</span></code></pre>
|
|
391
397
|
</div>
|
|
392
398
|
</dd>
|
|
@@ -396,7 +402,7 @@ expected: 2
|
|
|
396
402
|
<span class="duration">n.nnnns</span>
|
|
397
403
|
<div class="failure" id="failure_4">
|
|
398
404
|
<div class="message"><pre>Exception</pre></div>
|
|
399
|
-
<div class="backtrace"><pre><a href="txmt://open?url=file:///foo.html.erb&line=1">/foo.html.erb:1</a> :in `<main>
|
|
405
|
+
<div class="backtrace"><pre><a href="txmt://open?url=file:///foo.html.erb&line=1">/foo.html.erb:1</a> :in `<main>': foo (RuntimeError)</pre></div>
|
|
400
406
|
<pre class="ruby"><code><span class="linenum">-1</span><span class="comment"># Couldn't get snippet for /foo.html.erb</span></code></pre>
|
|
401
407
|
</div>
|
|
402
408
|
</dd>
|
|
@@ -27,7 +27,11 @@ module RSpec
|
|
|
27
27
|
%w[spec/rspec/core/resources/formatter_specs.rb --format textmate --order default]
|
|
28
28
|
)
|
|
29
29
|
options.parse_options
|
|
30
|
+
|
|
30
31
|
err, out = StringIO.new, StringIO.new
|
|
32
|
+
err.set_encoding("utf-8") if err.respond_to?(:set_encoding)
|
|
33
|
+
out.set_encoding("utf-8") if out.respond_to?(:set_encoding)
|
|
34
|
+
|
|
31
35
|
command_line = RSpec::Core::CommandLine.new(options)
|
|
32
36
|
command_line.run(err, out)
|
|
33
37
|
out.string.gsub(/\d+\.\d+(s| seconds)/, "n.nnnn\\1")
|
|
@@ -65,10 +69,10 @@ module RSpec
|
|
|
65
69
|
expected_doc = Nokogiri::HTML(expected_html)
|
|
66
70
|
expected_doc.search("div.backtrace").remove
|
|
67
71
|
|
|
68
|
-
actual_doc.inner_html.
|
|
72
|
+
expect(actual_doc.inner_html).to eq(expected_doc.inner_html)
|
|
69
73
|
|
|
70
74
|
backtrace_lines.each do |backtrace_line|
|
|
71
|
-
backtrace_line['href'].
|
|
75
|
+
expect(backtrace_line['href']).to include("txmt://open?url=")
|
|
72
76
|
end
|
|
73
77
|
end
|
|
74
78
|
end
|
|
@@ -77,12 +81,12 @@ module RSpec
|
|
|
77
81
|
Dir.chdir(root) do
|
|
78
82
|
actual_doc = Nokogiri::HTML(generated_html)
|
|
79
83
|
|
|
80
|
-
actual_doc.inner_html.
|
|
84
|
+
expect(actual_doc.inner_html).to include('(erb):1')
|
|
81
85
|
end
|
|
82
86
|
end
|
|
83
87
|
|
|
84
88
|
it "has a backtrace line from a erb source file we forced to appear" do
|
|
85
|
-
generated_html.
|
|
89
|
+
expect(generated_html).to include('open?url=file:///foo.html.erb')
|
|
86
90
|
end
|
|
87
91
|
|
|
88
92
|
end
|
|
@@ -15,7 +15,7 @@ module RSpec::Core
|
|
|
15
15
|
group = ExampleGroup.describe
|
|
16
16
|
group.example("example") {}
|
|
17
17
|
group.run
|
|
18
|
-
filters.
|
|
18
|
+
expect(filters).to eq([
|
|
19
19
|
"before all in config",
|
|
20
20
|
"around each in config",
|
|
21
21
|
"before each in config",
|
|
@@ -38,7 +38,7 @@ module RSpec::Core
|
|
|
38
38
|
group = ExampleGroup.describe(:match => true)
|
|
39
39
|
group.example("example") {}
|
|
40
40
|
group.run
|
|
41
|
-
filters.
|
|
41
|
+
expect(filters).to eq([
|
|
42
42
|
"around each in config",
|
|
43
43
|
"before each in config",
|
|
44
44
|
"after each in config"
|
|
@@ -58,7 +58,7 @@ module RSpec::Core
|
|
|
58
58
|
group = ExampleGroup.describe(:match => true)
|
|
59
59
|
group.example("example") {}
|
|
60
60
|
group.run
|
|
61
|
-
filters.
|
|
61
|
+
expect(filters).to eq([
|
|
62
62
|
"before all in config",
|
|
63
63
|
"around each in config",
|
|
64
64
|
"before each in config",
|
|
@@ -84,9 +84,9 @@ module RSpec::Core
|
|
|
84
84
|
end
|
|
85
85
|
group.run
|
|
86
86
|
|
|
87
|
-
example_1_filters.
|
|
88
|
-
example_2_filters.
|
|
89
|
-
filters.
|
|
87
|
+
expect(example_1_filters).to be_empty
|
|
88
|
+
expect(example_2_filters).to eq([:before_all])
|
|
89
|
+
expect(filters).to eq([:before_all, :after_all])
|
|
90
90
|
end
|
|
91
91
|
|
|
92
92
|
it "runs before|after :all hooks only on the highest level group that matches the filter" do
|
|
@@ -109,11 +109,11 @@ module RSpec::Core
|
|
|
109
109
|
end
|
|
110
110
|
group.run
|
|
111
111
|
|
|
112
|
-
example_1_filters.
|
|
113
|
-
example_2_filters.
|
|
114
|
-
example_3_filters.
|
|
112
|
+
expect(example_1_filters).to eq([:before_all])
|
|
113
|
+
expect(example_2_filters).to eq([:before_all])
|
|
114
|
+
expect(example_3_filters).to eq([:before_all])
|
|
115
115
|
|
|
116
|
-
filters.
|
|
116
|
+
expect(filters).to eq([:before_all, :after_all])
|
|
117
117
|
end
|
|
118
118
|
|
|
119
119
|
it "does not run if the filter doesn't match the example group's filter" do
|
|
@@ -128,7 +128,7 @@ module RSpec::Core
|
|
|
128
128
|
group = ExampleGroup.describe(:match => true)
|
|
129
129
|
group.example("example") {}
|
|
130
130
|
group.run
|
|
131
|
-
filters.
|
|
131
|
+
expect(filters).to eq([])
|
|
132
132
|
end
|
|
133
133
|
|
|
134
134
|
context "when the hook filters apply to individual examples instead of example groups" do
|
|
@@ -164,7 +164,7 @@ module RSpec::Core
|
|
|
164
164
|
let(:example_metadata) { { :foo => :bar } }
|
|
165
165
|
|
|
166
166
|
it "runs the `:each` hooks" do
|
|
167
|
-
each_filters.
|
|
167
|
+
expect(each_filters).to eq([
|
|
168
168
|
'around each in config',
|
|
169
169
|
'before each in config',
|
|
170
170
|
'after each in config'
|
|
@@ -172,7 +172,7 @@ module RSpec::Core
|
|
|
172
172
|
end
|
|
173
173
|
|
|
174
174
|
it "does not run the `:all` hooks" do
|
|
175
|
-
all_filters.
|
|
175
|
+
expect(all_filters).to be_empty
|
|
176
176
|
end
|
|
177
177
|
end
|
|
178
178
|
|
|
@@ -180,7 +180,7 @@ module RSpec::Core
|
|
|
180
180
|
let(:example_metadata) { { :foo => :bazz } }
|
|
181
181
|
|
|
182
182
|
it "does not run any of the hooks" do
|
|
183
|
-
filters.
|
|
183
|
+
expect(filters).to be_empty
|
|
184
184
|
end
|
|
185
185
|
end
|
|
186
186
|
end
|
|
@@ -199,7 +199,7 @@ module RSpec::Core
|
|
|
199
199
|
group = ExampleGroup.describe(:one => 1, :two => 2, :three => 3)
|
|
200
200
|
group.example("example") {}
|
|
201
201
|
group.run
|
|
202
|
-
filters.
|
|
202
|
+
expect(filters).to eq([
|
|
203
203
|
"before all in config",
|
|
204
204
|
"around each in config",
|
|
205
205
|
"before each in config",
|
|
@@ -220,7 +220,7 @@ module RSpec::Core
|
|
|
220
220
|
group = ExampleGroup.describe(:one => 1, :two => 2, :three => 3)
|
|
221
221
|
group.example("example") {}
|
|
222
222
|
group.run
|
|
223
|
-
filters.
|
|
223
|
+
expect(filters).to eq([])
|
|
224
224
|
end
|
|
225
225
|
end
|
|
226
226
|
end
|
|
@@ -35,13 +35,13 @@ module RSpec::Core
|
|
|
35
35
|
it "defaults to :each scope if no arguments are given" do
|
|
36
36
|
hooks = instance.send(type) {}
|
|
37
37
|
hook = hooks.first
|
|
38
|
-
instance.hooks[type][:each].
|
|
38
|
+
expect(instance.hooks[type][:each]).to include(hook)
|
|
39
39
|
end
|
|
40
40
|
|
|
41
41
|
it "defaults to :each scope if the only argument is a metadata hash" do
|
|
42
42
|
hooks = instance.send(type, :foo => :bar) {}
|
|
43
43
|
hook = hooks.first
|
|
44
|
-
instance.hooks[type][:each].
|
|
44
|
+
expect(instance.hooks[type][:each]).to include(hook)
|
|
45
45
|
end
|
|
46
46
|
|
|
47
47
|
it "raises an error if only metadata symbols are given as arguments" do
|
|
@@ -68,11 +68,11 @@ module RSpec::Core
|
|
|
68
68
|
end
|
|
69
69
|
|
|
70
70
|
it "does not make #{scope.inspect} a metadata key" do
|
|
71
|
-
hook.options.
|
|
71
|
+
expect(hook.options).to be_empty
|
|
72
72
|
end
|
|
73
73
|
|
|
74
74
|
it "is scoped to #{scope.inspect}" do
|
|
75
|
-
instance.hooks[type][scope].
|
|
75
|
+
expect(instance.hooks[type][scope]).to include(hook)
|
|
76
76
|
end
|
|
77
77
|
end
|
|
78
78
|
end
|
|
@@ -92,7 +92,7 @@ module RSpec::Core
|
|
|
92
92
|
end
|
|
93
93
|
end
|
|
94
94
|
group.run
|
|
95
|
-
examples.
|
|
95
|
+
expect(examples).to have(0).example
|
|
96
96
|
end
|
|
97
97
|
end
|
|
98
98
|
|
|
@@ -108,7 +108,7 @@ module RSpec::Core
|
|
|
108
108
|
end
|
|
109
109
|
end
|
|
110
110
|
group.run
|
|
111
|
-
examples.
|
|
111
|
+
expect(examples).to have(1).example
|
|
112
112
|
end
|
|
113
113
|
end
|
|
114
114
|
|
|
@@ -128,7 +128,7 @@ module RSpec::Core
|
|
|
128
128
|
end
|
|
129
129
|
end
|
|
130
130
|
group.run
|
|
131
|
-
examples.
|
|
131
|
+
expect(examples).to have(1).example
|
|
132
132
|
end
|
|
133
133
|
end
|
|
134
134
|
end
|
|
@@ -151,7 +151,7 @@ module RSpec::Core
|
|
|
151
151
|
|
|
152
152
|
group.run
|
|
153
153
|
|
|
154
|
-
messages.
|
|
154
|
+
expect(messages).to eq([
|
|
155
155
|
'group 1',
|
|
156
156
|
'group 2',
|
|
157
157
|
'config 1',
|
|
@@ -179,7 +179,7 @@ module RSpec::Core
|
|
|
179
179
|
|
|
180
180
|
group.run
|
|
181
181
|
|
|
182
|
-
messages.
|
|
182
|
+
expect(messages).to eq([
|
|
183
183
|
'config 1',
|
|
184
184
|
'config 2',
|
|
185
185
|
'config 3',
|
|
@@ -205,7 +205,7 @@ module RSpec::Core
|
|
|
205
205
|
|
|
206
206
|
group.run
|
|
207
207
|
|
|
208
|
-
messages.
|
|
208
|
+
expect(messages).to eq([
|
|
209
209
|
'group 1',
|
|
210
210
|
'group 2',
|
|
211
211
|
'group 3',
|
|
@@ -233,7 +233,7 @@ module RSpec::Core
|
|
|
233
233
|
|
|
234
234
|
group.run
|
|
235
235
|
|
|
236
|
-
messages.
|
|
236
|
+
expect(messages).to eq([
|
|
237
237
|
'group 1',
|
|
238
238
|
'group 2',
|
|
239
239
|
'config 1',
|
|
@@ -0,0 +1,458 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
module RSpec::Core
|
|
4
|
+
describe MemoizedHelpers do
|
|
5
|
+
before(:each) { RSpec.configuration.configure_expectation_framework }
|
|
6
|
+
|
|
7
|
+
def subject_value_for(describe_arg, &block)
|
|
8
|
+
group = ExampleGroup.describe(describe_arg, &block)
|
|
9
|
+
subject_value = nil
|
|
10
|
+
group.example { subject_value = subject }
|
|
11
|
+
group.run
|
|
12
|
+
subject_value
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
describe "implicit subject" do
|
|
16
|
+
describe "with a class" do
|
|
17
|
+
it "returns an instance of the class" do
|
|
18
|
+
expect(subject_value_for(Array)).to eq([])
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
describe "with a Module" do
|
|
23
|
+
it "returns the Module" do
|
|
24
|
+
expect(subject_value_for(Enumerable)).to eq(Enumerable)
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
describe "with a string" do
|
|
29
|
+
it "returns the string" do
|
|
30
|
+
expect(subject_value_for("Foo")).to eq("Foo")
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
describe "with a number" do
|
|
35
|
+
it "returns the number" do
|
|
36
|
+
expect(subject_value_for(15)).to eq(15)
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
it "can be overriden and super'd to from a nested group" do
|
|
41
|
+
outer_subject_value = inner_subject_value = nil
|
|
42
|
+
|
|
43
|
+
ExampleGroup.describe(Array) do
|
|
44
|
+
subject { super() << :parent_group }
|
|
45
|
+
example { outer_subject_value = subject }
|
|
46
|
+
|
|
47
|
+
context "nested" do
|
|
48
|
+
subject { super() << :child_group }
|
|
49
|
+
example { inner_subject_value = subject }
|
|
50
|
+
end
|
|
51
|
+
end.run
|
|
52
|
+
|
|
53
|
+
expect(outer_subject_value).to eq([:parent_group])
|
|
54
|
+
expect(inner_subject_value).to eq([:parent_group, :child_group])
|
|
55
|
+
end
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
describe "explicit subject" do
|
|
59
|
+
[false, nil].each do |falsy_value|
|
|
60
|
+
context "with a value of #{falsy_value.inspect}" do
|
|
61
|
+
it "is evaluated once per example" do
|
|
62
|
+
group = ExampleGroup.describe(Array)
|
|
63
|
+
group.before do
|
|
64
|
+
Object.should_receive(:this_question?).once.and_return(falsy_value)
|
|
65
|
+
end
|
|
66
|
+
group.subject do
|
|
67
|
+
Object.this_question?
|
|
68
|
+
end
|
|
69
|
+
group.example do
|
|
70
|
+
subject
|
|
71
|
+
subject
|
|
72
|
+
end
|
|
73
|
+
expect(group.run).to be_true, "expected subject block to be evaluated only once"
|
|
74
|
+
end
|
|
75
|
+
end
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
describe "defined in a top level group" do
|
|
79
|
+
it "replaces the implicit subject in that group" do
|
|
80
|
+
subject_value = subject_value_for(Array) do
|
|
81
|
+
subject { [1, 2, 3] }
|
|
82
|
+
end
|
|
83
|
+
expect(subject_value).to eq([1, 2, 3])
|
|
84
|
+
end
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
describe "defined in a top level group" do
|
|
88
|
+
let(:group) do
|
|
89
|
+
ExampleGroup.describe do
|
|
90
|
+
subject{ [4, 5, 6] }
|
|
91
|
+
end
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
it "is available in a nested group (subclass)" do
|
|
95
|
+
subject_value = nil
|
|
96
|
+
group.describe("I'm nested!") do
|
|
97
|
+
example { subject_value = subject }
|
|
98
|
+
end.run
|
|
99
|
+
|
|
100
|
+
expect(subject_value).to eq([4, 5, 6])
|
|
101
|
+
end
|
|
102
|
+
|
|
103
|
+
it "is available in a doubly nested group (subclass)" do
|
|
104
|
+
subject_value = nil
|
|
105
|
+
group.describe("Nesting level 1") do
|
|
106
|
+
describe("Nesting level 2") do
|
|
107
|
+
example { subject_value = subject }
|
|
108
|
+
end
|
|
109
|
+
end.run
|
|
110
|
+
|
|
111
|
+
expect(subject_value).to eq([4, 5, 6])
|
|
112
|
+
end
|
|
113
|
+
|
|
114
|
+
it "can be overriden and super'd to from a nested group" do
|
|
115
|
+
subject_value = nil
|
|
116
|
+
group.describe("Nested") do
|
|
117
|
+
subject { super() + [:override] }
|
|
118
|
+
example { subject_value = subject }
|
|
119
|
+
end.run
|
|
120
|
+
|
|
121
|
+
expect(subject_value).to eq([4, 5, 6, :override])
|
|
122
|
+
end
|
|
123
|
+
end
|
|
124
|
+
|
|
125
|
+
describe "with a name" do
|
|
126
|
+
it "defines a method that returns the memoized subject" do
|
|
127
|
+
list_value_1 = list_value_2 = subject_value_1 = subject_value_2 = nil
|
|
128
|
+
|
|
129
|
+
ExampleGroup.describe do
|
|
130
|
+
subject(:list) { [1, 2, 3] }
|
|
131
|
+
example do
|
|
132
|
+
list_value_1 = list
|
|
133
|
+
list_value_2 = list
|
|
134
|
+
subject_value_1 = subject
|
|
135
|
+
subject_value_2 = subject
|
|
136
|
+
end
|
|
137
|
+
end.run
|
|
138
|
+
|
|
139
|
+
expect(list_value_1).to eq([1, 2, 3])
|
|
140
|
+
expect(list_value_1).to equal(list_value_2)
|
|
141
|
+
|
|
142
|
+
expect(subject_value_1).to equal(subject_value_2)
|
|
143
|
+
expect(subject_value_1).to equal(list_value_1)
|
|
144
|
+
end
|
|
145
|
+
|
|
146
|
+
it "is referred from inside subject by the name" do
|
|
147
|
+
inner_subject_value = nil
|
|
148
|
+
|
|
149
|
+
ExampleGroup.describe do
|
|
150
|
+
subject(:list) { [1, 2, 3] }
|
|
151
|
+
describe 'first' do
|
|
152
|
+
subject(:first_element) { list.first }
|
|
153
|
+
example { inner_subject_value = subject }
|
|
154
|
+
end
|
|
155
|
+
end.run
|
|
156
|
+
|
|
157
|
+
expect(inner_subject_value).to eq(1)
|
|
158
|
+
end
|
|
159
|
+
|
|
160
|
+
context 'when `super` is used' do
|
|
161
|
+
it "delegates to the parent context's `subject`, not the named mehtod" do
|
|
162
|
+
inner_subject_value = nil
|
|
163
|
+
|
|
164
|
+
ExampleGroup.describe do
|
|
165
|
+
let(:list) { ["a", "b", "c"] }
|
|
166
|
+
subject { [1, 2, 3] }
|
|
167
|
+
|
|
168
|
+
describe 'first' do
|
|
169
|
+
subject(:list) { super().first(2) }
|
|
170
|
+
example { inner_subject_value = subject }
|
|
171
|
+
end
|
|
172
|
+
end.run
|
|
173
|
+
|
|
174
|
+
expect(inner_subject_value).to eq([1, 2])
|
|
175
|
+
end
|
|
176
|
+
end
|
|
177
|
+
end
|
|
178
|
+
end
|
|
179
|
+
|
|
180
|
+
context "using 'self' as an explicit subject" do
|
|
181
|
+
it "delegates matcher to the ExampleGroup" do
|
|
182
|
+
group = ExampleGroup.describe("group") do
|
|
183
|
+
subject { self }
|
|
184
|
+
def ok?; true; end
|
|
185
|
+
def not_ok?; false; end
|
|
186
|
+
|
|
187
|
+
it { should eq(self) }
|
|
188
|
+
it { should be_ok }
|
|
189
|
+
it { should_not be_not_ok }
|
|
190
|
+
end
|
|
191
|
+
|
|
192
|
+
expect(group.run).to be_true
|
|
193
|
+
end
|
|
194
|
+
end
|
|
195
|
+
|
|
196
|
+
describe "#its" do
|
|
197
|
+
subject do
|
|
198
|
+
Class.new do
|
|
199
|
+
def initialize
|
|
200
|
+
@call_count = 0
|
|
201
|
+
end
|
|
202
|
+
|
|
203
|
+
def call_count
|
|
204
|
+
@call_count += 1
|
|
205
|
+
end
|
|
206
|
+
end.new
|
|
207
|
+
end
|
|
208
|
+
|
|
209
|
+
context "with a call counter" do
|
|
210
|
+
its(:call_count) { should eq(1) }
|
|
211
|
+
end
|
|
212
|
+
|
|
213
|
+
context "with nil value" do
|
|
214
|
+
subject do
|
|
215
|
+
Class.new do
|
|
216
|
+
def nil_value
|
|
217
|
+
nil
|
|
218
|
+
end
|
|
219
|
+
end.new
|
|
220
|
+
end
|
|
221
|
+
its(:nil_value) { should be_nil }
|
|
222
|
+
end
|
|
223
|
+
|
|
224
|
+
context "with nested attributes" do
|
|
225
|
+
subject do
|
|
226
|
+
Class.new do
|
|
227
|
+
def name
|
|
228
|
+
"John"
|
|
229
|
+
end
|
|
230
|
+
end.new
|
|
231
|
+
end
|
|
232
|
+
its("name") { should eq("John") }
|
|
233
|
+
its("name.size") { should eq(4) }
|
|
234
|
+
its("name.size.class") { should eq(Fixnum) }
|
|
235
|
+
end
|
|
236
|
+
|
|
237
|
+
context "when it responds to #[]" do
|
|
238
|
+
subject do
|
|
239
|
+
Class.new do
|
|
240
|
+
def [](*objects)
|
|
241
|
+
objects.map do |object|
|
|
242
|
+
"#{object.class}: #{object.to_s}"
|
|
243
|
+
end.join("; ")
|
|
244
|
+
end
|
|
245
|
+
|
|
246
|
+
def name
|
|
247
|
+
"George"
|
|
248
|
+
end
|
|
249
|
+
end.new
|
|
250
|
+
end
|
|
251
|
+
its([:a]) { should eq("Symbol: a") }
|
|
252
|
+
its(['a']) { should eq("String: a") }
|
|
253
|
+
its([:b, 'c', 4]) { should eq("Symbol: b; String: c; Fixnum: 4") }
|
|
254
|
+
its(:name) { should eq("George") }
|
|
255
|
+
context "when referring to an attribute without the proper array syntax" do
|
|
256
|
+
context "it raises an error" do
|
|
257
|
+
its(:age) do
|
|
258
|
+
expect do
|
|
259
|
+
should eq(64)
|
|
260
|
+
end.to raise_error(NoMethodError)
|
|
261
|
+
end
|
|
262
|
+
end
|
|
263
|
+
end
|
|
264
|
+
end
|
|
265
|
+
|
|
266
|
+
context "when it does not respond to #[]" do
|
|
267
|
+
subject { Object.new }
|
|
268
|
+
|
|
269
|
+
context "it raises an error" do
|
|
270
|
+
its([:a]) do
|
|
271
|
+
expect do
|
|
272
|
+
should eq("Symbol: a")
|
|
273
|
+
end.to raise_error(NoMethodError)
|
|
274
|
+
end
|
|
275
|
+
end
|
|
276
|
+
end
|
|
277
|
+
|
|
278
|
+
context "calling and overriding super" do
|
|
279
|
+
it "calls to the subject defined in the parent group" do
|
|
280
|
+
group = ExampleGroup.describe(Array) do
|
|
281
|
+
subject { [1, 'a'] }
|
|
282
|
+
|
|
283
|
+
its(:last) { should eq("a") }
|
|
284
|
+
|
|
285
|
+
describe '.first' do
|
|
286
|
+
def subject; super().first; end
|
|
287
|
+
|
|
288
|
+
its(:next) { should eq(2) }
|
|
289
|
+
end
|
|
290
|
+
end
|
|
291
|
+
|
|
292
|
+
expect(group.run).to be_true
|
|
293
|
+
end
|
|
294
|
+
end
|
|
295
|
+
|
|
296
|
+
context "with nil subject" do
|
|
297
|
+
subject do
|
|
298
|
+
Class.new do
|
|
299
|
+
def initialize
|
|
300
|
+
@counter = -1
|
|
301
|
+
end
|
|
302
|
+
def nil_if_first_time
|
|
303
|
+
@counter += 1
|
|
304
|
+
@counter == 0 ? nil : true
|
|
305
|
+
end
|
|
306
|
+
end.new
|
|
307
|
+
end
|
|
308
|
+
its(:nil_if_first_time) { should be(nil) }
|
|
309
|
+
end
|
|
310
|
+
|
|
311
|
+
context "with false subject" do
|
|
312
|
+
subject do
|
|
313
|
+
Class.new do
|
|
314
|
+
def initialize
|
|
315
|
+
@counter = -1
|
|
316
|
+
end
|
|
317
|
+
def false_if_first_time
|
|
318
|
+
@counter += 1
|
|
319
|
+
@counter > 0
|
|
320
|
+
end
|
|
321
|
+
end.new
|
|
322
|
+
end
|
|
323
|
+
its(:false_if_first_time) { should be(false) }
|
|
324
|
+
end
|
|
325
|
+
|
|
326
|
+
describe 'accessing `subject` in `before` and `let`' do
|
|
327
|
+
subject { 'my subject' }
|
|
328
|
+
before { @subject_in_before = subject }
|
|
329
|
+
let(:subject_in_let) { subject }
|
|
330
|
+
let!(:eager_loaded_subject_in_let) { subject }
|
|
331
|
+
|
|
332
|
+
# These examples read weird, because we're actually
|
|
333
|
+
# specifying the behaviour of `its` itself
|
|
334
|
+
its(nil) { expect(subject).to eq('my subject') }
|
|
335
|
+
its(nil) { expect(@subject_in_before).to eq('my subject') }
|
|
336
|
+
its(nil) { expect(subject_in_let).to eq('my subject') }
|
|
337
|
+
its(nil) { expect(eager_loaded_subject_in_let).to eq('my subject') }
|
|
338
|
+
end
|
|
339
|
+
end
|
|
340
|
+
|
|
341
|
+
describe '#subject!' do
|
|
342
|
+
let(:prepared_array) { [1,2,3] }
|
|
343
|
+
subject! { prepared_array.pop }
|
|
344
|
+
|
|
345
|
+
it "evaluates subject before example" do
|
|
346
|
+
expect(prepared_array).to eq([1,2])
|
|
347
|
+
end
|
|
348
|
+
|
|
349
|
+
it "returns memoized value from first invocation" do
|
|
350
|
+
expect(subject).to eq(3)
|
|
351
|
+
end
|
|
352
|
+
end
|
|
353
|
+
end
|
|
354
|
+
|
|
355
|
+
describe "#let" do
|
|
356
|
+
let(:counter) do
|
|
357
|
+
Class.new do
|
|
358
|
+
def initialize
|
|
359
|
+
@count = 0
|
|
360
|
+
end
|
|
361
|
+
def count
|
|
362
|
+
@count += 1
|
|
363
|
+
end
|
|
364
|
+
end.new
|
|
365
|
+
end
|
|
366
|
+
|
|
367
|
+
let(:nil_value) do
|
|
368
|
+
@nil_value_count += 1
|
|
369
|
+
nil
|
|
370
|
+
end
|
|
371
|
+
|
|
372
|
+
it "generates an instance method" do
|
|
373
|
+
expect(counter.count).to eq(1)
|
|
374
|
+
end
|
|
375
|
+
|
|
376
|
+
it "caches the value" do
|
|
377
|
+
expect(counter.count).to eq(1)
|
|
378
|
+
expect(counter.count).to eq(2)
|
|
379
|
+
end
|
|
380
|
+
|
|
381
|
+
it "caches a nil value" do
|
|
382
|
+
@nil_value_count = 0
|
|
383
|
+
nil_value
|
|
384
|
+
nil_value
|
|
385
|
+
|
|
386
|
+
expect(@nil_value_count).to eq(1)
|
|
387
|
+
end
|
|
388
|
+
|
|
389
|
+
let(:a_value) { "a string" }
|
|
390
|
+
|
|
391
|
+
context 'when overriding let in a nested context' do
|
|
392
|
+
let(:a_value) { super() + " (modified)" }
|
|
393
|
+
|
|
394
|
+
it 'can use `super` to reference the parent context value' do
|
|
395
|
+
expect(a_value).to eq("a string (modified)")
|
|
396
|
+
end
|
|
397
|
+
end
|
|
398
|
+
|
|
399
|
+
context 'when the declaration uses `return`' do
|
|
400
|
+
let(:value) do
|
|
401
|
+
return :early_exit if @early_exit
|
|
402
|
+
:late_exit
|
|
403
|
+
end
|
|
404
|
+
|
|
405
|
+
it 'can exit the let declaration early' do
|
|
406
|
+
@early_exit = true
|
|
407
|
+
expect(value).to eq(:early_exit)
|
|
408
|
+
end
|
|
409
|
+
|
|
410
|
+
it 'can get past a conditional `return` statement' do
|
|
411
|
+
@early_exit = false
|
|
412
|
+
expect(value).to eq(:late_exit)
|
|
413
|
+
end
|
|
414
|
+
end
|
|
415
|
+
end
|
|
416
|
+
|
|
417
|
+
describe "#let!" do
|
|
418
|
+
subject { [1,2,3] }
|
|
419
|
+
let!(:popped) { subject.pop }
|
|
420
|
+
|
|
421
|
+
it "evaluates the value non-lazily" do
|
|
422
|
+
expect(subject).to eq([1,2])
|
|
423
|
+
end
|
|
424
|
+
|
|
425
|
+
it "returns memoized value from first invocation" do
|
|
426
|
+
expect(popped).to eq(3)
|
|
427
|
+
end
|
|
428
|
+
end
|
|
429
|
+
|
|
430
|
+
describe 'using subject in before and let blocks' do
|
|
431
|
+
shared_examples_for 'a subject' do
|
|
432
|
+
let(:subject_id_in_let) { subject.object_id }
|
|
433
|
+
before { @subject_id_in_before = subject.object_id }
|
|
434
|
+
|
|
435
|
+
it 'should be memoized' do
|
|
436
|
+
expect(subject_id_in_let).to eq(@subject_id_in_before)
|
|
437
|
+
end
|
|
438
|
+
|
|
439
|
+
it { should eq(subject) }
|
|
440
|
+
end
|
|
441
|
+
|
|
442
|
+
describe Object do
|
|
443
|
+
context 'with implicit subject' do
|
|
444
|
+
it_should_behave_like 'a subject'
|
|
445
|
+
end
|
|
446
|
+
|
|
447
|
+
context 'with explicit subject' do
|
|
448
|
+
subject { Object.new }
|
|
449
|
+
it_should_behave_like 'a subject'
|
|
450
|
+
end
|
|
451
|
+
|
|
452
|
+
context 'with a constant subject'do
|
|
453
|
+
subject { 123 }
|
|
454
|
+
it_should_behave_like 'a subject'
|
|
455
|
+
end
|
|
456
|
+
end
|
|
457
|
+
end
|
|
458
|
+
end
|