class RuboCop::Cop::RSpec::SharedContext

Checks for proper shared_context and shared_examples usage.

If there are no examples defined, use shared_context. If there is no setup defined, use shared_examples.

@example

# bad
RSpec.shared_context 'only examples here' do
  it 'does x' do
  end

  it 'does 'y' do
  end
end

# good
RSpec.shared_examples 'only examples here' do
  it 'does x' do
  end

  it 'does 'y' do
  end
end

@example

# bad
RSpec.shared_examples 'only setup here' do
  subject(:foo) { :bar }

  let(:baz) { :bazz }

  before do
    something
  end
end

# good
RSpec.shared_context 'only setup here' do
  subject(:foo) { :bar }

  let(:baz) { :bazz }

  before do
    something
  end
end

Constants

MSG_CONTEXT
MSG_EXAMPLES

Public Instance Methods

autocorrect(node) click to toggle source
# File lib/rubocop/cop/rspec/shared_context.rb, line 78
def autocorrect(node)
  lambda do |corrector|
    context_with_only_examples(node.parent) do
      corrector.replace(node.loc.selector, 'shared_examples')
    end

    examples_with_only_context(node.parent) do
      corrector.replace(node.loc.selector, 'shared_context')
    end
  end
end
on_block(node) click to toggle source
# File lib/rubocop/cop/rspec/shared_context.rb, line 68
def on_block(node)
  context_with_only_examples(node) do
    add_shared_item_offense(node, MSG_EXAMPLES)
  end

  examples_with_only_context(node) do
    add_shared_item_offense(node, MSG_CONTEXT)
  end
end

Private Instance Methods

add_shared_item_offense(node, message) click to toggle source
# File lib/rubocop/cop/rspec/shared_context.rb, line 100
def add_shared_item_offense(node, message)
  add_offense(
    node.children.first,
    location: :expression,
    message: message
  )
end
context_with_only_examples(node) { || ... } click to toggle source
# File lib/rubocop/cop/rspec/shared_context.rb, line 92
def context_with_only_examples(node)
  shared_context(node) { yield if examples?(node) && !context?(node) }
end
examples_with_only_context(node) { || ... } click to toggle source
# File lib/rubocop/cop/rspec/shared_context.rb, line 96
def examples_with_only_context(node)
  shared_example(node) { yield if context?(node) && !examples?(node) }
end