module RuboCop::RSpec::ExpectOffense

Mixin for `expect_offense` and `expect_no_offenses`

This mixin makes it easier to specify strict offense expectations and a declarative and visual fashion. Just type out the code that should generate a offense, annotate code by writing '^'s underneath each character that should be highlighted, and follow the carets with a string (separated by a space) that is the message of the offense. You can include multiple offenses in one code snippet.

@example Usage

expect_offense(<<-RUBY.strip_indent)
  a do
    b
  end.c
  ^^^^^ Avoid chaining a method call on a do...end block.
RUBY

@example Equivalent assertion without `expect_offense`

inspect_source(<<-RUBY.strip_indent)
  a do
    b
  end.c
RUBY

expect(cop.offenses.size).to be(1)

offense = cop.offenses.first
expect(offense.line).to be(3)
expect(offense.column_range).to be(0...5)
expect(offense.message).to eql(
  'Avoid chaining a method call on a do...end block.'
)

If you do not want to specify an offense then use the companion method `expect_no_offenses`. This method is a much simpler assertion since it just inspects the source and checks that there were no offenses. The `expect_offenses` method has to do more work by parsing out lines that contain carets.

Public Instance Methods

expect_no_offenses(source, file = nil) click to toggle source
# File lib/rubocop/rspec/expect_offense.rb, line 60
def expect_no_offenses(source, file = nil)
  inspect_source(source, file)

  expect(cop.offenses).to be_empty
end
expect_offense(source, file = nil) click to toggle source
# File lib/rubocop/rspec/expect_offense.rb, line 47
def expect_offense(source, file = nil)
  expected_annotations = AnnotatedSource.parse(source)

  if expected_annotations.plain_source == source
    raise 'Use expect_no_offenses to assert that no offenses are found'
  end

  inspect_source(expected_annotations.plain_source, file)
  actual_annotations =
    expected_annotations.with_offense_annotations(cop.offenses)
  expect(actual_annotations.to_s).to eq(expected_annotations.to_s)
end