class RuboCop::Cop::RSpec::NamedSubject
end
it { should be_valid }
subject(:user) { described_class.new }
RSpec.describe Foo do
# also good
end
end
expect(user.valid?).to be(true)
it ‘is valid’ do
subject(:user) { described_class.new }
RSpec.describe Foo do
# good
end
end
expect(subject.valid?).to be(true)
it ‘is valid’ do
subject { described_class.new }
RSpec.describe User do
# bad
@example
name.
the most important object in your tests so they deserve a descriptive
`subject(:your_subject_name) { … }‘. Your test subjects should be
reference your test subject you should explicitly name it using
which allows for tests like `it { should be_valid }`. If you need to
RSpec lets you declare an “implicit subject” using `subject { … }`
Checks for explicitly referenced test subjects.
def on_block(node)
def on_block(node) return unless rspec_block?(node) subject_usage(node) do |subject_node| add_offense(subject_node, :selector) end end
def subject_usage(node, &block)
def subject_usage(node, &block) return unless node.is_a?(Parser::AST::Node) unnamed_subject(node, &block) node.children.each do |child| subject_usage(child, &block) end end