rubocop-rspec 1.6.0 → 1.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +22 -0
- data/README.md +23 -0
- data/Rakefile +19 -1
- data/config/default.yml +78 -15
- data/lib/rubocop-rspec.rb +19 -1
- data/lib/rubocop/cop/rspec/any_instance.rb +5 -1
- data/lib/rubocop/cop/rspec/be_eql.rb +58 -0
- data/lib/rubocop/cop/rspec/describe_class.rb +2 -3
- data/lib/rubocop/cop/rspec/describe_method.rb +4 -3
- data/lib/rubocop/cop/rspec/described_class.rb +4 -35
- data/lib/rubocop/cop/rspec/empty_example_group.rb +100 -0
- data/lib/rubocop/cop/rspec/example_length.rb +5 -2
- data/lib/rubocop/cop/rspec/example_wording.rb +5 -2
- data/lib/rubocop/cop/rspec/expect_actual.rb +79 -0
- data/lib/rubocop/cop/rspec/file_path.rb +3 -1
- data/lib/rubocop/cop/rspec/focus.rb +12 -28
- data/lib/rubocop/cop/rspec/hook_argument.rb +122 -0
- data/lib/rubocop/cop/rspec/instance_variable.rb +53 -12
- data/lib/rubocop/cop/rspec/leading_subject.rb +58 -0
- data/lib/rubocop/cop/rspec/let_setup.rb +58 -0
- data/lib/rubocop/cop/rspec/message_chain.rb +33 -0
- data/lib/rubocop/cop/rspec/message_expectation.rb +58 -0
- data/lib/rubocop/cop/rspec/multiple_describes.rb +10 -7
- data/lib/rubocop/cop/rspec/multiple_expectations.rb +89 -0
- data/lib/rubocop/cop/rspec/named_subject.rb +10 -1
- data/lib/rubocop/cop/rspec/nested_groups.rb +125 -0
- data/lib/rubocop/cop/rspec/not_to_not.rb +3 -3
- data/lib/rubocop/cop/rspec/subject_stub.rb +136 -0
- data/lib/rubocop/cop/rspec/verified_doubles.rb +4 -1
- data/lib/rubocop/rspec.rb +10 -0
- data/lib/rubocop/rspec/config_formatter.rb +33 -0
- data/lib/rubocop/rspec/description_extractor.rb +35 -0
- data/lib/rubocop/rspec/inject.rb +2 -6
- data/lib/rubocop/rspec/language.rb +73 -0
- data/lib/rubocop/rspec/language/node_pattern.rb +16 -0
- data/lib/rubocop/rspec/spec_only.rb +61 -0
- data/lib/rubocop/rspec/top_level_describe.rb +6 -0
- data/lib/rubocop/rspec/version.rb +1 -1
- data/rubocop-rspec.gemspec +1 -0
- data/spec/project/changelog_spec.rb +81 -0
- data/spec/project/default_config_spec.rb +52 -0
- data/spec/project/project_requires_spec.rb +8 -0
- data/spec/rubocop/cop/rspec/be_eql_spec.rb +59 -0
- data/spec/rubocop/cop/rspec/described_class_spec.rb +2 -2
- data/spec/rubocop/cop/rspec/empty_example_group_spec.rb +79 -0
- data/spec/rubocop/cop/rspec/example_length_spec.rb +50 -30
- data/spec/rubocop/cop/rspec/example_wording_spec.rb +21 -3
- data/spec/rubocop/cop/rspec/expect_actual_spec.rb +136 -0
- data/spec/rubocop/cop/rspec/file_path_spec.rb +48 -71
- data/spec/rubocop/cop/rspec/focus_spec.rb +1 -1
- data/spec/rubocop/cop/rspec/hook_argument_spec.rb +189 -0
- data/spec/rubocop/cop/rspec/instance_variable_spec.rb +37 -0
- data/spec/rubocop/cop/rspec/leading_subject_spec.rb +54 -0
- data/spec/rubocop/cop/rspec/let_setup_spec.rb +66 -0
- data/spec/rubocop/cop/rspec/message_chain_spec.rb +21 -0
- data/spec/rubocop/cop/rspec/message_expectation_spec.rb +63 -0
- data/spec/rubocop/cop/rspec/multiple_expectations_spec.rb +84 -0
- data/spec/rubocop/cop/rspec/nested_groups_spec.rb +55 -0
- data/spec/rubocop/cop/rspec/not_to_not_spec.rb +12 -2
- data/spec/rubocop/cop/rspec/subject_stub_spec.rb +183 -0
- data/spec/rubocop/rspec/config_formatter_spec.rb +48 -0
- data/spec/rubocop/rspec/description_extractor_spec.rb +35 -0
- data/spec/rubocop/rspec/language/selector_set_spec.rb +29 -0
- data/spec/rubocop/rspec/spec_only_spec.rb +97 -0
- data/spec/shared/rspec_only_cop_behavior.rb +68 -0
- data/spec/spec_helper.rb +13 -1
- metadata +72 -5
- data/spec/project_spec.rb +0 -115
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: cc482ce2af79693a4824889cb1f4e418936466f9
|
4
|
+
data.tar.gz: f0f1ff329a1a1cf4642f38c64258370ae4b269f6
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 871f9e04aaa056cbe3d0b3b73ef22b0ebcf6b1d2c242d94dc823e73a5b93a87683ffc24844a81bfe82849a85baf66d27800a07c7e069b62329da563c3467ef46
|
7
|
+
data.tar.gz: 866bf67d2e134be5e153ad066f7c6c04eec42647e2aad769745a4a4708005a93a437cf0427389170a57c00463bd02a66a05995e5d1f5362cfb38d0d7c025c8c6
|
data/CHANGELOG.md
CHANGED
@@ -2,6 +2,28 @@
|
|
2
2
|
|
3
3
|
## Master (unreleased)
|
4
4
|
|
5
|
+
## 1.7.0 (2016-08-24)
|
6
|
+
|
7
|
+
* Add support for checking all example groups with `ExampleLength`. ([@backus][])
|
8
|
+
* Add support for checking shared example groups for `DescribedClass`. ([@backus][])
|
9
|
+
* Add support for checking `its` from [rspec-its](https://github.com/rspec/rspec-its). ([@backus][])
|
10
|
+
* Add `EmptyExampleGroup` cop for detecting `describe`s and `context`s without any tests inside. ([@backus][])
|
11
|
+
* Add `CustomIncludeMethods` configuration option for `EmptyExampleGroup`. ([@backus][])
|
12
|
+
* Add `NestedGroups` cop for detecting excessive example group nesting. ([@backus][])
|
13
|
+
* Add `MaxNesting` configuration option for `NestedGroups` cop. ([@backus][])
|
14
|
+
* Add `ExpectActual` cop for detecting literal values within `expect(...)`. ([@backus][])
|
15
|
+
* Add `MultipleExpectations` cop for detecting multiple `expect(...)` calls within one example. ([@backus][])
|
16
|
+
* Add `Max` configuration option for `MultipleExpectations`. ([@backus][])
|
17
|
+
* Add `SubjectStub` cop for testing stubbed test subjects. ([@backus][])
|
18
|
+
* Add `LetSetup` cop for detecting cases where `let!` is used for test setup. ([@backus][])
|
19
|
+
* Change all cops to only inspect files with names following rspec convention (`*/spec/*` and/or `_spec.rb`). ([@backus][])
|
20
|
+
* Add `AllCops/RSpec` configuration option for specifying custom spec file patterns. ([@backus][])
|
21
|
+
* Add `AssignmentOnly` configuration option for `RSpec/InstanceVariable` cop. ([@backus][])
|
22
|
+
* Add `BeEql` cop which looks for expectations that can use `be(...)` instead of `eql(...)`. ([@backus][])
|
23
|
+
* Add autocorrect support for `BeEql` cop. ([@backus][])
|
24
|
+
* Add `MessageExpectation` cop for enforcing consistent style of either `expect(...).to receive` or `allow(...).to receive`. ([@backus][])
|
25
|
+
* Add `MessageChain` cop. ([@bquorning][])
|
26
|
+
|
5
27
|
## 1.6.0 (2016-08-03)
|
6
28
|
|
7
29
|
* Add `SkipBlocks` option for `DescribedClass` cop. ([@backus][])
|
data/README.md
CHANGED
@@ -55,6 +55,29 @@ RuboCop::RakeTask.new do |task|
|
|
55
55
|
end
|
56
56
|
```
|
57
57
|
|
58
|
+
### Code Climate
|
59
|
+
|
60
|
+
rubocop-rspec is available on Code Climate as part of the rubocop engine. [Learn More](https://codeclimate.com/changelog/55a433bbe30ba00852000fac).
|
61
|
+
|
62
|
+
## Inspecting files that don't end with `_spec.rb`
|
63
|
+
|
64
|
+
By default, `rubocop-rspec` only inspects code within paths ending in `_spec.rb` or including `spec/`. You can override this setting in your config file by specifying one or more patterns:
|
65
|
+
|
66
|
+
```yaml
|
67
|
+
# Inspect all files
|
68
|
+
AllCops:
|
69
|
+
RSpec:
|
70
|
+
Patterns:
|
71
|
+
- '.+'
|
72
|
+
```
|
73
|
+
|
74
|
+
```yaml
|
75
|
+
# Inspect only files ending with `_test.rb`
|
76
|
+
AllCops:
|
77
|
+
RSpec:
|
78
|
+
Patterns:
|
79
|
+
- '_test.rb$'
|
80
|
+
```
|
58
81
|
|
59
82
|
## The Cops
|
60
83
|
|
data/Rakefile
CHANGED
@@ -1,5 +1,8 @@
|
|
1
|
+
require 'open3'
|
2
|
+
|
1
3
|
require 'bundler'
|
2
4
|
require 'bundler/gem_tasks'
|
5
|
+
|
3
6
|
begin
|
4
7
|
Bundler.setup(:default, :development)
|
5
8
|
rescue Bundler::BundlerError => e
|
@@ -27,4 +30,19 @@ task :internal_investigation do
|
|
27
30
|
abort('RuboCop failed!') unless result.zero?
|
28
31
|
end
|
29
32
|
|
30
|
-
|
33
|
+
desc 'Build config/default.yml'
|
34
|
+
task :build_config do
|
35
|
+
sh('bin/build_config')
|
36
|
+
end
|
37
|
+
|
38
|
+
desc 'Confirm config/default.yml is up to date'
|
39
|
+
task confirm_config: :build_config do
|
40
|
+
_, stdout, _, process =
|
41
|
+
Open3.popen3('git diff --exit-code config/default.yml')
|
42
|
+
|
43
|
+
unless process.value.success?
|
44
|
+
raise "default.yml is out of sync:\n\n#{stdout.read}\nRun bin/build_config"
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
task default: [:build_config, :spec, :internal_investigation, :confirm_config]
|
data/config/default.yml
CHANGED
@@ -1,22 +1,42 @@
|
|
1
|
+
---
|
2
|
+
AllCops:
|
3
|
+
RSpec:
|
4
|
+
Patterns:
|
5
|
+
- _spec.rb
|
6
|
+
- "(?:^|/)spec/"
|
7
|
+
|
1
8
|
RSpec/AnyInstance:
|
2
|
-
Description:
|
9
|
+
Description: Check that instances are not being stubbed globally.
|
10
|
+
Enabled: true
|
11
|
+
|
12
|
+
RSpec/BeEql:
|
13
|
+
Description: Check for expectations where `be(...)` can replace `eql(...)`.
|
3
14
|
Enabled: true
|
4
15
|
|
16
|
+
RSpec/HookArgument:
|
17
|
+
Description: Checks the arguments passed to `before`, `around`, and `after`.
|
18
|
+
Enabled: true
|
19
|
+
EnforcedStyle: implicit
|
20
|
+
SupportedStyles:
|
21
|
+
- implicit
|
22
|
+
- each
|
23
|
+
- example
|
24
|
+
|
5
25
|
RSpec/DescribeClass:
|
6
|
-
Description:
|
26
|
+
Description: Check that the first argument to the top level describe is a constant.
|
7
27
|
Enabled: true
|
8
28
|
|
9
29
|
RSpec/DescribedClass:
|
10
|
-
Description:
|
30
|
+
Description: Checks that tests use `described_class`.
|
11
31
|
SkipBlocks: false
|
12
32
|
Enabled: true
|
13
33
|
|
14
34
|
RSpec/DescribeMethod:
|
15
|
-
Description:
|
35
|
+
Description: Checks that the second argument to `describe` specifies a method.
|
16
36
|
Enabled: true
|
17
37
|
|
18
38
|
RSpec/ExampleWording:
|
19
|
-
Description:
|
39
|
+
Description: Checks that example descriptions do not start with "should".
|
20
40
|
Enabled: true
|
21
41
|
CustomTransform:
|
22
42
|
be: is
|
@@ -24,44 +44,87 @@ RSpec/ExampleWording:
|
|
24
44
|
not: does not
|
25
45
|
IgnoredWords: []
|
26
46
|
|
47
|
+
RSpec/EmptyExampleGroup:
|
48
|
+
Description: Checks if an example group does not include any tests.
|
49
|
+
Enabled: true
|
50
|
+
CustomIncludeMethods: []
|
51
|
+
|
52
|
+
RSpec/ExpectActual:
|
53
|
+
Description: Checks for `expect(...)` calls containing literal values.
|
54
|
+
Enabled: true
|
55
|
+
|
56
|
+
RSpec/MessageChain:
|
57
|
+
Description: Check that chains of messages are not being stubbed.
|
58
|
+
Enabled: true
|
27
59
|
|
28
60
|
RSpec/MultipleDescribes:
|
29
|
-
Description:
|
61
|
+
Description: Checks for multiple top level describes.
|
62
|
+
Enabled: true
|
63
|
+
|
64
|
+
RSpec/MultipleExpectations:
|
65
|
+
Description: Checks if examples contain too many `expect` calls.
|
66
|
+
Enabled: true
|
67
|
+
Max: 1
|
68
|
+
|
69
|
+
RSpec/NestedGroups:
|
70
|
+
Description: Checks for nested example groups.
|
30
71
|
Enabled: true
|
72
|
+
MaxNesting: 2
|
31
73
|
|
32
74
|
RSpec/InstanceVariable:
|
33
|
-
Description:
|
75
|
+
Description: Checks for instance variable usage in specs.
|
76
|
+
AssignmentOnly: false
|
77
|
+
Enabled: true
|
78
|
+
|
79
|
+
RSpec/LetSetup:
|
80
|
+
Description: Checks unreferenced `let!` calls being used for test setup.
|
81
|
+
Enabled: true
|
82
|
+
|
83
|
+
RSpec/LeadingSubject:
|
84
|
+
Description: Checks for `subject` definitions that come after `let` definitions.
|
34
85
|
Enabled: true
|
35
86
|
|
36
87
|
RSpec/FilePath:
|
37
|
-
Description:
|
88
|
+
Description: Checks that spec file paths are consistent with the test subject.
|
38
89
|
Enabled: true
|
39
90
|
CustomTransform:
|
40
91
|
RuboCop: rubocop
|
41
92
|
RSpec: rspec
|
42
93
|
|
43
94
|
RSpec/VerifiedDoubles:
|
44
|
-
Description:
|
95
|
+
Description: Prefer using verifying doubles over normal doubles.
|
45
96
|
Enabled: true
|
46
97
|
IgnoreSymbolicNames: false
|
47
98
|
|
48
99
|
RSpec/NotToNot:
|
49
|
-
Description:
|
100
|
+
Description: Checks for consistent method usage for negating expectations.
|
50
101
|
EnforcedStyle: not_to
|
51
102
|
SupportedStyles:
|
52
|
-
|
53
|
-
|
103
|
+
- not_to
|
104
|
+
- to_not
|
54
105
|
Enabled: true
|
55
106
|
|
56
107
|
RSpec/Focus:
|
57
|
-
Description:
|
108
|
+
Description: Checks if examples are focused.
|
58
109
|
Enabled: true
|
59
110
|
|
60
111
|
RSpec/ExampleLength:
|
61
|
-
Description:
|
112
|
+
Description: Checks for long examples.
|
62
113
|
Enabled: true
|
63
114
|
Max: 5
|
64
115
|
|
116
|
+
RSpec/MessageExpectation:
|
117
|
+
Description: Checks for consistent message expectation style.
|
118
|
+
Enabled: true
|
119
|
+
EnforcedStyle: allow
|
120
|
+
SupportedStyles:
|
121
|
+
- allow
|
122
|
+
- expect
|
123
|
+
|
65
124
|
RSpec/NamedSubject:
|
66
|
-
Description:
|
125
|
+
Description: Checks for explicitly referenced test subjects.
|
126
|
+
Enabled: true
|
127
|
+
|
128
|
+
RSpec/SubjectStub:
|
129
|
+
Description: Checks for stubbed test subjects.
|
67
130
|
Enabled: true
|
data/lib/rubocop-rspec.rb
CHANGED
@@ -1,24 +1,42 @@
|
|
1
|
+
require 'pathname'
|
2
|
+
require 'yaml'
|
3
|
+
|
1
4
|
require 'rubocop'
|
2
5
|
|
6
|
+
require 'rubocop/rspec'
|
3
7
|
require 'rubocop/rspec/version'
|
4
8
|
require 'rubocop/rspec/inject'
|
5
9
|
require 'rubocop/rspec/top_level_describe'
|
6
10
|
require 'rubocop/rspec/wording'
|
7
11
|
require 'rubocop/rspec/util'
|
12
|
+
require 'rubocop/rspec/language'
|
13
|
+
require 'rubocop/rspec/language/node_pattern'
|
14
|
+
require 'rubocop/rspec/spec_only'
|
8
15
|
|
9
16
|
RuboCop::RSpec::Inject.defaults!
|
10
17
|
|
11
18
|
# cops
|
12
19
|
require 'rubocop/cop/rspec/any_instance'
|
20
|
+
require 'rubocop/cop/rspec/be_eql'
|
13
21
|
require 'rubocop/cop/rspec/describe_class'
|
14
22
|
require 'rubocop/cop/rspec/describe_method'
|
15
23
|
require 'rubocop/cop/rspec/described_class'
|
24
|
+
require 'rubocop/cop/rspec/empty_example_group'
|
25
|
+
require 'rubocop/cop/rspec/example_length'
|
16
26
|
require 'rubocop/cop/rspec/example_wording'
|
27
|
+
require 'rubocop/cop/rspec/expect_actual'
|
17
28
|
require 'rubocop/cop/rspec/file_path'
|
18
29
|
require 'rubocop/cop/rspec/focus'
|
30
|
+
require 'rubocop/cop/rspec/hook_argument'
|
19
31
|
require 'rubocop/cop/rspec/instance_variable'
|
20
|
-
require 'rubocop/cop/rspec/
|
32
|
+
require 'rubocop/cop/rspec/leading_subject'
|
33
|
+
require 'rubocop/cop/rspec/let_setup'
|
34
|
+
require 'rubocop/cop/rspec/message_chain'
|
35
|
+
require 'rubocop/cop/rspec/message_expectation'
|
21
36
|
require 'rubocop/cop/rspec/multiple_describes'
|
37
|
+
require 'rubocop/cop/rspec/multiple_expectations'
|
22
38
|
require 'rubocop/cop/rspec/named_subject'
|
39
|
+
require 'rubocop/cop/rspec/nested_groups'
|
23
40
|
require 'rubocop/cop/rspec/not_to_not'
|
41
|
+
require 'rubocop/cop/rspec/subject_stub'
|
24
42
|
require 'rubocop/cop/rspec/verified_doubles'
|
@@ -1,7 +1,9 @@
|
|
1
1
|
module RuboCop
|
2
2
|
module Cop
|
3
3
|
module RSpec
|
4
|
-
#
|
4
|
+
# Check that instances are not being stubbed globally.
|
5
|
+
#
|
6
|
+
# Prefer instance doubles over stubbing any instance of a class
|
5
7
|
#
|
6
8
|
# @example
|
7
9
|
# # bad
|
@@ -19,6 +21,8 @@ module RuboCop
|
|
19
21
|
# end
|
20
22
|
# end
|
21
23
|
class AnyInstance < Cop
|
24
|
+
include RuboCop::RSpec::SpecOnly
|
25
|
+
|
22
26
|
MESSAGE = 'Avoid stubbing using `%{method}`'.freeze
|
23
27
|
|
24
28
|
ANY_INSTANCE_METHODS = [
|
@@ -0,0 +1,58 @@
|
|
1
|
+
module RuboCop
|
2
|
+
module Cop
|
3
|
+
module RSpec
|
4
|
+
# Check for expectations where `be(...)` can replace `eql(...)`.
|
5
|
+
#
|
6
|
+
# The `be` matcher compares by identity while the `eql` matcher
|
7
|
+
# compares using `eql?`. Integers, floats, booleans, and symbols
|
8
|
+
# can be compared by identity and therefore the `be` matcher is
|
9
|
+
# preferable as it is a more strict test.
|
10
|
+
#
|
11
|
+
# @example
|
12
|
+
#
|
13
|
+
# # bad
|
14
|
+
# expect(foo).to eql(1)
|
15
|
+
# expect(foo).to eql(1.0)
|
16
|
+
# expect(foo).to eql(true)
|
17
|
+
# expect(foo).to eql(false)
|
18
|
+
# expect(foo).to eql(:bar)
|
19
|
+
#
|
20
|
+
# # good
|
21
|
+
# expect(foo).to be(1)
|
22
|
+
# expect(foo).to be(1.0)
|
23
|
+
# expect(foo).to be(true)
|
24
|
+
# expect(foo).to be(false)
|
25
|
+
# expect(foo).to be(:bar)
|
26
|
+
#
|
27
|
+
# This cop only looks for instances of `expect(...).to eql(...)`. We
|
28
|
+
# do not check `to_not` or `not_to` since `!eql?` is more strict
|
29
|
+
# than `!equal?`. We also do not try to flag `eq` because if
|
30
|
+
# `a == b`, and `b` is comparable by identity, `a` is still not
|
31
|
+
# necessarily the same type as `b` since the `#==` operator can
|
32
|
+
# coerce objects for comparison.
|
33
|
+
#
|
34
|
+
class BeEql < Cop
|
35
|
+
include RuboCop::RSpec::SpecOnly,
|
36
|
+
RuboCop::Cop::ConfigurableEnforcedStyle
|
37
|
+
|
38
|
+
MSG = 'Prefer `be` over `eql`'.freeze
|
39
|
+
|
40
|
+
def_node_matcher :eql_type_with_identity, <<-PATTERN
|
41
|
+
(send _ :to $(send nil :eql {true false int float sym}))
|
42
|
+
PATTERN
|
43
|
+
|
44
|
+
def on_send(node)
|
45
|
+
eql_type_with_identity(node) do |eql|
|
46
|
+
add_offense(eql, :selector, MSG)
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
def autocorrect(node)
|
51
|
+
lambda do |corrector|
|
52
|
+
corrector.replace(node.loc.selector, 'be')
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
@@ -3,8 +3,7 @@
|
|
3
3
|
module RuboCop
|
4
4
|
module Cop
|
5
5
|
module RSpec
|
6
|
-
# Check that the first argument to the top level describe is
|
7
|
-
# class or module.
|
6
|
+
# Check that the first argument to the top level describe is a constant.
|
8
7
|
#
|
9
8
|
# @example
|
10
9
|
# # bad
|
@@ -18,7 +17,7 @@ module RuboCop
|
|
18
17
|
# describe "A feature example", type: :feature do
|
19
18
|
# end
|
20
19
|
class DescribeClass < Cop
|
21
|
-
include RuboCop::RSpec::TopLevelDescribe
|
20
|
+
include RuboCop::RSpec::SpecOnly, RuboCop::RSpec::TopLevelDescribe
|
22
21
|
|
23
22
|
MSG = 'The first argument to describe should be '\
|
24
23
|
'the class or module being tested.'.freeze
|
@@ -3,8 +3,7 @@
|
|
3
3
|
module RuboCop
|
4
4
|
module Cop
|
5
5
|
module RSpec
|
6
|
-
# Checks that the second argument to
|
7
|
-
# method name.
|
6
|
+
# Checks that the second argument to `describe` specifies a method.
|
8
7
|
#
|
9
8
|
# @example
|
10
9
|
# # bad
|
@@ -18,7 +17,9 @@ module RuboCop
|
|
18
17
|
# describe MyClass, '.my_class_method' do
|
19
18
|
# end
|
20
19
|
class DescribeMethod < Cop
|
21
|
-
include RuboCop::RSpec::
|
20
|
+
include RuboCop::RSpec::SpecOnly,
|
21
|
+
RuboCop::RSpec::TopLevelDescribe,
|
22
|
+
RuboCop::RSpec::Util
|
22
23
|
|
23
24
|
MESSAGE = 'The second argument to describe should be the method ' \
|
24
25
|
"being tested. '#instance' or '.class'".freeze
|
@@ -3,6 +3,8 @@
|
|
3
3
|
module RuboCop
|
4
4
|
module Cop
|
5
5
|
module RSpec
|
6
|
+
# Checks that tests use `described_class`.
|
7
|
+
#
|
6
8
|
# If the first argument of describe is a class, the class is exposed to
|
7
9
|
# each example via described_class - this should be used instead of
|
8
10
|
# repeating the class.
|
@@ -18,45 +20,12 @@ module RuboCop
|
|
18
20
|
# subject { described_class.do_something }
|
19
21
|
# end
|
20
22
|
class DescribedClass < Cop
|
21
|
-
include RuboCop::RSpec::TopLevelDescribe
|
23
|
+
include RuboCop::RSpec::SpecOnly, RuboCop::RSpec::TopLevelDescribe
|
22
24
|
|
23
25
|
DESCRIBED_CLASS = 'described_class'.freeze
|
24
26
|
MSG = "Use `#{DESCRIBED_CLASS}` instead of `%s`".freeze
|
25
27
|
|
26
|
-
RSPEC_BLOCK_METHODS =
|
27
|
-
:after
|
28
|
-
:around
|
29
|
-
:before
|
30
|
-
:context
|
31
|
-
:describe
|
32
|
-
:example
|
33
|
-
:example_group
|
34
|
-
:fcontext
|
35
|
-
:fdescribe
|
36
|
-
:feature
|
37
|
-
:fexample
|
38
|
-
:ffeature
|
39
|
-
:fit
|
40
|
-
:focus
|
41
|
-
:fscenario
|
42
|
-
:fspecify
|
43
|
-
:it
|
44
|
-
:let
|
45
|
-
:let!
|
46
|
-
:scenario
|
47
|
-
:specify
|
48
|
-
:xcontext
|
49
|
-
:xdescribe
|
50
|
-
:xexample
|
51
|
-
:xfeature
|
52
|
-
:xit
|
53
|
-
:xscenario
|
54
|
-
:xspecify
|
55
|
-
'.freeze
|
56
|
-
|
57
|
-
def_node_matcher :described_constant, <<-PATTERN
|
58
|
-
(block $(send _ :describe $(const ...)) (args) $_)
|
59
|
-
PATTERN
|
28
|
+
RSPEC_BLOCK_METHODS = RuboCop::RSpec::Language::ALL.to_node_pattern
|
60
29
|
|
61
30
|
def_node_matcher :common_instance_exec_closure?, <<-PATTERN
|
62
31
|
(block (send (const nil {:Class :Module}) :new ...) ...)
|