Method: RSpec::Core::MemoizedHelpers#subject

Defined in:
lib/rspec/core/memoized_helpers.rb

#subjectvoid

Note:

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

RSpec.describe Widget do
  it { is_expected.to validate_presence_of(:name) }
  # or
  it { should validate_presence_of(:name) }
end

While the examples below demonstrate how to use subject explicitly in examples, we recommend that you define a method with an intention revealing name instead.

Note:

Because subject is designed to create state that is reset between each example, and before(:context) is designed to setup state that is shared across all examples in an example group, subject is not intended to be used in a before(:context) hook.

Examples:


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

# Implicit subject => { Person.new }.
RSpec.describe Person do
  it "should be eligible to vote" do
    subject.should be_eligible_to_vote
    # ^ ^ explicit reference to subject not recommended
  end
end

# One-liner syntax - expectation is set on the subject.
RSpec.describe Person do
  it { is_expected.to be_eligible_to_vote }
  # or
  it { should be_eligible_to_vote }
end

See Also:


57
58
59
60
61
62
# File 'lib/rspec/core/memoized_helpers.rb', line 57

def subject
  __memoized.fetch_or_store(:subject) do
    described = described_class || self.class..fetch(:description_args).first
    Class === described ? described.new : described
  end
end