code_driven_development 0.0.4 → 0.0.5

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 546316dbe66b0a333a9dd89b55222bacd74e502b
4
- data.tar.gz: 07c3576f12dc0b9667ed79145994e55c5dc344d3
3
+ metadata.gz: 9038114a834973a515c4328adb8cf027fcab116a
4
+ data.tar.gz: a5092ebdb605227e0f1262833289d0e08b01fc99
5
5
  SHA512:
6
- metadata.gz: 01bc5e3a0b27dcc595473b5bb8312f538c785c1e33efa341e12b7c85f25514ff83e11eded00b194031f6006298f3df764e8b2b316c59542db03e6b9f154af936
7
- data.tar.gz: a023a61a8c1ecd86ae3c5e5e353902b53ce51da33e98af64ca36c759d993d9e2c1baddd6b366e3c8e6123aa1875fe7aeb48c3db98db47ccf6c1cb6ec4fe5029f
6
+ metadata.gz: 32b147b182e1f910937102822813e4ed2d6812e34fd89408fda80422da7744e16a32384000f71cec2742eae1907ec166290d4a9bc2ca3328835a2bc73ce24669
7
+ data.tar.gz: 7e0d462f9ac49184b3491c8940fe61bd800d0ba0e57a2af3721b9dc75fbbf19ef5a1d6df85bd759e0b424498d36e5bc64bc95438d9709be5bdff589e9d0610de
data/README.md CHANGED
@@ -9,6 +9,7 @@ class Bunker < ActiveRecord::Base
9
9
  validate :location, :protected => true
10
10
 
11
11
  def alert_staff
12
+ staph.all_alert
12
13
  Staff.alert_all
13
14
  end
14
15
 
@@ -27,9 +28,19 @@ describe Bunker do
27
28
  it { should validate_protected_of :location }
28
29
  describe "#alert_staff" do
29
30
  let(:obj) { described_class.new }
31
+ let(:all_alert) { double(:all_alert) }
32
+ let(:staph) { double(:staph) }
33
+ let(:alert_all) { double(:alert_all) }
30
34
  subject { obj.alert_staff }
31
35
  before do
32
- allow(Staff).to receive :alert_all
36
+ allow(staph).to receive(:all_alert).and_return(all_alert)
37
+ allow(obj).to receive(:staph).and_return(staph)
38
+ allow(Staff).to receive(:alert_all).and_return(alert_all)
39
+ end
40
+ it "calls staph.all_alert" do
41
+ subject
42
+ expect(staph).to have_received :all_alert
43
+ expect(obj).to have_received :staph
33
44
  end
34
45
  it "calls Staff.alert_all" do
35
46
  subject
@@ -38,9 +49,10 @@ describe Bunker do
38
49
  end
39
50
  describe "#alert_president" do
40
51
  let(:obj) { described_class.new }
52
+ let(:stand_down) { double(:stand_down) }
41
53
  subject { obj.alert_president }
42
54
  before do
43
- allow(SecretService).to receive :stand_down
55
+ allow(SecretService).to receive(:stand_down).and_return(stand_down)
44
56
  end
45
57
  it "calls SecretService.stand_down" do
46
58
  subject
data/Rakefile CHANGED
@@ -1,8 +1,10 @@
1
1
  $:.unshift(File.dirname(__FILE__) + '/../../lib')
2
2
 
3
- require "bundler/gem_tasks"
3
+ require 'bundler/gem_tasks'
4
4
  require 'cucumber/rake/task'
5
+ require 'rspec/core/rake_task'
5
6
 
7
+ RSpec::Core::RakeTask.new(:spec)
6
8
  Cucumber::Rake::Task.new
7
9
 
