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.

488
489
490
491
492
493
494
# File 'lib/rspec/core/memoized_helpers.rb', line 488
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) should(matcher = nil, message = nil)

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:

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

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

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:

81
82
83
# File 'lib/rspec/core/memoized_helpers.rb', line 81
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 { 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 - should is invoked on subject
describe Person do
  it { should be_eligible_to_vote }
end

See Also:

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