Module: RSpec::Core::MemoizedHelpers

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

Defined Under Namespace

Modules: ClassMethods

Class Method Summary (collapse)

Instance Method Summary (collapse)

Class Method Details

+ (Object) get_constant_or_yield(example_group, name)

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

Gets the named constant or yields. On 1.9, constdefined? / constget take into account the the inheritance by default, and accept an argument to disable this behavior. It's important that we don't consider inheritance here; each example group level that uses a let should get its own LetDefinitions module.

555
556
557
558
559
560
561
# File 'lib/rspec/core/memoized_helpers.rb', line 555
def self.get_constant_or_yield(example_group, name)
  if example_group.const_defined?(name)
    example_group.const_get(name)
  else
    yield
  end
end

Instance Method Details

- (Object) is_expected

Note:

This only works if you are using rspec-expectations.

Wraps the subject in expect to make it the target of an expectation. Designed to read nicely for one-liners.

Examples:

describe [1, 2, 3] do
  it { is_expected.to be_an Array }
  it { is_expected.not_to include 4 }
end

See Also:

114
115
116
# File 'lib/rspec/core/memoized_helpers.rb', line 114
def is_expected
  expect(subject)
end

- (Object) should(matcher = nil, message = nil)

Note:

This only works if you are using rspec-expectations.

Note:

If you are using RSpec's newer expect-based syntax you may want to use is_expected.to instead of should.

When should is called with no explicit receiver, the call is delegated to the object returned by subject. Combined with an implicit subject this supports very concise expressions.

Examples:

describe Person do
  it { should be_eligible_to_vote }
end

See Also:

76
77
78
# File 'lib/rspec/core/memoized_helpers.rb', line 76
def should(matcher=nil, message=nil)
  RSpec::Expectations::PositiveExpectationHandler.handle_matcher(subject, matcher, message)
end

- (Object) should_not(matcher = nil, message = nil)

Note:

This only works if you are using rspec-expectations.

Note:

If you are using RSpec's newer expect-based syntax you may want to use is_expected.to_not instead of should_not.

Just like should, should_not delegates to the subject (implicit or explicit) of the example group.

Examples:

describe Person do
  it { should_not be_eligible_to_vote }
end

See Also:

95
96
97
# File 'lib/rspec/core/memoized_helpers.rb', line 95
def should_not(matcher=nil, message=nil)
  RSpec::Expectations::NegativeExpectationHandler.handle_matcher(subject, matcher, message)
end

- (Object) subject

Note:

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

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(:all) 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(:all) hook. RSpec 2.13.1 prints a warning when you reference a subject from before(:all) and we plan to have it raise an error in RSpec 3.

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
    # ^ ^ explicit reference to subject not recommended
  end
end
# implicit subject => { Person.new }
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
describe Person do
  it { is_expected.to be_eligible_to_vote }
  # or
  it { should be_eligible_to_vote }
end

See Also:

51
52
53
54
55
56
57
58
# File 'lib/rspec/core/memoized_helpers.rb', line 51
def subject
  __memoized.fetch(:subject) do
    __memoized[:subject] = begin
      described = described_class || self.class.description
      Class === described ? described.new : described
    end
  end
end