8
- task default: :cucumber
10
+ task default: [:spec, :cucumber]
data/bin/cdd CHANGED
@@ -1,4 +1,13 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
- require 'code_driven_development'
4
- puts CodeDrivenDevelopment::CodeDrivenDevelopment.new(ARGF.read).test_code.strip
3
+ require_relative '../lib/code_driven_development'
4
+
5
+
6
+ output = CodeDrivenDevelopment::CodeDrivenDevelopment.new(ARGF.read).test_code.strip
7
+
8
+ if STDOUT.tty?
9
+ require 'coderay'
10
+ puts CodeRay.scan(output, :ruby).term
11
+ else
12
+ puts output
13
+ end
@@ -19,6 +19,8 @@ Gem::Specification.new do |spec|
19
19
  spec.require_paths = ["lib"]
20
20
 
21
21
  spec.add_dependency "ruby_parser"
22
+ spec.add_dependency "require_all"
23
+ spec.add_dependency "coderay"
22
24
 
23
25
  spec.add_development_dependency "bundler", "~> 1.3"
24
26
  spec.add_development_dependency "rake"
@@ -30,9 +30,10 @@ Feature: Creates awesome specs
30
30
  """ruby
31
31
  describe "#i_call_things" do
32
32
  let(:obj) { described_class.new }
33
+ let(:file_report) { double(:file_report) }
33
34
  subject { obj.i_call_things }
34
35
  before do
35
- allow(CentralBureaucracy).to receive :file_report
36
+ allow(CentralBureaucracy).to receive(:file_report).and_return(file_report)
36
37
  end
37
38
  it "calls CentralBureaucracy.file_report" do
38
39
  subject
@@ -46,7 +47,7 @@ Feature: Creates awesome specs
46
47
  """ruby
47
48
  class Lolcat
48
49
  def i_call_instance_methods
49
- meth
50
+ meth.is_bad_for_you
50
51
  end
51
52
  end
52
53
  """
@@ -56,13 +57,17 @@ Feature: Creates awesome specs
56
57
  """ruby
57
58
  describe "#i_call_instance_methods" do
58
59
  let(:obj) { described_class.new }
60
+ let(:meth) { double(:meth) }
61
+ let(:is_bad_for_you) { double(:is_bad_for_you) }
59
62
  subject { obj.i_call_instance_methods }
60
63
  before do
61
- allow(obj).to receive :meth
64
+ allow(obj).to receive(:meth).and_return(meth)
65
+ allow(meth).to receive(:is_bad_for_you).and_return(is_bad_for_you)
62
66
  end
63
- it "calls #meth" do
67
+ it "calls meth.is_bad_for_you" do
64
68
  subject
65
69
  expect(obj).to have_received :meth
70
+ expect(meth).to have_received :is_bad_for_you
66
71
  end
67
72
  end
