class RuboCop::Cop::RSpec::ReceiveCounts
expect(foo).to receive(:bar).at_most(:twice).times
expect(foo).to receive(:bar).at_most(:once)
expect(foo).to receive(:bar).at_least(:twice)
expect(foo).to receive(:bar).at_least(:once)
expect(foo).to receive(:bar).twice
expect(foo).to receive(:bar).once
# good
expect(foo).to receive(:bar).at_most(2).times
expect(foo).to receive(:bar).at_most(1).times
expect(foo).to receive(:bar).at_least(2).times
expect(foo).to receive(:bar).at_least(1).times
expect(foo).to receive(:bar).exactly(2).times
expect(foo).to receive(:bar).exactly(1).times
# bad
@example
Check for ‘once` and `twice` receive counts matchers usage.
def autocorrect(corrector, node, range)
def autocorrect(corrector, node, range) replacement = matcher_for( node.method_name, node.first_argument.source.to_i ) corrector.replace(range, replacement) end
def matcher_for(method, count)
def matcher_for(method, count) matcher = count == 1 ? 'once' : 'twice' if method == :exactly ".#{matcher}" else ".#{method}(:#{matcher})" end end
def message_for(node, source)
def message_for(node, source) alternative = matcher_for( node.method_name, node.first_argument.source.to_i ) format(MSG, alternative: alternative, original: source) end
def on_send(node)
def on_send(node) receive_counts(node) do |offending_node| return unless stub?(offending_node.receiver) offending_range = range(node, offending_node) msg = message_for(offending_node, offending_range.source) add_offense(offending_range, message: msg) do |corrector| autocorrect(corrector, offending_node, offending_range) end end end
def range(node, offending_node)
def range(node, offending_node) offending_node.loc.dot.with( end_pos: node.source_range.end_pos ) end