spec/rubocop/cop/rspec/named_subject_spec.rb in rubocop-rspec-1.30.1 vs spec/rubocop/cop/rspec/named_subject_spec.rb in rubocop-rspec-1.31.0

- old
+ new

@@ -1,62 +1,123 @@ # frozen_string_literal: true -RSpec.describe RuboCop::Cop::RSpec::NamedSubject do - subject(:cop) { described_class.new } +RSpec.describe RuboCop::Cop::RSpec::NamedSubject, :config do + subject(:cop) { described_class.new(config) } - it 'checks `it` and `specify` for explicit subject usage' do - expect_offense(<<-RUBY) - RSpec.describe User do - subject { described_class.new } + shared_examples_for 'checking subject outside of shared examples' do + it 'checks `it` and `specify` for explicit subject usage' do + expect_offense(<<-RUBY) + RSpec.describe User do + subject { described_class.new } - it "is valid" do - expect(subject.valid?).to be(true) - ^^^^^^^ Name your test subject if you need to reference it explicitly. + it "is valid" do + expect(subject.valid?).to be(true) + ^^^^^^^ Name your test subject if you need to reference it explicitly. + end + + specify do + expect(subject.valid?).to be(true) + ^^^^^^^ Name your test subject if you need to reference it explicitly. + end end + RUBY + end - specify do - expect(subject.valid?).to be(true) - ^^^^^^^ Name your test subject if you need to reference it explicitly. + it 'checks before and after for explicit subject usage' do + expect_offense(<<-RUBY) + RSpec.describe User do + subject { described_class.new } + + before(:each) do + do_something_with(subject) + ^^^^^^^ Name your test subject if you need to reference it explicitly. + end + + after do + do_something_with(subject) + ^^^^^^^ Name your test subject if you need to reference it explicitly. + end end - end - RUBY - end + RUBY + end - it 'checks before and after for explicit subject usage' do - expect_offense(<<-RUBY) - RSpec.describe User do - subject { described_class.new } + it 'checks around(:each) for explicit subject usage' do + expect_offense(<<-RUBY) + RSpec.describe User do + subject { described_class.new } - before(:each) do - do_something_with(subject) - ^^^^^^^ Name your test subject if you need to reference it explicitly. + around(:each) do |test| + do_something_with(subject) + ^^^^^^^ Name your test subject if you need to reference it explicitly. + end end + RUBY + end - after do - do_something_with(subject) - ^^^^^^^ Name your test subject if you need to reference it explicitly. + it 'ignores subject when not wrapped inside a test' do + expect_no_offenses(<<-RUBY) + def foo + it(subject) end - end - RUBY + RUBY + end end - it 'checks around(:each) for explicit subject usage' do - expect_offense(<<-RUBY) - RSpec.describe User do - subject { described_class.new } + context 'when IgnoreSharedExamples is false' do + let(:cop_config) { { 'IgnoreSharedExamples' => false } } - around(:each) do |test| - do_something_with(subject) - ^^^^^^^ Name your test subject if you need to reference it explicitly. + it_behaves_like 'checking subject outside of shared examples' + + it 'checks shared_examples for explicit subject usage' do + expect_offense(<<-RUBY) + RSpec.describe User do + subject(:new_user) { described_class.new } + + shared_examples_for 'a valid new user' do + it "is a User" do + expect(subject).to be_a(User) + ^^^^^^^ Name your test subject if you need to reference it explicitly. + end + + it "is valid" do + expect(subject.valid?).to be(true) + ^^^^^^^ Name your test subject if you need to reference it explicitly. + end + + it "is new" do + expect(subject).to be_new_record + ^^^^^^^ Name your test subject if you need to reference it explicitly. + end + end end - end - RUBY + RUBY + end end - it 'ignores subject when not wrapped inside a test' do - expect_no_offenses(<<-RUBY) - def foo - it(subject) - end - RUBY + context 'when IgnoreSharedExamples is true' do + let(:cop_config) { { 'IgnoreSharedExamples' => true } } + + it_behaves_like 'checking subject outside of shared examples' + + it 'ignores explicit subject in shared_examples' do + expect_no_offenses(<<-RUBY) + RSpec.describe User do + subject(:new_user) { described_class.new } + + shared_examples_for 'a valid new user' do + it "is a User" do + expect(subject).to be_a(User) + end + + it "is valid" do + expect(subject.valid?).to be(true) + end + + it "is new" do + expect(subject).to be_new_record + end + end + end + RUBY + end end end