Module: RSpec::Core::Subject::ExampleMethods

Included in:
ExampleGroup
Defined in:
lib/rspec/core/subject.rb

Instance Method Summary collapse

Instance Method Details

#_attribute_chain(attribute) ⇒ Object



86
87
88
# File 'lib/rspec/core/subject.rb', line 86

def _attribute_chain(attribute)
  attribute.to_s.split('.')
end

#_nested_attribute(subject, attribute) ⇒ Object



90
91
92
93
94
# File 'lib/rspec/core/subject.rb', line 90

def _nested_attribute(subject, attribute)
  _attribute_chain(attribute).inject(subject) do |inner_subject, attr|
    inner_subject.send(attr)
  end
end

#subjectObject

Note:

subject was contributed by Joe Ferris to support the one-liner syntax embraced by shoulda matchers:

describe Widget do
  it { should validate_presence_of(:name) }
end

While the examples below demonstrate how to use subject explicitly in specs, we think it works best for extensions like shoulda, custom matchers, and shared example groups, where it is not referenced explicitly in specs.

Returns the subject defined by the example group. The subject block is only executed once per example, the result of which is cached and returned by any subsequent calls to subject.

If a class is passed to describe and no subject is explicitly declared in the example group, then subject will return a new instance of that class.

Examples:


# explicit declaration of subject
describe Person do
  subject { Person.new(:birthdate => 19.years.ago) }
  it "should be eligible to vote" do
    subject.should be_eligible_to_vote
  end
end

# implicit subject => { Person.new }
describe Person do
  it "should be eligible to vote" do
    subject.should be_eligible_to_vote
  end
end

describe Person do
  # one liner syntax - should is invoked on subject
  it { should be_eligible_to_vote }
end


47
48
49
50
51
52
53
# File 'lib/rspec/core/subject.rb', line 47

def subject
  if defined?(@original_subject)
    @original_subject
  else
    @original_subject = instance_eval(&self.class.subject)
  end
end