Module: RuboCop::RSpec::ExpectOffense

Defined in:
lib/rubocop/rspec/expect_offense.rb

Overview

Mixin for ‘expect_offense` and `expect_no_offenses`

This mixin makes it easier to specify strict offense expectations in 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.

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_offense` method has to do more work by parsing out lines that contain carets.

Examples:

Usage


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

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.'
)

Defined Under Namespace

Classes: AnnotatedSource

Instance Method Summary collapse

Instance Method Details

#expect_no_offenses(source, file = nil) ⇒ Object



60
61
62
63
64
# 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) ⇒ Object



47
48
49
50
51
52
53
54
55
56
57
58
# 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