68
73
  """
@@ -1,21 +1,4 @@
1
1
  require 'ruby_parser'
2
+ require 'require_all'
2
3
 
3
- require "code_driven_development/version"
4
- require "code_driven_development/code_driven_development"
5
- require "code_driven_development/indented_output"
6
-
7
- require "code_driven_development/test_component/test"
8
- require "code_driven_development/test_component/one_line_test"
9
- require "code_driven_development/test_component/context"
10
- require "code_driven_development/test_component/blank_slate"
11
- require "code_driven_development/test_component/let"
12
-
13
- require "code_driven_development/rule/abstract_rule"
14
- require "code_driven_development/rule/set"
15
- require "code_driven_development/rule/constant_method_call"
16
- require "code_driven_development/rule/instance_method_call"
17
- require "code_driven_development/rule/default"
18
- require "code_driven_development/rule/boolean_or"
19
- require "code_driven_development/rule/class"
20
- require "code_driven_development/rule/validation"
21
- require "code_driven_development/rule/instance_method"
4
+ require_rel "code_driven_development"
@@ -23,8 +23,7 @@ module CodeDrivenDevelopment
23
23
  Rule::Class,
24
24
  Rule::Validation,
25
25
  Rule::InstanceMethod,
26
- Rule::ConstantMethodCall,
27
- Rule::InstanceMethodCall,
26
+ Rule::MethodCall,
28
27
  Rule::BooleanOr,
29
28
  default: Rule::Default
30
29
  )
@@ -0,0 +1,22 @@
1
+ module CodeDrivenDevelopment
2
+ module Rule
3
+ class MethodCall < AbstractRule
4
+ def capable?
5
+ code.sexp_type == :call &&
6
+ stubber.method_name != :validate
7
+ end
8
+
9
+ def test
10
+ test_context.doubles.concat(stubber.doubles.map { |sym| TestComponent::Double.new(sym) })
11
+ test_context.befores.concat(stubber.befores)
12
+ test_context << TestComponent::Test.new("calls #{stubber.human_name}", ["subject"] + stubber.body)
13
+ end
14
+
15
+ private
16
+
17
+ def stubber
18
+ @stubber ||= Stubber::Stubber.new(code)
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,39 @@
1
+ module CodeDrivenDevelopment
2
+ module Stubber
3
+ class AbstractStubber
4
+ def initialize(sexp)
5
+ @sexp = sexp
6
+ end
7
+
8
+ def method_name
9
+ sexp[2]
10
+ end
11
+
12
+ def befores
13
+ [
14
+ "allow(#{receiver_value}).to receive(:#{method_name}).and_return(#{method_name})"
15
+ ]
16
+ end
17
+
18
+ def doubles
19
+ [
20
+ method_name.to_sym
21
+ ]
22
+ end
23
+
24
+ def body
25
+ [
26
+ "expect(#{receiver_value}).to have_received :#{method_name}"
27
+ ]
28
+ end
29
+
30
+ private
31
+
32
+ attr_reader :sexp
33
+
34
+ def receiver
35
+ sexp[1]
36
+ end
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,13 @@
1
+ module CodeDrivenDevelopment
2
+ module Stubber
3
+ class ConstStubber < AbstractStubber
4
+ def receiver_value
5
+ receiver.value
6
+ end
7
+
8
+ def human_name
9
+ "#{receiver_value}.#{method_name}"
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,13 @@
1
+ module CodeDrivenDevelopment
2
+ module Stubber
3
+ class InstanceMethodStubber < AbstractStubber
4
+ def receiver_value
5
+ "obj"
6
+ end
7
+
8
+ def human_name
9
+ method_name.to_s
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,31 @@
1
+ module CodeDrivenDevelopment
2
+ module Stubber
3
+ class NestedCallStubber < AbstractStubber
4
+ def receiver_value
5
+ receiver[2]
6
+ end
7
+
8
+ def human_name
9
+ "#{substubber.human_name}.#{method_name}"
10
+ end
11
+
12
+ def befores
13
+ substubber.befores << "allow(#{substubber.method_name}).to receive(:#{method_name}).and_return(#{method_name})"
14
+ end
15
+
16
+ def body
17
+ substubber.body << "expect(#{substubber.method_name}).to have_received :#{method_name}"
18
+ end
19
+
20
+ def doubles
21
+ substubber.doubles << method_name.to_sym
22
+ end
23
+
24
+ private
25
+
26
+ def substubber
27
+ @substubber ||= Stubber.new(receiver)
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,22 @@
1
+ module CodeDrivenDevelopment
2
+ module Stubber
3
+ class Stubber
4
+ def self.new(sexp)
5
+ raise "That's not a call!" unless sexp.sexp_type == :call
6
+
7
+ receiver = sexp[1] && sexp[1].sexp_type
8
+
9
+ case receiver
10
+ when nil
11
+ InstanceMethodStubber.new(sexp)
12
+ when :const
13
+ ConstStubber.new(sexp)
14
+ when :call
15
+ NestedCallStubber.new(sexp)
16
+ else
17
+ raise "Can't stub #{receiver.inspect} :("
18
+ end
19
+ end
20
+ end
21
+ end
22
+ end
@@ -2,10 +2,10 @@ module CodeDrivenDevelopment
2
2
  module TestComponent
3
3
  class Context
4
4
  def initialize(description = nil, befores = [], tests = [], lets = [], subject = nil)
5
- @description, @befores, @tests, @lets, @subject = description, befores, tests, lets, subject
5
+ @description, @befores, @tests, @lets, @subject, @doubles = description, befores, tests, lets, subject, []
6
6
  end
7
7
 
8
- attr_reader :tests, :befores, :lets
8
+ attr_reader :tests, :befores, :lets, :doubles
9
9
  attr_accessor :description, :subject
10
10
 
11
11
  def << child
@@ -18,6 +18,9 @@ module CodeDrivenDevelopment
18
18
  lets.each do |let|
19
19
  let.indented_output(io)
20
20
  end
21
+ doubles.each do |double|
22
+ double.indented_output(io)
23
+ end
21
24
  if subject
22
25
  io << "subject { #{subject} }"
23
26
  end
@@ -0,0 +1,13 @@
1
+ module CodeDrivenDevelopment
2
+ module TestComponent
3
+ class Double
4
+ def initialize(name)
5
+ @name = name
6
+ end
7
+
8
+ def indented_output(io)
9
+ io << "let(:#@name) { double(:#@name) }"
10
+ end
11
+ end
12
+ end
13
+ end
@@ -1,3 +1,3 @@
1
1
  module CodeDrivenDevelopment
2
- VERSION = "0.0.4"
2
+ VERSION = "0.0.5"
3
3
  end
@@ -3,6 +3,7 @@ class Bunker < ActiveRecord::Base
3
3
  validate :location, :protected => true
4
4
 
5
5
  def alert_staff
6
+ staph.all_alert
6
7
  Staff.alert_all
7
8
  end
8
9
 
@@ -1,4 +1,3 @@
1
- require 'yaml'
2
1
  require_relative '../lib/code_driven_development'
3
2
 
4
3
  RSpec.configure do |config|
@@ -0,0 +1,110 @@
1
+ require 'spec_helper'
2
+
3
+ describe CodeDrivenDevelopment::Stubber::Stubber do
4
+ let(:sexp) { RubyParser.new.parse(code) }
5
+ let(:stubber) { CodeDrivenDevelopment::Stubber::Stubber.new(sexp) }
6
+
7
+ context "invoking a constant's method" do
8
+ let(:code) { "Constant.zulu.force" }
9
+
10
+ it "stubs like a boss" do
11
+ expect(stubber.befores).to match_array [
12
+ "allow(Constant).to receive(:zulu).and_return(zulu)",
13
+ "allow(zulu).to receive(:force).and_return(force)",
14
+ ]
15
+ end
16
+
17
+ it "has a legit human name" do
18
+ expect(stubber.human_name).to eq "Constant.zulu.force"
19
+ end
20
+
21
+ it "can create a test body" do
22
+ expect(stubber.body).to match_array [
23
+ "expect(Constant).to have_received :zulu",
24
+ "expect(zulu).to have_received :force",
25
+ ]
26
+ end
27
+
28
+ it "has some doubles" do
29
+ expect(stubber.doubles).to match_array [:zulu, :force]
30
+ end
31
+ end
32
+
33
+ context "invoking an instance method of self" do
34
+ let(:code) { "zulu" }
35
+
36
+ it "stubs like a boss" do
37
+ expect(stubber.befores).to eq ["allow(obj).to receive(:zulu).and_return(zulu)"]
38
+ end
39
+
40
+ it "has a legit human name" do
41
+ expect(stubber.human_name).to eq "zulu"
42
+ end
43
+
44
+ it "can create a test body" do
45
+ expect(stubber.body).to eq [
46
+ "expect(obj).to have_received :zulu"
47
+ ]
48
+ end
49
+
50
+ it "has some doubles" do
51
+ expect(stubber.doubles).to match_array [:zulu]
52
+ end
53
+ end
54
+
55
+ context "a double method call" do
56
+ let(:code) { "alpha.beta" }
57
+
58
+ it "stubs like a boss" do
59
+ expect(stubber.befores).to match_array [
60
+ "allow(obj).to receive(:alpha).and_return(alpha)",
61
+ "allow(alpha).to receive(:beta).and_return(beta)",
62
+ ]
63
+ end
64
+
65
+ it "has a legit human name" do
66
+ expect(stubber.human_name).to eq "alpha.beta"
67
+ end
68
+
69
+ it "can create a test body" do
70
+ expect(stubber.body).to match_array [
71
+ "expect(obj).to have_received :alpha",
72
+ "expect(alpha).to have_received :beta",
73
+ ]
74
+ end
75
+
76
+ it "has some doubles" do
77
+ expect(stubber.doubles).to match_array [:alpha, :beta]
78
+ end
79
+ end
80
+
81
+ context "infinitely nested method calls on self" do
82
+ let(:code) { "alpha.beta.gamma.delta" }
83
+
84
+ it "stubs like a boss" do
85
+ expect(stubber.befores).to match_array [
86
+ "allow(obj).to receive(:alpha).and_return(alpha)",
87
+ "allow(alpha).to receive(:beta).and_return(beta)",
88
+ "allow(beta).to receive(:gamma).and_return(gamma)",
89
+ "allow(gamma).to receive(:delta).and_return(delta)",
90
+ ]
91
+ end
92
+
93
+ it "has a legit human name" do
94
+ expect(stubber.human_name).to eq "alpha.beta.gamma.delta"
95
+ end
96
+
97
+ it "can create a test body" do
98
+ expect(stubber.body).to match_array [
99
+ "expect(obj).to have_received :alpha",
100
+ "expect(alpha).to have_received :beta",
101
+ "expect(beta).to have_received :gamma",
102
+ "expect(gamma).to have_received :delta",
103
+ ]
104
+ end
105
+
106
+ it "has some doubles" do
107
+ expect(stubber.doubles).to match_array [:alpha, :beta, :gamma, :delta]
108
+ end
109
+ end
110
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: code_driven_development
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.4
4
+ version: 0.0.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Dan Finnie
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-02-09 00:00:00.000000000 Z
11
+ date: 2014-02-14 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: ruby_parser
@@ -24,6 +24,34 @@ dependencies:
24
24
  - - '>='
25
25
  - !ruby/object:Gem::Version
26
26
  version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: require_all
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - '>='
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - '>='
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: coderay
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - '>='
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - '>='
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
27
55
  - !ruby/object:Gem::Dependency
28
56
  name: bundler
29
57
  requirement: !ruby/object:Gem::Requirement
@@ -132,21 +160,26 @@ files:
132
160
  - lib/code_driven_development/rule/abstract_rule.rb
133
161
  - lib/code_driven_development/rule/boolean_or.rb
134
162
  - lib/code_driven_development/rule/class.rb
135
- - lib/code_driven_development/rule/constant_method_call.rb
136
163
  - lib/code_driven_development/rule/default.rb
137
164
  - lib/code_driven_development/rule/instance_method.rb
138
- - lib/code_driven_development/rule/instance_method_call.rb
165
+ - lib/code_driven_development/rule/method_call.rb
139
166
  - lib/code_driven_development/rule/set.rb
140
167
  - lib/code_driven_development/rule/validation.rb
168
+ - lib/code_driven_development/stubber/abstract_stubber.rb
169
+ - lib/code_driven_development/stubber/const_stubber.rb
170
+ - lib/code_driven_development/stubber/instance_method_stubber.rb
171
+ - lib/code_driven_development/stubber/nested_call_stubber.rb
172
+ - lib/code_driven_development/stubber/stubber.rb
141
173
  - lib/code_driven_development/test_component/blank_slate.rb
142
174
  - lib/code_driven_development/test_component/context.rb
175
+ - lib/code_driven_development/test_component/double.rb
143
176
  - lib/code_driven_development/test_component/let.rb
144
177
  - lib/code_driven_development/test_component/one_line_test.rb
145
178
  - lib/code_driven_development/test_component/test.rb
146
179
  - lib/code_driven_development/version.rb
147
180
  - samples/president.rb
148
- - spec/samples/lone_sample.yaml
149
181
  - spec/spec_helper.rb
182
+ - spec/stubber_spec.rb
150
183
  homepage: https://github.com/danfinnie/code-driven-development
151
184
  licenses:
152
185
  - MIT
@@ -175,5 +208,5 @@ summary: Ever see a test and think, "wow, this test cares a lot about the exact
175
208
  test_files:
176
209
  - features/my_feature.feature
177
210
  - features/support/aruba.rb
178
- - spec/samples/lone_sample.yaml
179
211
  - spec/spec_helper.rb
212
+ - spec/stubber_spec.rb
@@ -1,38 +0,0 @@
1
- module CodeDrivenDevelopment
2
- module Rule
3
- class ConstantMethodCall < AbstractRule
4
- def capable?
5
- code.sexp_type == :call &&
6
- method_name != :validate &&
7
- receiver_type == :const
8
- end
9
-
10
- def test
11
- test_context.befores << "allow(#{receiver_value}).to receive :#{method_name}"
12
- body = [
13
- "subject",
14
- "expect(#{receiver_value}).to have_received :#{method_name}"
15
- ]
16
- test_context << TestComponent::Test.new("calls #{receiver_value}.#{method_name}", body)
17
- end
18
-
19
- private
20
-
21
- def receiver_value
22
- receiver.value
23
- end
24
-
25
- def receiver_type
26
- receiver && receiver.sexp_type
27
- end
28
-
29
- def receiver
30
- code[1]
31
- end
32
-
33
- def method_name
34
- code[2]
35
- end
36
- end
37
- end
38
- end
@@ -1,38 +0,0 @@
1
- module CodeDrivenDevelopment
2
- module Rule
3
- class InstanceMethodCall < AbstractRule
4
- def capable?
5
- code.sexp_type == :call &&
6
- method_name != :validate &&
7
- receiver_type.nil?
8
- end
9
-
10
- def test
11
- test_context.befores << "allow(#{receiver_value}).to receive :#{method_name}"
12
- body = [
13
- "subject",
14
- "expect(#{receiver_value}).to have_received :#{method_name}"
15
- ]
16
- test_context << TestComponent::Test.new("calls ##{method_name}", body)
17
- end
18
-
19
- private
20
-
21
- def receiver_value
22
- "obj"
23
- end
24
-
25
- def receiver_type
26
- receiver && receiver.sexp_type
27
- end
28
-
29
- def receiver
30
- code[1]
31
- end
32
-
33
- def method_name
34
- code[2]
35
- end
36
- end
37
- end
38
- end
@@ -1,54 +0,0 @@
1
- -
2
- title: creates shoulda_matchers
3
- input: |
4
- class Lolcat < ActiveRecord::Base
5
- validate :cuteness, presence: true
6
- end
7
- output: |
8
- describe Lolcat do
9
- it { should validate_presence_of :cuteness }
10
- end
11
- -
12
- title: instance methods that call constants
13
- input: |
14
- class Lolcat
15
- def i_call_things
16
- CentralBureaucracy.file_report
17
- end
18
- end
19
- output: |
20
- describe Lolcat do
21
-
22
- describe "#i_call_things" do
23
- let(:obj) { described_class.new }
24
- before do
25
- allow(CentralBureaucracy).to receive :file_report
26
- obj.i_call_things
27
- end
28
- it "calls CentralBureaucracy.file_report" do
29
- expect(CentralBureaucracy).to have_received :file_report
30
- end
31
- end
32
- end
33
- -
34
- title: instance methods that call instance methods
35
- input: |
36
- class Lolcat
37
- def i_call_instance_methods
38
- meth
39
- end
40
- end
41
- output: |
42
- describe Lolcat do
43
-
44
- describe "#i_call_instance_methods" do
45
- let(:obj) { described_class.new }
46
- before do
47
- allow(obj).to receive :meth
48
- obj.i_call_instance_methods
49
- end
50
- it "calls #meth" do
51
- expect(obj).to have_received :meth
52
- end
53
- end
54
- end