class RuboCop::Cop::RSpec::LeadingSubject
Enforce that subject is the first definition in the test.
@example
# bad let(:params) { blah } subject { described_class.new(params) } before { do_something } subject { described_class.new(params) } it { expect_something } subject { described_class.new(params) } it { expect_something_else } # good subject { described_class.new(params) } let(:params) { blah } # good subject { described_class.new(params) } before { do_something } # good subject { described_class.new(params) } it { expect_something } it { expect_something_else }
Constants
- MSG
Public Instance Methods
Source
# File lib/rubocop/cop/rspec/leading_subject.rb, line 40 def on_block(node) # rubocop:disable InternalAffairs/NumblockHandler return unless subject?(node) return unless inside_example_group?(node) check_previous_nodes(node) end
Private Instance Methods
Source
# File lib/rubocop/cop/rspec/leading_subject.rb, line 70 def autocorrect(corrector, node, sibling) RuboCop::RSpec::Corrector::MoveNode.new( node, corrector, processed_source ).move_before(sibling) end
Source
# File lib/rubocop/cop/rspec/leading_subject.rb, line 49 def check_previous_nodes(node) offending_node(node) do |offender| msg = format(MSG, offending: offender.method_name) add_offense(node, message: msg) do |corrector| autocorrect(corrector, node, offender) end end end
Source
# File lib/rubocop/cop/rspec/leading_subject.rb, line 76 def offending?(node) let?(node) || hook?(node) || example?(node) || spec_group?(node) || include?(node) end
Source
# File lib/rubocop/cop/rspec/leading_subject.rb, line 58 def offending_node(node) parent(node).each_child_node.find do |sibling| break if sibling.equal?(node) yield sibling if offending?(sibling) end end
Source
# File lib/rubocop/cop/rspec/leading_subject.rb, line 66 def parent(node) node.each_ancestor(:block).first.body end