class RuboCop::Cop::RSpec::LeadingSubject
end
end
expect(subject.valid?).to be(true)
it ‘is valid’ do
let(:params) { blah }
subject { described_class.new(params) }
RSpec.describe User do
# good
end
end
expect(subject.valid?).to be(true)
it ‘is valid’ do
subject { described_class.new(params) }
let(:params) { blah }
RSpec.describe User do
# bad
@example
Checks for ‘subject` definitions that come after `let` definitions.
def autocorrect(node)
def autocorrect(node) lambda do |corrector| first_let = find_first_let(node) first_let_position = first_let.loc.expression indent = "\n" + ' ' * first_let.loc.column corrector.insert_before(first_let_position, node.source + indent) corrector.remove(node_range(node)) end end
def find_first_let(node)
def find_first_let(node) node.parent.children.find { |sibling| let?(sibling) } end
def in_spec_block?(node)
def in_spec_block?(node) node.each_ancestor(:block).any? do |ancestor| Examples::ALL.include?(ancestor.method_name) end end
def let?(node)
def let?(node) [:let, :let!].include?(node.method_name) end
def node_range(node)
def node_range(node) range = node.source_range range = range_with_surrounding_space(range, :left, false) range = range_with_surrounding_space(range, :right, true) range end
def on_block(node)
def on_block(node) return unless subject?(node) && !in_spec_block?(node) node.parent.each_child_node do |sibling| break if sibling.equal?(node) break add_offense(node, :expression) if let?(sibling) end end