mutant 0.5.26 → 0.6.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.rspec +1 -0
- data/.travis.yml +1 -0
- data/Changelog.md +16 -3
- data/Gemfile +0 -2
- data/Gemfile.devtools +2 -2
- data/README.md +9 -15
- data/bin/mutant +0 -1
- data/config/flay.yml +1 -1
- data/config/flog.yml +1 -1
- data/config/mutant.yml +1 -1
- data/config/reek.yml +14 -11
- data/config/rubocop.yml +1 -1
- data/lib/mutant.rb +22 -21
- data/lib/mutant/ast.rb +47 -0
- data/lib/mutant/cli.rb +7 -4
- data/lib/mutant/config.rb +1 -0
- data/lib/mutant/context.rb +1 -1
- data/lib/mutant/diff.rb +38 -7
- data/lib/mutant/env.rb +22 -3
- data/lib/mutant/expression.rb +15 -4
- data/lib/mutant/integration.rb +1 -1
- data/lib/mutant/isolation.rb +2 -4
- data/lib/mutant/matcher.rb +1 -1
- data/lib/mutant/matcher/method.rb +1 -1
- data/lib/mutant/matcher/method/singleton.rb +1 -1
- data/lib/mutant/matcher/methods.rb +0 -2
- data/lib/mutant/meta/example.rb +0 -2
- data/lib/mutant/meta/example/dsl.rb +1 -1
- data/lib/mutant/mutator.rb +1 -1
- data/lib/mutant/mutator/node.rb +3 -3
- data/lib/mutant/mutator/node/begin.rb +1 -1
- data/lib/mutant/mutator/node/block.rb +16 -3
- data/lib/mutant/mutator/node/if.rb +1 -1
- data/lib/mutant/mutator/node/literal/fixnum.rb +1 -1
- data/lib/mutant/mutator/node/resbody.rb +0 -2
- data/lib/mutant/mutator/node/send.rb +17 -7
- data/lib/mutant/mutator/node/send/index.rb +0 -2
- data/lib/mutant/mutator/registry.rb +1 -1
- data/lib/mutant/mutator/util.rb +1 -1
- data/lib/mutant/mutator/util/array.rb +1 -1
- data/lib/mutant/reporter.rb +13 -3
- data/lib/mutant/reporter/cli.rb +54 -8
- data/lib/mutant/reporter/cli/format.rb +197 -0
- data/lib/mutant/reporter/cli/printer.rb +402 -22
- data/lib/mutant/reporter/cli/tput.rb +27 -0
- data/lib/mutant/reporter/null.rb +4 -34
- data/lib/mutant/reporter/trace.rb +6 -38
- data/lib/mutant/result.rb +44 -56
- data/lib/mutant/runner.rb +99 -52
- data/lib/mutant/runner/collector.rb +134 -0
- data/lib/mutant/subject/method/instance.rb +12 -4
- data/lib/mutant/version.rb +1 -1
- data/lib/mutant/warning_filter.rb +0 -2
- data/lib/mutant/zombifier/file.rb +1 -1
- data/meta/block.rb +17 -1
- data/meta/send.rb +123 -1
- data/mutant-rspec.gemspec +3 -3
- data/mutant.gemspec +1 -1
- data/spec/integration/mutant/corpus_spec.rb +4 -195
- data/spec/integration/mutant/null_spec.rb +1 -3
- data/spec/integration/mutant/rspec_spec.rb +1 -3
- data/spec/integration/mutant/test_mutator_handles_types_spec.rb +1 -3
- data/spec/integration/mutant/zombie_spec.rb +1 -3
- data/spec/integrations.yml +7 -0
- data/spec/shared/method_matcher_behavior.rb +1 -1
- data/spec/spec_helper.rb +1 -0
- data/spec/support/compress_helper.rb +1 -0
- data/spec/support/corpus.rb +239 -0
- data/spec/support/mutation_verifier.rb +2 -4
- data/spec/unit/mutant/cli_spec.rb +20 -13
- data/spec/unit/mutant/context/root_spec.rb +1 -3
- data/spec/unit/mutant/context/scope/root_spec.rb +1 -3
- data/spec/unit/mutant/context/scope/unqualified_name_spec.rb +1 -3
- data/spec/unit/mutant/diff_spec.rb +37 -19
- data/spec/unit/mutant/expression/method_spec.rb +5 -7
- data/spec/unit/mutant/expression/methods_spec.rb +5 -7
- data/spec/unit/mutant/expression/namespace/flat_spec.rb +6 -8
- data/spec/unit/mutant/expression/namespace/recursive_spec.rb +6 -7
- data/spec/unit/mutant/expression_spec.rb +14 -5
- data/spec/unit/mutant/integration_spec.rb +14 -3
- data/spec/unit/mutant/isolation_spec.rb +2 -4
- data/spec/unit/mutant/loader/eval_spec.rb +1 -3
- data/spec/unit/mutant/matcher/chain_spec.rb +1 -3
- data/spec/unit/mutant/matcher/compiler/subject_prefix_spec.rb +21 -0
- data/spec/unit/mutant/matcher/compiler_spec.rb +28 -3
- data/spec/unit/mutant/matcher/filter_spec.rb +1 -3
- data/spec/unit/mutant/matcher/method/instance_spec.rb +3 -5
- data/spec/unit/mutant/matcher/method/singleton_spec.rb +22 -4
- data/spec/unit/mutant/matcher/methods/instance_spec.rb +7 -6
- data/spec/unit/mutant/matcher/methods/singleton_spec.rb +4 -6
- data/spec/unit/mutant/matcher/namespace_spec.rb +1 -3
- data/spec/unit/mutant/matcher/null_spec.rb +1 -3
- data/spec/unit/mutant/mutation_spec.rb +1 -3
- data/spec/unit/mutant/mutator/node_spec.rb +1 -3
- data/spec/unit/mutant/reporter/cli_spec.rb +444 -206
- data/spec/unit/mutant/reporter/null_spec.rb +1 -3
- data/spec/unit/mutant/require_highjack_spec.rb +1 -3
- data/spec/unit/mutant/runner_spec.rb +42 -28
- data/spec/unit/mutant/subject/context_spec.rb +1 -3
- data/spec/unit/mutant/subject/method/instance_spec.rb +27 -19
- data/spec/unit/mutant/subject/method/singleton_spec.rb +49 -17
- data/spec/unit/mutant/subject_spec.rb +1 -3
- data/spec/unit/mutant/test_spec.rb +1 -3
- data/spec/unit/mutant/warning_expectation.rb +1 -3
- data/spec/unit/mutant/warning_filter_spec.rb +1 -3
- data/spec/unit/mutant_spec.rb +13 -3
- data/test_app/Gemfile.devtools +2 -2
- data/test_app/spec/unit/test_app/literal/string_spec.rb +1 -1
- metadata +10 -21
- data/lib/mutant/matcher/method/finder.rb +0 -72
- data/lib/mutant/reporter/cli/progress.rb +0 -10
- data/lib/mutant/reporter/cli/progress/config.rb +0 -30
- data/lib/mutant/reporter/cli/progress/env.rb +0 -30
- data/lib/mutant/reporter/cli/progress/noop.rb +0 -27
- data/lib/mutant/reporter/cli/progress/result.rb +0 -12
- data/lib/mutant/reporter/cli/progress/result/mutation.rb +0 -45
- data/lib/mutant/reporter/cli/progress/result/subject.rb +0 -54
- data/lib/mutant/reporter/cli/progress/subject.rb +0 -27
- data/lib/mutant/reporter/cli/registry.rb +0 -81
- data/lib/mutant/reporter/cli/report.rb +0 -10
- data/lib/mutant/reporter/cli/report/env.rb +0 -92
- data/lib/mutant/reporter/cli/report/mutation.rb +0 -103
- data/lib/mutant/reporter/cli/report/subject.rb +0 -32
- data/lib/mutant/reporter/cli/report/test.rb +0 -28
- data/lib/mutant/walker.rb +0 -53
- data/spec/shared/mutator_behavior.rb +0 -55
@@ -1,31 +1,29 @@
|
|
1
|
-
|
1
|
+
class Double
|
2
|
+
include Concord.new(:name, :attributes)
|
3
|
+
|
4
|
+
def self.new(name, attributes = {})
|
5
|
+
super
|
6
|
+
end
|
7
|
+
|
8
|
+
def update(_attributes)
|
9
|
+
self
|
10
|
+
end
|
11
|
+
|
12
|
+
def method_missing(name, *arguments)
|
13
|
+
super unless attributes.key?(name)
|
14
|
+
fail "Arguments provided for #{name}" if arguments.any?
|
15
|
+
attributes.fetch(name)
|
16
|
+
end
|
17
|
+
end
|
2
18
|
|
3
19
|
# FIXME: This is not even close to a mutation covering spec.
|
4
|
-
describe Mutant::Runner do
|
20
|
+
RSpec.describe Mutant::Runner do
|
5
21
|
let(:object) { described_class.new(env) }
|
6
22
|
|
7
23
|
let(:reporter) { Mutant::Reporter::Trace.new }
|
8
24
|
let(:config) { Mutant::Config::DEFAULT.update(reporter: reporter, isolation: Mutant::Isolation::None) }
|
9
25
|
let(:subjects) { [subject_a, subject_b] }
|
10
26
|
|
11
|
-
class Double
|
12
|
-
include Concord.new(:name, :attributes)
|
13
|
-
|
14
|
-
def self.new(name, attributes = {})
|
15
|
-
super
|
16
|
-
end
|
17
|
-
|
18
|
-
def update(_attributes)
|
19
|
-
self
|
20
|
-
end
|
21
|
-
|
22
|
-
def method_missing(name, *arguments)
|
23
|
-
super unless attributes.key?(name)
|
24
|
-
fail "Arguments provided for #{name}" if arguments.any?
|
25
|
-
attributes.fetch(name)
|
26
|
-
end
|
27
|
-
end
|
28
|
-
|
29
27
|
let(:subject_a) { Double.new('Subject A', mutations: mutations_a, tests: subject_a_tests) }
|
30
28
|
let(:subject_b) { Double.new('Subject B', mutations: mutations_b) }
|
31
29
|
|
@@ -70,13 +68,15 @@ describe Mutant::Runner do
|
|
70
68
|
subject: subject_a,
|
71
69
|
mutation_results: [
|
72
70
|
Mutant::Result::Mutation.new(
|
73
|
-
|
74
|
-
|
71
|
+
index: 0,
|
72
|
+
mutation: mutation_a1,
|
73
|
+
runtime: 0.0,
|
75
74
|
test_results: [test_report_a1]
|
76
75
|
),
|
77
76
|
Mutant::Result::Mutation.new(
|
78
|
-
|
79
|
-
|
77
|
+
index: 1,
|
78
|
+
mutation: mutation_a2,
|
79
|
+
runtime: 0.0,
|
80
80
|
test_results: [test_report_a1]
|
81
81
|
)
|
82
82
|
],
|
@@ -91,19 +91,33 @@ describe Mutant::Runner do
|
|
91
91
|
end
|
92
92
|
|
93
93
|
describe '#result' do
|
94
|
-
|
94
|
+
let(:expected_result) do
|
95
|
+
Mutant::Result::Env.new(
|
96
|
+
env: env,
|
97
|
+
runtime: 0.0,
|
98
|
+
done: false,
|
99
|
+
subject_results: expected_subject_results
|
100
|
+
)
|
101
|
+
end
|
102
|
+
|
103
|
+
pending 'on normal execution' do
|
95
104
|
subject { object.result }
|
96
105
|
|
97
|
-
its(:env)
|
98
|
-
|
106
|
+
its(:env) { should be(env) }
|
107
|
+
|
108
|
+
it 'reports result' do
|
109
|
+
expect { subject }.to change { config.reporter.report_calls }.from([]).to([expected_result])
|
110
|
+
end
|
99
111
|
end
|
100
112
|
|
101
|
-
|
113
|
+
skip 'when isolation raises error' do
|
102
114
|
subject { object.result }
|
103
115
|
|
104
116
|
its(:env) { should be(env) }
|
105
117
|
its(:subject_results) { should eql(expected_subject_results) }
|
106
118
|
|
119
|
+
it { should eql(expected_result) }
|
120
|
+
|
107
121
|
before do
|
108
122
|
expect(Mutant::Isolation::None).to receive(:call)
|
109
123
|
.twice
|
@@ -1,33 +1,41 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
require 'spec_helper'
|
4
|
-
|
5
|
-
describe Mutant::Subject::Method::Instance do
|
1
|
+
RSpec.describe Mutant::Subject::Method::Instance do
|
6
2
|
let(:object) { described_class.new(config, context, node) }
|
7
|
-
let(:context) { double }
|
3
|
+
let(:context) { Mutant::Context::Scope.new(scope, double('Source Path')) }
|
8
4
|
let(:config) { Mutant::Config::DEFAULT }
|
9
5
|
|
10
6
|
let(:node) do
|
11
7
|
s(:def, :foo, s(:args))
|
12
8
|
end
|
13
9
|
|
14
|
-
|
10
|
+
let(:scope) do
|
11
|
+
Class.new do
|
12
|
+
attr_reader :bar
|
15
13
|
|
16
|
-
|
17
|
-
|
14
|
+
def initialize
|
15
|
+
@bar = :boo
|
16
|
+
end
|
17
|
+
|
18
|
+
def foo
|
19
|
+
end
|
20
|
+
|
21
|
+
def self.name
|
22
|
+
'Test'
|
23
|
+
end
|
18
24
|
end
|
25
|
+
end
|
19
26
|
|
20
|
-
|
21
|
-
|
22
|
-
attr_reader :bar
|
27
|
+
describe '#expression' do
|
28
|
+
subject { object.expression }
|
23
29
|
|
24
|
-
|
25
|
-
@bar = :boo
|
26
|
-
end
|
30
|
+
it { should eql(Mutant::Expression.parse('Test#foo')) }
|
27
31
|
|
28
|
-
|
29
|
-
|
30
|
-
|
32
|
+
it_should_behave_like 'an idempotent method'
|
33
|
+
end
|
34
|
+
|
35
|
+
describe '#prepare' do
|
36
|
+
|
37
|
+
let(:context) do
|
38
|
+
Mutant::Context::Scope.new(scope, double('Source Path'))
|
31
39
|
end
|
32
40
|
|
33
41
|
subject { object.prepare }
|
@@ -71,7 +79,7 @@ describe Mutant::Subject::Method::Instance do
|
|
71
79
|
end
|
72
80
|
end
|
73
81
|
|
74
|
-
describe Mutant::Subject::Method::Instance::Memoized do
|
82
|
+
RSpec.describe Mutant::Subject::Method::Instance::Memoized do
|
75
83
|
let(:object) { described_class.new(config, context, node) }
|
76
84
|
let(:context) { double }
|
77
85
|
let(:config) { Mutant::Config::DEFAULT }
|
@@ -1,29 +1,33 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
require 'spec_helper'
|
4
|
-
|
5
|
-
describe Mutant::Subject::Method::Singleton do
|
1
|
+
RSpec.describe Mutant::Subject::Method::Singleton do
|
6
2
|
|
7
3
|
let(:object) { described_class.new(config, context, node) }
|
8
4
|
let(:config) { Mutant::Config::DEFAULT }
|
9
|
-
let(:
|
5
|
+
let(:node) { s(:defs, s(:self), :foo, s(:args)) }
|
10
6
|
|
11
|
-
let(:
|
12
|
-
|
7
|
+
let(:context) do
|
8
|
+
Mutant::Context::Scope.new(scope, double('Source Path'))
|
13
9
|
end
|
14
10
|
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
end
|
11
|
+
let(:scope) do
|
12
|
+
Class.new do
|
13
|
+
def self.foo
|
14
|
+
end
|
20
15
|
|
21
|
-
|
22
|
-
|
23
|
-
def self.foo
|
24
|
-
end
|
16
|
+
def self.name
|
17
|
+
'Test'
|
25
18
|
end
|
26
19
|
end
|
20
|
+
end
|
21
|
+
|
22
|
+
describe '#expression' do
|
23
|
+
subject { object.expression }
|
24
|
+
|
25
|
+
it { should eql(Mutant::Expression.parse('Test.foo')) }
|
26
|
+
|
27
|
+
it_should_behave_like 'an idempotent method'
|
28
|
+
end
|
29
|
+
|
30
|
+
describe '#prepare' do
|
27
31
|
|
28
32
|
subject { object.prepare }
|
29
33
|
|
@@ -39,4 +43,32 @@ describe Mutant::Subject::Method::Singleton do
|
|
39
43
|
|
40
44
|
it { should eql("def self.foo\nend") }
|
41
45
|
end
|
46
|
+
|
47
|
+
describe '#public?' do
|
48
|
+
subject { object.public? }
|
49
|
+
|
50
|
+
context 'when method is public' do
|
51
|
+
it { should be(true) }
|
52
|
+
end
|
53
|
+
|
54
|
+
context 'when method is private' do
|
55
|
+
before do
|
56
|
+
scope.class_eval do
|
57
|
+
private_class_method :foo
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
it { should be(false) }
|
62
|
+
end
|
63
|
+
|
64
|
+
context 'when method is protected' do
|
65
|
+
before do
|
66
|
+
class << scope
|
67
|
+
protected :foo
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
it { should be(false) }
|
72
|
+
end
|
73
|
+
end
|
42
74
|
end
|
data/spec/unit/mutant_spec.rb
CHANGED
@@ -1,8 +1,18 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
describe Mutant do
|
1
|
+
RSpec.describe Mutant do
|
4
2
|
let(:object) { described_class }
|
5
3
|
|
4
|
+
describe '.ci?' do
|
5
|
+
subject { object.ci? }
|
6
|
+
|
7
|
+
let(:result) { double('Result') }
|
8
|
+
|
9
|
+
before do
|
10
|
+
expect(ENV).to receive(:key?).with('CI').and_return(result)
|
11
|
+
end
|
12
|
+
|
13
|
+
it { should be(result) }
|
14
|
+
end
|
15
|
+
|
6
16
|
describe '.zombify' do
|
7
17
|
subject { object.zombify }
|
8
18
|
|
data/test_app/Gemfile.devtools
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: mutant
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.6.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Markus Schirp
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-
|
11
|
+
date: 2014-08-11 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: parser
|
@@ -212,14 +212,14 @@ dependencies:
|
|
212
212
|
requirements:
|
213
213
|
- - "~>"
|
214
214
|
- !ruby/object:Gem::Version
|
215
|
-
version: 1.
|
215
|
+
version: 1.2.0
|
216
216
|
type: :runtime
|
217
217
|
prerelease: false
|
218
218
|
version_requirements: !ruby/object:Gem::Requirement
|
219
219
|
requirements:
|
220
220
|
- - "~>"
|
221
221
|
- !ruby/object:Gem::Version
|
222
|
-
version: 1.
|
222
|
+
version: 1.2.0
|
223
223
|
- !ruby/object:Gem::Dependency
|
224
224
|
name: bundler
|
225
225
|
requirement: !ruby/object:Gem::Requirement
|
@@ -303,7 +303,6 @@ files:
|
|
303
303
|
- lib/mutant/matcher/config.rb
|
304
304
|
- lib/mutant/matcher/filter.rb
|
305
305
|
- lib/mutant/matcher/method.rb
|
306
|
-
- lib/mutant/matcher/method/finder.rb
|
307
306
|
- lib/mutant/matcher/method/instance.rb
|
308
307
|
- lib/mutant/matcher/method/singleton.rb
|
309
308
|
- lib/mutant/matcher/methods.rb
|
@@ -375,33 +374,21 @@ files:
|
|
375
374
|
- lib/mutant/mutator/util/symbol.rb
|
376
375
|
- lib/mutant/reporter.rb
|
377
376
|
- lib/mutant/reporter/cli.rb
|
377
|
+
- lib/mutant/reporter/cli/format.rb
|
378
378
|
- lib/mutant/reporter/cli/printer.rb
|
379
|
-
- lib/mutant/reporter/cli/
|
380
|
-
- lib/mutant/reporter/cli/progress/config.rb
|
381
|
-
- lib/mutant/reporter/cli/progress/env.rb
|
382
|
-
- lib/mutant/reporter/cli/progress/noop.rb
|
383
|
-
- lib/mutant/reporter/cli/progress/result.rb
|
384
|
-
- lib/mutant/reporter/cli/progress/result/mutation.rb
|
385
|
-
- lib/mutant/reporter/cli/progress/result/subject.rb
|
386
|
-
- lib/mutant/reporter/cli/progress/subject.rb
|
387
|
-
- lib/mutant/reporter/cli/registry.rb
|
388
|
-
- lib/mutant/reporter/cli/report.rb
|
389
|
-
- lib/mutant/reporter/cli/report/env.rb
|
390
|
-
- lib/mutant/reporter/cli/report/mutation.rb
|
391
|
-
- lib/mutant/reporter/cli/report/subject.rb
|
392
|
-
- lib/mutant/reporter/cli/report/test.rb
|
379
|
+
- lib/mutant/reporter/cli/tput.rb
|
393
380
|
- lib/mutant/reporter/null.rb
|
394
381
|
- lib/mutant/reporter/trace.rb
|
395
382
|
- lib/mutant/require_highjack.rb
|
396
383
|
- lib/mutant/result.rb
|
397
384
|
- lib/mutant/runner.rb
|
385
|
+
- lib/mutant/runner/collector.rb
|
398
386
|
- lib/mutant/subject.rb
|
399
387
|
- lib/mutant/subject/method.rb
|
400
388
|
- lib/mutant/subject/method/instance.rb
|
401
389
|
- lib/mutant/subject/method/singleton.rb
|
402
390
|
- lib/mutant/test.rb
|
403
391
|
- lib/mutant/version.rb
|
404
|
-
- lib/mutant/walker.rb
|
405
392
|
- lib/mutant/warning_expectation.rb
|
406
393
|
- lib/mutant/warning_filter.rb
|
407
394
|
- lib/mutant/zombifier.rb
|
@@ -471,9 +458,9 @@ files:
|
|
471
458
|
- spec/integrations.yml
|
472
459
|
- spec/rcov.opts
|
473
460
|
- spec/shared/method_matcher_behavior.rb
|
474
|
-
- spec/shared/mutator_behavior.rb
|
475
461
|
- spec/spec_helper.rb
|
476
462
|
- spec/support/compress_helper.rb
|
463
|
+
- spec/support/corpus.rb
|
477
464
|
- spec/support/ice_nine_config.rb
|
478
465
|
- spec/support/mutation_verifier.rb
|
479
466
|
- spec/support/rspec.rb
|
@@ -492,6 +479,7 @@ files:
|
|
492
479
|
- spec/unit/mutant/isolation_spec.rb
|
493
480
|
- spec/unit/mutant/loader/eval_spec.rb
|
494
481
|
- spec/unit/mutant/matcher/chain_spec.rb
|
482
|
+
- spec/unit/mutant/matcher/compiler/subject_prefix_spec.rb
|
495
483
|
- spec/unit/mutant/matcher/compiler_spec.rb
|
496
484
|
- spec/unit/mutant/matcher/filter_spec.rb
|
497
485
|
- spec/unit/mutant/matcher/method/instance_spec.rb
|
@@ -567,6 +555,7 @@ test_files:
|
|
567
555
|
- spec/unit/mutant/isolation_spec.rb
|
568
556
|
- spec/unit/mutant/loader/eval_spec.rb
|
569
557
|
- spec/unit/mutant/matcher/chain_spec.rb
|
558
|
+
- spec/unit/mutant/matcher/compiler/subject_prefix_spec.rb
|
570
559
|
- spec/unit/mutant/matcher/compiler_spec.rb
|
571
560
|
- spec/unit/mutant/matcher/filter_spec.rb
|
572
561
|
- spec/unit/mutant/matcher/method/instance_spec.rb
|