class RuboCop::Cop::RSpec::DescribeClass

Check that the first argument to the top-level describe is a constant.

It can be configured to ignore strings when certain metadata is passed.

Ignores Rails and Aruba `type` metadata by default.

@example `IgnoredMetadata` configuration

# .rubocop.yml
# RSpec/DescribeClass:
#   IgnoredMetadata:
#     type:
#       - request
#       - controller

@example

# bad
describe 'Do something' do
end

# good
describe TestedClass do
  subject { described_class }
end

describe 'TestedClass::VERSION' do
  subject { Object.const_get(self.class.description) }
end

describe "A feature example", type: :feature do
end

Constants

MSG

Public Instance Methods

on_top_level_group(node) click to toggle source
# File lib/rubocop/cop/rspec/describe_class.rb, line 58
def on_top_level_group(node)
  return if example_group_with_ignored_metadata?(node.send_node)

  not_a_const_described(node.send_node) do |described|
    add_offense(described)
  end
end

Private Instance Methods

ignored_metadata() click to toggle source
# File lib/rubocop/cop/rspec/describe_class.rb, line 79
def ignored_metadata
  cop_config['IgnoredMetadata'] || {}
end
ignored_metadata?(node) click to toggle source
# File lib/rubocop/cop/rspec/describe_class.rb, line 68
def ignored_metadata?(node)
  sym_pair(node) do |key, value|
    ignored_metadata[key.value.to_s].to_a.include?(value.value.to_s)
  end
end
string_constant?(described) click to toggle source
# File lib/rubocop/cop/rspec/describe_class.rb, line 74
def string_constant?(described)
  described.str_type? &&
    described.value.match?(/^(?:(?:::)?[A-Z]\w*)+$/)
end