Capybara/RSpec

Capybara/RSpec/CurrentPathExpectation

Enabled by default Safe Supports autocorrection Version Added Version Changed

Pending

Yes

Always

1.18

[next]

Checks that no expectations are set on Capybara’s current_path.

The have_current_path matcher should be used on page to set expectations on Capybara’s current path, since it uses Capybara’s waiting functionality which ensures that preceding actions (like click_link) have completed.

This cop does not support autocorrection in some cases.

Examples

# bad
expect(current_path).to eq('/callback')
expect(page.current_path).to eq('/callback')

# good
expect(page).to have_current_path('/callback', ignore_query: true)

# bad (does not support autocorrection when `match` with a variable)
expect(page).to match(variable)

Capybara/RSpec/HaveContent

Enabled by default Safe Supports autocorrection Version Added Version Changed

Pending

Yes

Always

[next]

-

Checks for usage of have_content and have_no_content.

Capybara provides have_text and have_no_text matchers that are more concise and preferred over their aliases have_content and have_no_content.

Examples

# bad
expect(page).to have_content('capy')
expect(page).to have_no_content('bara')

# good
expect(page).to have_text('capy')
expect(page).to have_no_text('bara')

Capybara/RSpec/HaveSelector

Enabled by default Safe Supports autocorrection Version Added Version Changed

Pending

Yes

Always

2.19

-

Use have_css or have_xpath instead of have_selector.

Examples

# bad
expect(foo).to have_selector(:css, 'bar')

# good
expect(foo).to have_css('bar')

# bad
expect(foo).to have_selector(:xpath, 'bar')

# good
expect(foo).to have_xpath('bar')

DefaultSelector: css (default)

# bad
expect(foo).to have_selector('bar')

# good
expect(foo).to have_css('bar')

DefaultSelector: xpath

# bad
expect(foo).to have_selector('bar')

# good
expect(foo).to have_xpath('bar')

Configurable attributes

Name Default value Configurable values

DefaultSelector

css

String

Capybara/RSpec/MatchStyle

Enabled by default Safe Supports autocorrection Version Added Version Changed

Pending

Yes

Always

[next]

-

Checks for usage of deprecated style methods in RSpec matchers.

Examples

when using has_style?

# bad
expect(page.find(:css, 'first')
  .has_style?(display: 'block')).to be true

# good
expect(page.find(:css, 'first')
  .matches_style?(display: 'block')).to be true

when using have_style

# bad
expect(page).to have_style(display: 'block')

# good
expect(page).to match_style(display: 'block')

Capybara/RSpec/NegationMatcher

Enabled by default Safe Supports autocorrection Version Added Version Changed

Pending

Yes

Always

2.14

[next]

Enforces use of have_no_* or not_to for negated expectations.

Examples

EnforcedStyle: have_no (default)

# bad
expect(page).not_to have_selector 'a'
expect(page).not_to have_css('a')

# good
expect(page).to have_no_selector 'a'
expect(page).to have_no_css('a')

EnforcedStyle: not_to

# bad
expect(page).to have_no_selector 'a'
expect(page).to have_no_css('a')

# good
expect(page).not_to have_selector 'a'
expect(page).not_to have_css('a')

Configurable attributes

Name Default value Configurable values

EnforcedStyle

have_no

have_no, not_to

Capybara/RSpec/NegationMatcherAfterVisit

Enabled by default Safe Supports autocorrection Version Added Version Changed

Pending

Yes

No

2.22

[next]

Do not allow negative matchers to be used immediately after visit.

Examples

# bad
visit foo_path
expect(page).to have_no_link('bar')
expect(page).to have_css('a')

# good
visit foo_path
expect(page).to have_css('a')
expect(page).to have_no_link('bar')

# bad
visit foo_path
expect(page).not_to have_link('bar')
expect(page).to have_css('a')

# good
visit foo_path
expect(page).to have_css('a')
expect(page).not_to have_link('bar')

Capybara/RSpec/PredicateMatcher

Enabled by default Safe Supports autocorrection Version Added Version Changed

Pending

Yes

Always

2.19

-

Prefer using predicate matcher over using predicate method directly.

Capybara defines magic matchers for predicate methods. This cop recommends to use the predicate matcher instead of using predicate method directly.

Examples

Strict: true, EnforcedStyle: inflected (default)

# bad
expect(foo.matches_css?(bar: 'baz')).to be_truthy
expect(foo.matches_selector?(bar: 'baz')).to be_truthy
expect(foo.matches_style?(bar: 'baz')).to be_truthy
expect(foo.matches_xpath?(bar: 'baz')).to be_truthy

# good
expect(foo).to match_css(bar: 'baz')
expect(foo).to match_selector(bar: 'baz')
expect(foo).to match_style(bar: 'baz')
expect(foo).to match_xpath(bar: 'baz')

# also good - It checks "true" strictly.
expect(foo.matches_style?(bar: 'baz')).to be(true)

Strict: false, EnforcedStyle: inflected

# bad
expect(foo.matches_style?(bar: 'baz')).to be_truthy
expect(foo.matches_style?(bar: 'baz')).to be(true)

# good
expect(foo).to match_style(bar: 'baz')

Strict: true, EnforcedStyle: explicit

# bad
expect(foo).to match_style(bar: 'baz')

# good - the above code is rewritten to it by this cop
expect(foo.matches_style?(bar: 'baz')).to be(true)

Strict: false, EnforcedStyle: explicit

# bad
expect(foo).to match_style(bar: 'baz')

# good - the above code is rewritten to it by this cop
expect(foo.matches_style?(bar: 'baz')).to be_truthy

Configurable attributes

Name Default value Configurable values

Strict

true

Boolean

EnforcedStyle

inflected

inflected, explicit

AllowedExplicitMatchers

[]

Array

Capybara/RSpec/SpecificMatcher

Enabled by default Safe Supports autocorrection Version Added Version Changed

Pending

Yes

No

2.12

[next]

Checks for there is a more specific matcher offered by Capybara.

Examples

# bad
expect(page).to have_selector('button')
expect(page).to have_no_selector('button.cls')
expect(page).to have_css('button')
expect(page).to have_no_css('a.cls', href: 'http://example.com')
expect(page).to have_css('table.cls')
expect(page).to have_css('select')
expect(page).to have_css('input', exact_text: 'foo')

# good
expect(page).to have_button
expect(page).to have_no_button(class: 'cls')
expect(page).to have_button
expect(page).to have_no_link('foo', class: 'cls', href: 'http://example.com')
expect(page).to have_table(class: 'cls')
expect(page).to have_select
expect(page).to have_field(with: 'foo')

Capybara/RSpec/VisibilityMatcher

Enabled by default Safe Supports autocorrection Version Added Version Changed

Pending

Yes

No

1.39

[next]

Checks for boolean visibility in Capybara finders.

Capybara lets you find elements that match a certain visibility using the :visible option. :visible accepts both boolean and symbols as values, however using booleans can have unwanted effects. visible: false does not find just invisible elements, but both visible and invisible elements. For expressiveness and clarity, use one of the symbol values, :all, :hidden or :visible. Read more at: https://www.rubydoc.info/gems/capybara/Capybara%2FNode%2FFinders:all

Examples

# bad
expect(page).to have_selector('.foo', visible: false)
expect(page).to have_css('.foo', visible: true)
expect(page).to have_link('my link', visible: false)

# good
expect(page).to have_selector('.foo', visible: :visible)
expect(page).to have_css('.foo', visible: :all)
expect(page).to have_link('my link', visible: :hidden)