rubocop-rspec 2.0.0 → 2.4.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +39 -0
- data/README.md +3 -3
- data/config/default.yml +141 -125
- data/lib/rubocop-rspec.rb +1 -0
- data/lib/rubocop/cop/rspec/any_instance.rb +6 -10
- data/lib/rubocop/cop/rspec/around_block.rb +3 -1
- data/lib/rubocop/cop/rspec/be.rb +2 -1
- data/lib/rubocop/cop/rspec/be_eql.rb +2 -0
- data/lib/rubocop/cop/rspec/before_after_all.rb +6 -3
- data/lib/rubocop/cop/rspec/capybara/current_path_expectation.rb +5 -0
- data/lib/rubocop/cop/rspec/capybara/feature_methods.rb +3 -0
- data/lib/rubocop/cop/rspec/capybara/visibility_matcher.rb +4 -0
- data/lib/rubocop/cop/rspec/context_method.rb +1 -0
- data/lib/rubocop/cop/rspec/context_wording.rb +7 -1
- data/lib/rubocop/cop/rspec/describe_class.rb +4 -1
- data/lib/rubocop/cop/rspec/describe_method.rb +2 -1
- data/lib/rubocop/cop/rspec/describe_symbol.rb +2 -0
- data/lib/rubocop/cop/rspec/described_class.rb +6 -1
- data/lib/rubocop/cop/rspec/described_class_module_wrapping.rb +2 -1
- data/lib/rubocop/cop/rspec/dialect.rb +1 -0
- data/lib/rubocop/cop/rspec/empty_hook.rb +1 -0
- data/lib/rubocop/cop/rspec/example_length.rb +26 -12
- data/lib/rubocop/cop/rspec/example_without_description.rb +1 -0
- data/lib/rubocop/cop/rspec/example_wording.rb +1 -0
- data/lib/rubocop/cop/rspec/expect_actual.rb +2 -0
- data/lib/rubocop/cop/rspec/expect_change.rb +6 -3
- data/lib/rubocop/cop/rspec/expect_in_hook.rb +1 -0
- data/lib/rubocop/cop/rspec/expect_output.rb +1 -1
- data/lib/rubocop/cop/rspec/factory_bot/attribute_defined_statically.rb +3 -0
- data/lib/rubocop/cop/rspec/factory_bot/create_list.rb +4 -0
- data/lib/rubocop/cop/rspec/factory_bot/factory_class_name.rb +2 -0
- data/lib/rubocop/cop/rspec/file_path.rb +31 -20
- data/lib/rubocop/cop/rspec/focus.rb +33 -1
- data/lib/rubocop/cop/rspec/hook_argument.rb +2 -0
- data/lib/rubocop/cop/rspec/hooks_before_examples.rb +1 -0
- data/lib/rubocop/cop/rspec/identical_equality_assertion.rb +38 -0
- data/lib/rubocop/cop/rspec/implicit_block_expectation.rb +4 -0
- data/lib/rubocop/cop/rspec/implicit_expect.rb +1 -0
- data/lib/rubocop/cop/rspec/implicit_subject.rb +19 -1
- data/lib/rubocop/cop/rspec/instance_spy.rb +3 -1
- data/lib/rubocop/cop/rspec/instance_variable.rb +4 -0
- data/lib/rubocop/cop/rspec/it_behaves_like.rb +3 -1
- data/lib/rubocop/cop/rspec/iterated_expectation.rb +3 -1
- data/lib/rubocop/cop/rspec/let_before_examples.rb +1 -0
- data/lib/rubocop/cop/rspec/let_setup.rb +3 -0
- data/lib/rubocop/cop/rspec/message_chain.rb +4 -10
- data/lib/rubocop/cop/rspec/message_expectation.rb +3 -0
- data/lib/rubocop/cop/rspec/message_spies.rb +4 -2
- data/lib/rubocop/cop/rspec/mixin/comments_help.rb +38 -0
- data/lib/rubocop/cop/rspec/mixin/variable.rb +1 -0
- data/lib/rubocop/cop/rspec/multiple_describes.rb +1 -2
- data/lib/rubocop/cop/rspec/multiple_expectations.rb +3 -0
- data/lib/rubocop/cop/rspec/named_subject.rb +3 -0
- data/lib/rubocop/cop/rspec/not_to_not.rb +2 -0
- data/lib/rubocop/cop/rspec/overwriting_setup.rb +2 -0
- data/lib/rubocop/cop/rspec/pending.rb +4 -0
- data/lib/rubocop/cop/rspec/predicate_matcher.rb +5 -0
- data/lib/rubocop/cop/rspec/rails/avoid_setup_hook.rb +44 -0
- data/lib/rubocop/cop/rspec/rails/http_status.rb +2 -0
- data/lib/rubocop/cop/rspec/receive_counts.rb +4 -0
- data/lib/rubocop/cop/rspec/receive_never.rb +2 -0
- data/lib/rubocop/cop/rspec/repeated_example_group_body.rb +8 -1
- data/lib/rubocop/cop/rspec/repeated_example_group_description.rb +4 -0
- data/lib/rubocop/cop/rspec/repeated_include_example.rb +3 -0
- data/lib/rubocop/cop/rspec/return_from_stub.rb +6 -0
- data/lib/rubocop/cop/rspec/scattered_setup.rb +1 -1
- data/lib/rubocop/cop/rspec/shared_context.rb +6 -5
- data/lib/rubocop/cop/rspec/shared_examples.rb +1 -0
- data/lib/rubocop/cop/rspec/single_argument_message_chain.rb +4 -1
- data/lib/rubocop/cop/rspec/stubbed_mock.rb +1 -0
- data/lib/rubocop/cop/rspec/subject_stub.rb +15 -4
- data/lib/rubocop/cop/rspec/unspecified_exception.rb +2 -0
- data/lib/rubocop/cop/rspec/verified_doubles.rb +2 -0
- data/lib/rubocop/cop/rspec/void_expect.rb +3 -0
- data/lib/rubocop/cop/rspec/yield.rb +3 -0
- data/lib/rubocop/cop/rspec_cops.rb +2 -0
- data/lib/rubocop/rspec/config_formatter.rb +3 -1
- data/lib/rubocop/rspec/corrector/move_node.rb +6 -9
- data/lib/rubocop/rspec/example.rb +5 -0
- data/lib/rubocop/rspec/hook.rb +1 -0
- data/lib/rubocop/rspec/language.rb +10 -0
- data/lib/rubocop/rspec/node.rb +1 -1
- data/lib/rubocop/rspec/version.rb +1 -1
- metadata +9 -6
data/lib/rubocop-rspec.rb
CHANGED
@@ -15,6 +15,7 @@ require_relative 'rubocop/rspec/language'
|
|
15
15
|
require_relative 'rubocop/cop/rspec/mixin/top_level_group'
|
16
16
|
require_relative 'rubocop/cop/rspec/mixin/variable'
|
17
17
|
require_relative 'rubocop/cop/rspec/mixin/final_end_location'
|
18
|
+
require_relative 'rubocop/cop/rspec/mixin/comments_help'
|
18
19
|
require_relative 'rubocop/cop/rspec/mixin/empty_line_separation'
|
19
20
|
|
20
21
|
require_relative 'rubocop/rspec/concept'
|
@@ -24,18 +24,14 @@ module RuboCop
|
|
24
24
|
# end
|
25
25
|
class AnyInstance < Base
|
26
26
|
MSG = 'Avoid stubbing using `%<method>s`.'
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
27
|
+
RESTRICT_ON_SEND = %i[
|
28
|
+
any_instance
|
29
|
+
allow_any_instance_of
|
30
|
+
expect_any_instance_of
|
31
|
+
].freeze
|
31
32
|
|
32
33
|
def on_send(node)
|
33
|
-
|
34
|
-
add_offense(
|
35
|
-
node,
|
36
|
-
message: format(MSG, method: method)
|
37
|
-
)
|
38
|
-
end
|
34
|
+
add_offense(node, message: format(MSG, method: node.method_name))
|
39
35
|
end
|
40
36
|
end
|
41
37
|
end
|
@@ -27,13 +27,15 @@ module RuboCop
|
|
27
27
|
# end
|
28
28
|
class AroundBlock < Base
|
29
29
|
MSG_NO_ARG = 'Test object should be passed to around block.'
|
30
|
-
MSG_UNUSED_ARG = 'You should call `%<arg>s.call` '\
|
30
|
+
MSG_UNUSED_ARG = 'You should call `%<arg>s.call` ' \
|
31
31
|
'or `%<arg>s.run`.'
|
32
32
|
|
33
|
+
# @!method hook(node)
|
33
34
|
def_node_matcher :hook, <<-PATTERN
|
34
35
|
(block (send nil? :around sym ?) (args $...) ...)
|
35
36
|
PATTERN
|
36
37
|
|
38
|
+
# @!method find_arg_usage(node)
|
37
39
|
def_node_search :find_arg_usage, <<-PATTERN
|
38
40
|
{(send $... {:call :run}) (send _ _ $...) (yield $...) (block-pass $...)}
|
39
41
|
PATTERN
|
data/lib/rubocop/cop/rspec/be.rb
CHANGED
@@ -20,8 +20,9 @@ module RuboCop
|
|
20
20
|
# expect(foo).to be(true)
|
21
21
|
#
|
22
22
|
class Be < Base
|
23
|
-
MSG =
|
23
|
+
MSG = "Don't use `be` without an argument."
|
24
24
|
|
25
|
+
# @!method be_without_args(node)
|
25
26
|
def_node_matcher :be_without_args, <<-PATTERN
|
26
27
|
(send _ #Runners.all $(send nil? :be))
|
27
28
|
PATTERN
|
@@ -39,7 +39,9 @@ module RuboCop
|
|
39
39
|
extend AutoCorrector
|
40
40
|
|
41
41
|
MSG = 'Prefer `be` over `eql`.'
|
42
|
+
RESTRICT_ON_SEND = %i[to].freeze
|
42
43
|
|
44
|
+
# @!method eql_type_with_identity(node)
|
43
45
|
def_node_matcher :eql_type_with_identity, <<-PATTERN
|
44
46
|
(send _ :to $(send nil? :eql {true false int float sym nil_type?}))
|
45
47
|
PATTERN
|
@@ -24,11 +24,14 @@ module RuboCop
|
|
24
24
|
# after(:each) { Widget.delete_all }
|
25
25
|
# end
|
26
26
|
class BeforeAfterAll < Base
|
27
|
-
MSG = 'Beware of using `%<hook>s` as it may cause state to leak '\
|
28
|
-
'between tests. If you are using `rspec-rails`, and '\
|
29
|
-
'`use_transactional_fixtures` is enabled, then records created '\
|
27
|
+
MSG = 'Beware of using `%<hook>s` as it may cause state to leak ' \
|
28
|
+
'between tests. If you are using `rspec-rails`, and ' \
|
29
|
+
'`use_transactional_fixtures` is enabled, then records created ' \
|
30
30
|
'in `%<hook>s` are not automatically rolled back.'
|
31
31
|
|
32
|
+
RESTRICT_ON_SEND = %i[before after].freeze
|
33
|
+
|
34
|
+
# @!method before_or_after_all(node)
|
32
35
|
def_node_matcher :before_or_after_all, <<-PATTERN
|
33
36
|
$(send _ {:before :after} (sym {:all :context}))
|
34
37
|
PATTERN
|
@@ -30,17 +30,22 @@ module RuboCop
|
|
30
30
|
'Capybara feature specs - instead, use the ' \
|
31
31
|
'`have_current_path` matcher on `page`'
|
32
32
|
|
33
|
+
RESTRICT_ON_SEND = %i[expect].freeze
|
34
|
+
|
35
|
+
# @!method expectation_set_on_current_path(node)
|
33
36
|
def_node_matcher :expectation_set_on_current_path, <<-PATTERN
|
34
37
|
(send nil? :expect (send {(send nil? :page) nil?} :current_path))
|
35
38
|
PATTERN
|
36
39
|
|
37
40
|
# Supported matchers: eq(...) / match(/regexp/) / match('regexp')
|
41
|
+
# @!method as_is_matcher(node)
|
38
42
|
def_node_matcher :as_is_matcher, <<-PATTERN
|
39
43
|
(send
|
40
44
|
#expectation_set_on_current_path $#Runners.all
|
41
45
|
${(send nil? :eq ...) (send nil? :match (regexp ...))})
|
42
46
|
PATTERN
|
43
47
|
|
48
|
+
# @!method regexp_str_matcher(node)
|
44
49
|
def_node_matcher :regexp_str_matcher, <<-PATTERN
|
45
50
|
(send
|
46
51
|
#expectation_set_on_current_path $#Runners.all
|
@@ -55,16 +55,19 @@ module RuboCop
|
|
55
55
|
feature: :describe
|
56
56
|
}.freeze
|
57
57
|
|
58
|
+
# @!method capybara_speak(node)
|
58
59
|
def_node_matcher :capybara_speak, <<-PATTERN
|
59
60
|
{#{MAP.keys.map(&:inspect).join(' ')}}
|
60
61
|
PATTERN
|
61
62
|
|
63
|
+
# @!method spec?(node)
|
62
64
|
def_node_matcher :spec?, <<-PATTERN
|
63
65
|
(block
|
64
66
|
(send #rspec? {:describe :feature} ...)
|
65
67
|
...)
|
66
68
|
PATTERN
|
67
69
|
|
70
|
+
# @!method feature_method(node)
|
68
71
|
def_node_matcher :feature_method, <<-PATTERN
|
69
72
|
(block
|
70
73
|
$(send #rspec? $#capybara_speak ...)
|
@@ -44,10 +44,14 @@ module RuboCop
|
|
44
44
|
have_content
|
45
45
|
].freeze
|
46
46
|
|
47
|
+
RESTRICT_ON_SEND = CAPYBARA_MATCHER_METHODS
|
48
|
+
|
49
|
+
# @!method visible_true?(node)
|
47
50
|
def_node_matcher :visible_true?, <<~PATTERN
|
48
51
|
(send nil? #capybara_matcher? ... (hash <$(pair (sym :visible) true) ...>))
|
49
52
|
PATTERN
|
50
53
|
|
54
|
+
# @!method visible_false?(node)
|
51
55
|
def_node_matcher :visible_false?, <<~PATTERN
|
52
56
|
(send nil? #capybara_matcher? ... (hash <$(pair (sym :visible) false) ...>))
|
53
57
|
PATTERN
|
@@ -8,6 +8,7 @@ module RuboCop
|
|
8
8
|
# The default list of prefixes is minimal. Users are encouraged to tailor
|
9
9
|
# the configuration to meet project needs. Other acceptable prefixes may
|
10
10
|
# include `if`, `unless`, `for`, `before`, `after`, or `during`.
|
11
|
+
# They may consist of multiple words if desired.
|
11
12
|
#
|
12
13
|
# @see https://rspec.rubystyle.guide/#context-descriptions
|
13
14
|
# @see http://www.betterspecs.org/#contexts
|
@@ -37,6 +38,7 @@ module RuboCop
|
|
37
38
|
class ContextWording < Base
|
38
39
|
MSG = 'Start context description with %<prefixes>s.'
|
39
40
|
|
41
|
+
# @!method context_wording(node)
|
40
42
|
def_node_matcher :context_wording, <<-PATTERN
|
41
43
|
(block (send #rspec? { :context :shared_context } $(str #bad_prefix?) ...) ...)
|
42
44
|
PATTERN
|
@@ -51,7 +53,7 @@ module RuboCop
|
|
51
53
|
private
|
52
54
|
|
53
55
|
def bad_prefix?(description)
|
54
|
-
!
|
56
|
+
!prefix_regex.match?(description)
|
55
57
|
end
|
56
58
|
|
57
59
|
def joined_prefixes
|
@@ -65,6 +67,10 @@ module RuboCop
|
|
65
67
|
def prefixes
|
66
68
|
cop_config['Prefixes'] || []
|
67
69
|
end
|
70
|
+
|
71
|
+
def prefix_regex
|
72
|
+
/^#{Regexp.union(prefixes)}\b/
|
73
|
+
end
|
68
74
|
end
|
69
75
|
end
|
70
76
|
end
|
@@ -37,17 +37,20 @@ module RuboCop
|
|
37
37
|
class DescribeClass < Base
|
38
38
|
include TopLevelGroup
|
39
39
|
|
40
|
-
MSG = 'The first argument to describe should be '\
|
40
|
+
MSG = 'The first argument to describe should be ' \
|
41
41
|
'the class or module being tested.'
|
42
42
|
|
43
|
+
# @!method example_group_with_ignored_metadata?(node)
|
43
44
|
def_node_matcher :example_group_with_ignored_metadata?, <<~PATTERN
|
44
45
|
(send #rspec? :describe ... (hash <#ignored_metadata? ...>))
|
45
46
|
PATTERN
|
46
47
|
|
48
|
+
# @!method not_a_const_described(node)
|
47
49
|
def_node_matcher :not_a_const_described, <<~PATTERN
|
48
50
|
(send #rspec? :describe $[!const !#string_constant?] ...)
|
49
51
|
PATTERN
|
50
52
|
|
53
|
+
# @!method sym_pair(node)
|
51
54
|
def_node_matcher :sym_pair, <<~PATTERN
|
52
55
|
(pair $sym $sym)
|
53
56
|
PATTERN
|
@@ -19,9 +19,10 @@ module RuboCop
|
|
19
19
|
class DescribeMethod < Base
|
20
20
|
include TopLevelGroup
|
21
21
|
|
22
|
-
MSG = 'The second argument to describe should be the method '\
|
22
|
+
MSG = 'The second argument to describe should be the method ' \
|
23
23
|
"being tested. '#instance' or '.class'."
|
24
24
|
|
25
|
+
# @!method second_argument(node)
|
25
26
|
def_node_matcher :second_argument, <<~PATTERN
|
26
27
|
(block
|
27
28
|
(send #rspec? :describe _first_argument $(str _) ...) ...
|
@@ -19,7 +19,9 @@ module RuboCop
|
|
19
19
|
# @see https://github.com/rspec/rspec-core/issues/1610
|
20
20
|
class DescribeSymbol < Base
|
21
21
|
MSG = 'Avoid describing symbols.'
|
22
|
+
RESTRICT_ON_SEND = %i[describe].freeze
|
22
23
|
|
24
|
+
# @!method describe_symbol?(node)
|
23
25
|
def_node_matcher :describe_symbol?, <<-PATTERN
|
24
26
|
(send #rspec? :describe $sym ...)
|
25
27
|
PATTERN
|
@@ -61,18 +61,23 @@ module RuboCop
|
|
61
61
|
DESCRIBED_CLASS = 'described_class'
|
62
62
|
MSG = 'Use `%<replacement>s` instead of `%<src>s`.'
|
63
63
|
|
64
|
+
# @!method common_instance_exec_closure?(node)
|
64
65
|
def_node_matcher :common_instance_exec_closure?, <<-PATTERN
|
65
66
|
(block (send (const nil? {:Class :Module :Struct}) :new ...) ...)
|
66
67
|
PATTERN
|
67
68
|
|
69
|
+
# @!method rspec_block?(node)
|
68
70
|
def_node_matcher :rspec_block?, block_pattern('#ALL.all')
|
69
71
|
|
72
|
+
# @!method scope_changing_syntax?(node)
|
70
73
|
def_node_matcher :scope_changing_syntax?, '{def class module}'
|
71
74
|
|
75
|
+
# @!method described_constant(node)
|
72
76
|
def_node_matcher :described_constant, <<-PATTERN
|
73
77
|
(block (send _ :describe $(const ...) ...) (args) $_)
|
74
78
|
PATTERN
|
75
79
|
|
80
|
+
# @!method contains_described_class?(node)
|
76
81
|
def_node_search :contains_described_class?, <<-PATTERN
|
77
82
|
(send nil? :described_class)
|
78
83
|
PATTERN
|
@@ -198,7 +203,7 @@ module RuboCop
|
|
198
203
|
[name]
|
199
204
|
elsif namespace.const_type?
|
200
205
|
[*const_name(namespace), name]
|
201
|
-
elsif
|
206
|
+
elsif %i[lvar cbase send].include?(namespace.type)
|
202
207
|
[nil, name]
|
203
208
|
end
|
204
209
|
end
|
@@ -18,10 +18,11 @@ module RuboCop
|
|
18
18
|
# # ...
|
19
19
|
# end
|
20
20
|
#
|
21
|
-
# @see https://github.com/rubocop
|
21
|
+
# @see https://github.com/rubocop/rubocop-rspec/issues/735
|
22
22
|
class DescribedClassModuleWrapping < Base
|
23
23
|
MSG = 'Avoid opening modules and defining specs within them.'
|
24
24
|
|
25
|
+
# @!method find_rspec_blocks(node)
|
25
26
|
def_node_search :find_rspec_blocks, block_pattern('#ExampleGroups.all')
|
26
27
|
|
27
28
|
def on_module(node)
|
@@ -25,29 +25,43 @@ module RuboCop
|
|
25
25
|
# result = service.call
|
26
26
|
# expect(result).to be(true)
|
27
27
|
# end
|
28
|
+
#
|
29
|
+
# You can set literals you want to fold with `CountAsOne`.
|
30
|
+
# Available are: 'array', 'hash', and 'heredoc'. Each literal
|
31
|
+
# will be counted as one line regardless of its actual size.
|
32
|
+
#
|
33
|
+
# @example CountAsOne: ['array', 'heredoc']
|
34
|
+
#
|
35
|
+
# it do
|
36
|
+
# array = [ # +1
|
37
|
+
# 1,
|
38
|
+
# 2
|
39
|
+
# ]
|
40
|
+
#
|
41
|
+
# hash = { # +3
|
42
|
+
# key: 'value'
|
43
|
+
# }
|
44
|
+
#
|
45
|
+
# msg = <<~HEREDOC # +1
|
46
|
+
# Heredoc
|
47
|
+
# content.
|
48
|
+
# HEREDOC
|
49
|
+
# end # 5 points
|
28
50
|
class ExampleLength < Base
|
29
51
|
include CodeLength
|
30
52
|
|
31
|
-
|
53
|
+
LABEL = 'Example'
|
32
54
|
|
33
55
|
def on_block(node)
|
34
56
|
return unless example?(node)
|
35
57
|
|
36
|
-
|
37
|
-
|
38
|
-
return unless length > max_length
|
39
|
-
|
40
|
-
add_offense(node, message: message(length))
|
58
|
+
check_code_length(node)
|
41
59
|
end
|
42
60
|
|
43
61
|
private
|
44
62
|
|
45
|
-
def
|
46
|
-
|
47
|
-
end
|
48
|
-
|
49
|
-
def message(length)
|
50
|
-
format(MSG, total: length, max: max_length)
|
63
|
+
def cop_label
|
64
|
+
LABEL
|
51
65
|
end
|
52
66
|
end
|
53
67
|
end
|
@@ -45,6 +45,7 @@ module RuboCop
|
|
45
45
|
|
46
46
|
SUPPORTED_MATCHERS = %i[eq eql equal be].freeze
|
47
47
|
|
48
|
+
# @!method expect_literal(node)
|
48
49
|
def_node_matcher :expect_literal, <<~PATTERN
|
49
50
|
(send
|
50
51
|
(send nil? :expect $#literal?)
|
@@ -60,6 +61,7 @@ module RuboCop
|
|
60
61
|
expect_literal(node) do |actual, matcher, expected|
|
61
62
|
add_offense(actual.source_range) do |corrector|
|
62
63
|
next unless SUPPORTED_MATCHERS.include?(matcher)
|
64
|
+
next if literal?(expected)
|
63
65
|
|
64
66
|
swap(corrector, actual, expected)
|
65
67
|
end
|
@@ -35,11 +35,14 @@ module RuboCop
|
|
35
35
|
|
36
36
|
MSG_BLOCK = 'Prefer `change(%<obj>s, :%<attr>s)`.'
|
37
37
|
MSG_CALL = 'Prefer `change { %<obj>s.%<attr>s }`.'
|
38
|
+
RESTRICT_ON_SEND = %i[change].freeze
|
38
39
|
|
40
|
+
# @!method expect_change_with_arguments(node)
|
39
41
|
def_node_matcher :expect_change_with_arguments, <<-PATTERN
|
40
|
-
(send nil? :change
|
42
|
+
(send nil? :change $_ (sym $_))
|
41
43
|
PATTERN
|
42
44
|
|
45
|
+
# @!method expect_change_with_block(node)
|
43
46
|
def_node_matcher :expect_change_with_block, <<-PATTERN
|
44
47
|
(block
|
45
48
|
(send nil? :change)
|
@@ -52,9 +55,9 @@ module RuboCop
|
|
52
55
|
return unless style == :block
|
53
56
|
|
54
57
|
expect_change_with_arguments(node) do |receiver, message|
|
55
|
-
msg = format(MSG_CALL, obj: receiver, attr: message)
|
58
|
+
msg = format(MSG_CALL, obj: receiver.source, attr: message)
|
56
59
|
add_offense(node, message: msg) do |corrector|
|
57
|
-
replacement = "change { #{receiver}.#{message} }"
|
60
|
+
replacement = "change { #{receiver.source}.#{message} }"
|
58
61
|
corrector.replace(node, replacement)
|
59
62
|
end
|
60
63
|
end
|
@@ -15,7 +15,7 @@ module RuboCop
|
|
15
15
|
# # good
|
16
16
|
# expect { my_app.print_report }.to output('Hello World').to_stdout
|
17
17
|
class ExpectOutput < Base
|
18
|
-
MSG = 'Use `expect { ... }.to output(...).to_%<name>s` '\
|
18
|
+
MSG = 'Use `expect { ... }.to output(...).to_%<name>s` ' \
|
19
19
|
'instead of mutating $%<name>s.'
|
20
20
|
|
21
21
|
def on_gvasgn(node)
|