From 2115e8330cfba1952ec8de38ae8e0c3458441ec0 Mon Sep 17 00:00:00 2001 From: ydah Date: Thu, 2 Oct 2025 21:21:35 +0900 Subject: [PATCH] Enhance documentation and tests for VerifiedDoubles cop While reviewing the following PR, I noticed that there is no documentation for cop_config in the relevant Cop, so I will add it. - https://github.com/rubocop/rubocop-rspec/pull/2112 --- docs/modules/ROOT/pages/cops_rspec.adoc | 68 ++++++++++++++++++- lib/rubocop/cop/rspec/verified_doubles.rb | 48 ++++++++++++- .../cop/rspec/verified_doubles_spec.rb | 16 +++++ 3 files changed, 128 insertions(+), 4 deletions(-) diff --git a/docs/modules/ROOT/pages/cops_rspec.adoc b/docs/modules/ROOT/pages/cops_rspec.adoc index 9c3dce6ce..cfa5c0f07 100644 --- a/docs/modules/ROOT/pages/cops_rspec.adoc +++ b/docs/modules/ROOT/pages/cops_rspec.adoc @@ -6598,18 +6598,82 @@ Prefer using verifying doubles over normal doubles. ---- # bad let(:foo) do - double(method_name: 'returned value') + double("ClassName", method_name: 'returned value') end # bad let(:foo) do - double("ClassName", method_name: 'returned value') + spy("ClassName", method_name: 'returned value') end # good let(:foo) do instance_double("ClassName", method_name: 'returned value') end + +# good +let(:foo) do + class_double("ClassName", method_name: 'returned value') +end + +# good +let(:foo) do + object_double("some object", method_name: 'returned value') +end +---- + +[#_ignorenameless_-true-_default__-rspecverifieddoubles] +==== `IgnoreNameless: true (default)` + +[source,ruby] +---- +# good +let(:foo) do + double(method_name: 'returned value') +end + +# good +let(:foo) do + double +end +---- + +[#_ignorenameless_-false_-rspecverifieddoubles] +==== `IgnoreNameless: false` + +[source,ruby] +---- +# bad +let(:foo) do + double(method_name: 'returned value') +end + +# bad +let(:foo) do + double +end +---- + +[#_ignoresymbolicnames_-false-_default__-rspecverifieddoubles] +==== `IgnoreSymbolicNames: false (default)` + +[source,ruby] +---- +# bad +let(:foo) do + double(:foo) +end +---- + +[#_ignoresymbolicnames_-true_-rspecverifieddoubles] +==== `IgnoreSymbolicNames: true` + +[source,ruby] +---- +# good +let(:foo) do + double(:foo) +end ---- [#configurable-attributes-rspecverifieddoubles] diff --git a/lib/rubocop/cop/rspec/verified_doubles.rb b/lib/rubocop/cop/rspec/verified_doubles.rb index 51c6137c0..7f2c3cfb1 100644 --- a/lib/rubocop/cop/rspec/verified_doubles.rb +++ b/lib/rubocop/cop/rspec/verified_doubles.rb @@ -10,12 +10,12 @@ module RSpec # @example # # bad # let(:foo) do - # double(method_name: 'returned value') + # double("ClassName", method_name: 'returned value') # end # # # bad # let(:foo) do - # double("ClassName", method_name: 'returned value') + # spy("ClassName", method_name: 'returned value') # end # # # good @@ -23,6 +23,50 @@ module RSpec # instance_double("ClassName", method_name: 'returned value') # end # + # # good + # let(:foo) do + # class_double("ClassName", method_name: 'returned value') + # end + # + # # good + # let(:foo) do + # object_double("some object", method_name: 'returned value') + # end + # + # @example `IgnoreNameless: true (default)` + # # good + # let(:foo) do + # double(method_name: 'returned value') + # end + # + # # good + # let(:foo) do + # double + # end + # + # @example `IgnoreNameless: false` + # # bad + # let(:foo) do + # double(method_name: 'returned value') + # end + # + # # bad + # let(:foo) do + # double + # end + # + # @example `IgnoreSymbolicNames: false (default)` + # # bad + # let(:foo) do + # double(:foo) + # end + # + # @example `IgnoreSymbolicNames: true` + # # good + # let(:foo) do + # double(:foo) + # end + # class VerifiedDoubles < Base MSG = 'Prefer using verifying doubles over normal doubles.' RESTRICT_ON_SEND = %i[double spy].freeze diff --git a/spec/rubocop/cop/rspec/verified_doubles_spec.rb b/spec/rubocop/cop/rspec/verified_doubles_spec.rb index 27e7cb549..a64407201 100644 --- a/spec/rubocop/cop/rspec/verified_doubles_spec.rb +++ b/spec/rubocop/cop/rspec/verified_doubles_spec.rb @@ -81,4 +81,20 @@ end RUBY end + + it 'ignores class_doubles' do + expect_no_offenses(<<~RUBY) + it do + foo = class_double("Foo") + end + RUBY + end + + it 'ignores object_doubles' do + expect_no_offenses(<<~RUBY) + it do + foo = object_double("Foo") + end + RUBY + end end