Skip to content
This repository was archived by the owner on Nov 30, 2024. It is now read-only.

Commit f47711c

Browse files
committed
Merge pull request #1361 from rspec/fix-nested-described-class
Fix nested described class
2 parents 2a25e25 + 83f9936 commit f47711c

File tree

6 files changed

+51
-34
lines changed

6 files changed

+51
-34
lines changed

Changelog.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,12 @@
11
### 3.0.0.rc1 Development
22
[Full Changelog](http://github.com/rspec/rspec-core/compare/v3.0.0.beta2...master)
33

4+
Breaking Changes for 3.0.0:
5+
6+
* Change `described_class` so that in a nested group like `describe
7+
MyClass`, it returns `MyClass` rather than the outer group's described
8+
class. (Myron Marston)
9+
410
Enhancements:
511

612
* Add `config.default_formatter` attribute, which can be used to set a

features/subject/implicit_subject.feature

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ Feature: implicitly defined subject
3333
When I run `rspec nested_subject_spec.rb`
3434
Then the examples should all pass
3535

36-
Scenario: subject in a nested group with a different class (outermost wins)
36+
Scenario: subject in a nested group with a different class (innermost wins)
3737
Given a file named "nested_subject_spec.rb" with:
3838
"""ruby
3939
class ArrayWithOneElement < Array
@@ -46,14 +46,8 @@ Feature: implicitly defined subject
4646
describe Array do
4747
describe ArrayWithOneElement do
4848
context "referenced as subject" do
49-
it "should be empty (because it is the Array declared at the top)" do
50-
expect(subject).to be_empty
51-
end
52-
end
53-
54-
context "created in the example" do
55-
it "should not be empty" do
56-
expect(ArrayWithOneElement.new).not_to be_empty
49+
it "contains one element" do
50+
expect(subject).to include("first element")
5751
end
5852
end
5953
end

lib/rspec/core/metadata.rb

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -148,9 +148,7 @@ def described_class
148148
return value unless value.nil?
149149
end
150150
end
151-
end
152151

153-
container_stack.reverse.each do |g|
154152
candidate = g[:description_args].first
155153
return candidate unless String === candidate || Symbol === candidate
156154
end

spec/rspec/core/example_group_spec.rb

Lines changed: 26 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -472,7 +472,7 @@ def ascending_numbers
472472
context "in a nested group" do
473473
it "inherits the described class/module from the outer group" do
474474
group = ExampleGroup.describe(String) do
475-
describe Array do
475+
describe "nested" do
476476
example "describes is String" do
477477
expect(described_class).to eq(String)
478478
end
@@ -481,6 +481,29 @@ def ascending_numbers
481481

482482
expect(group.run).to be_truthy, "expected examples in group to pass"
483483
end
484+
485+
context "when a class is passed" do
486+
def described_class_value
487+
value = nil
488+
489+
ExampleGroup.describe(String) do
490+
yield if block_given?
491+
describe Array do
492+
example { value = described_class }
493+
end
494+
end.run
495+
496+
value
497+
end
498+
499+
it "overrides the described class" do
500+
expect(described_class_value).to eq(Array)
501+
end
502+
503+
it "overrides the described class even when described_class is referenced in the outer group" do
504+
expect(described_class_value { described_class }).to eq(Array)
505+
end
506+
end
484507
end
485508

486509
context "for `describe(SomeClass)` within a `describe 'some string' group" do
@@ -1111,8 +1134,8 @@ def extract_execution_results(group)
11111134
describe Object, "describing nested example_groups", :little_less_nested => 'yep' do
11121135

11131136
describe "A sample nested group", :nested_describe => "yep" do
1114-
it "sets the described class to the described class of the outer most group" do |ex|
1115-
expect(ex.example_group.described_class).to eq(ExampleGroup)
1137+
it "sets the described class to the nearest described class" do |ex|
1138+
expect(ex.example_group.described_class).to eq(Object)
11161139
end
11171140

11181141
it "sets the description to 'A sample nested describe'" do |ex|

spec/rspec/core/metadata_spec.rb

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -290,36 +290,36 @@ module Core
290290
end
291291

292292
context "in a nested group" do
293-
it "returns the parent group's described class" do
294-
sm = Metadata.new
295-
sm.process(String)
293+
it "inherits the parent group's described class" do
294+
parent = Metadata.new
295+
parent.process(Hash)
296296

297-
m = Metadata.new(sm)
298-
m.process(Array)
297+
child = Metadata.new(parent)
298+
child.process("sub context")
299299

300-
expect(m[:example_group][key]).to be(String)
300+
expect(child[:example_group][key]).to be(Hash)
301301
end
302302

303-
it "returns own described class if parent doesn't have one" do
304-
sm = Metadata.new
305-
sm.process("foo")
303+
it "sets the described class when passing a class" do
304+
parent = Metadata.new
305+
parent.process(String)
306306

307-
m = Metadata.new(sm)
308-
m.process(Array)
307+
child = Metadata.new(parent)
308+
child.process(Array)
309309

310-
expect(m[:example_group][key]).to be(Array)
310+
expect(child[:example_group][key]).to be(Array)
311311
end
312312

313-
it "can override a parent group's described class" do
313+
it "can override a parent group's described class using metdata" do
314314
parent = Metadata.new
315315
parent.process(String)
316316

317317
child = Metadata.new(parent)
318-
child.process(Fixnum)
318+
child.process("sub context")
319319
child[:example_group][key] = Hash
320320

321321
grandchild = Metadata.new(child)
322-
grandchild.process(Array)
322+
grandchild.process("sub context")
323323

324324
expect(grandchild[:example_group][key]).to be(Hash)
325325
expect(child[:example_group][key]).to be(Hash)

spec/spec_helper.rb

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -89,10 +89,6 @@ def run(reporter=nil)
8989
end
9090
end
9191

92-
def in_editor?
93-
ENV.has_key?('TM_MODE') || ENV.has_key?('EMACS') || ENV.has_key?('VIM')
94-
end
95-
9692
module EnvHelpers
9793
def with_env_vars(vars)
9894
original = ENV.to_hash
@@ -135,7 +131,7 @@ def without_env_vars(*vars)
135131
end
136132

137133
# runtime options
138-
c.color = !in_editor?
134+
c.color = true
139135
c.include EnvHelpers
140136
c.filter_run_excluding :ruby => lambda {|version|
141137
case version.to_s

0 commit comments

Comments
 (0)