much-stub 0.1.3 → 0.1.4

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
  SHA256:
3
- metadata.gz: 25518cd79915a42ef00d555f2f09db36b19ec52237054c1fb763667ff0a5c4d0
4
- data.tar.gz: edbd7bd553731a3084806768ad3d956b7f086212b095dfaf63e9eff0ba56cc4e
3
+ metadata.gz: 21883570fda48199a217f7489b6c45f6d3c2e1d1cb5aa872847e154033754771
4
+ data.tar.gz: bf63e826137aa1d315d48823c7a11787a09be559b16abc600a168edc19ff9068
5
5
  SHA512:
6
- metadata.gz: eb69a558eb21bbd717bb9164a5142c318697ea512e0234dd110c0127eaa9eef68a25abd13c2d9c4136dc9474712312a85fb5af8a30fc7dcaf8c7b1cc6d8606c4
7
- data.tar.gz: 390126be543ddf6c36fcf7dd3c0491c5530ba8535b049b91edf9de6a3461895f5b4f673d2ef0b5b920af30880e71ea705f1043648edef75ede03b9c1af74b311
6
+ metadata.gz: 7f6c8c294b7f7d006b3c88a3890d24e3ff913110caa11b70642d7ba246449dd3dcb20de0df46e939d90a9b917f0c509144c260fdbfc689f6a89be1f9fb5b942f
7
+ data.tar.gz: 6a7c16b6b19625ad5b84df6d5413119a921f81425278f5f3b8c0b579895c9a22e8de58da349e56684412d93a74f450ba6e7ed2b53f06ad9185f9cf8ee31ec1a5
data/README.md CHANGED
@@ -116,6 +116,12 @@ MuchStub.(my_object, :basic_method) { |*args|
116
116
  MuchStub.(my_object, :basic_method).on_call { |call|
117
117
  basic_method_called_with = call
118
118
  }
119
+ # OR
120
+ MuchStub.on_call(my_object, :basic_method) { |call|
121
+ # MucStub.on_call(...) { ... } is equivalent to
122
+ # MuchStub.(...).on_call { ... }
123
+ basic_method_called_with = call
124
+ }
119
125
 
120
126
  my_object.basic_method(123)
121
127
  basic_method_called_with.args
@@ -18,16 +18,24 @@ module MuchStub
18
18
  return false
19
19
  end
20
20
 
21
- def self.call(*args, &block)
22
- self.stub(*args, &block)
23
- end
24
-
25
21
  def self.stub(obj, meth, &block)
26
22
  key = self.stub_key(obj, meth)
27
23
  self.stubs[key] ||= MuchStub::Stub.new(obj, meth, caller_locations)
28
24
  self.stubs[key].tap{ |s| s.do = block }
29
25
  end
30
26
 
27
+ def self.call(*args, &block)
28
+ self.stub(*args, &block)
29
+ end
30
+
31
+ def self.stub_on_call(*args, &on_call_block)
32
+ self.stub(*args).on_call(&on_call_block)
33
+ end
34
+
35
+ def self.on_call(*args, &on_call_block)
36
+ self.stub_on_call(*args, &on_call_block)
37
+ end
38
+
31
39
  def self.unstub(obj, meth)
32
40
  key = self.stub_key(obj, meth)
33
41
  (self.stubs.delete(key) || MuchStub::NullStub.new).teardown
@@ -60,10 +68,10 @@ module MuchStub
60
68
  end
61
69
 
62
70
  def self.spy(obj, *meths, **return_values)
63
- MuchStub::CallSpy.new(**return_values).tap do |spy|
71
+ MuchStub::CallSpy.new(**return_values).call_spy_tap do |spy|
64
72
  meths.each do |meth|
65
73
  self.stub(obj, meth) { |*args, &block|
66
- spy.public_send(meth, *args, &block)
74
+ spy.__send__(meth, *args, &block)
67
75
  }
68
76
  end
69
77
  end
@@ -1,7 +1,7 @@
1
1
  require "much-stub/call"
2
2
 
3
3
  module MuchStub
4
- class CallSpy
4
+ class CallSpy < ::BasicObject
5
5
  METHOD_NAME_REPLACEMENTS = {
6
6
  "!" => "_bang",
7
7
  "?" => "_predicate"
@@ -9,10 +9,42 @@ module MuchStub
9
9
 
10
10
  def initialize(**return_values)
11
11
  @call_spy_return_values = return_values.transform_keys{ |key| key.to_s }
12
-
13
- @call_spy_method_calls = Hash.new { |hash, key| hash[key] = [] }
12
+ @call_spy_method_calls = ::Hash.new { |hash, key| hash[key] = [] }
14
13
  @call_spy_method_return_values =
15
- Hash.new { |hash, key| hash[key] = call_spy_return_value_proc(key) }
14
+ ::Hash.new { |hash, key| hash[key] = call_spy_return_value_proc(key) }
15
+ end
16
+
17
+ def call_spy_tap
18
+ yield self
19
+ self
20
+ end
21
+
22
+ def ==(other)
23
+ self.equal?(other)
24
+ end
25
+
26
+ def ===(other)
27
+ self.equal?(other)
28
+ end
29
+
30
+ def eql?(other)
31
+ self.equal?(other)
32
+ end
33
+
34
+ def equal?(other)
35
+ self.__id__ == other.__id__
36
+ end
37
+
38
+ def hash
39
+ self.__id__
40
+ end
41
+
42
+ def respond_to?(*)
43
+ true
44
+ end
45
+
46
+ def inspect
47
+ "#<MuchStub::CallSpy:#{"0x0%x" % (self.__id__ << 1)}>"
16
48
  end
17
49
 
18
50
  private
@@ -25,7 +57,7 @@ module MuchStub
25
57
  value = @call_spy_return_values[method_name]
26
58
  return value if value.respond_to?(:call)
27
59
 
28
- ->(*) { value.nil? ? self : value }
60
+ ::Proc.new { value.nil? ? self : value }
29
61
  end
30
62
 
31
63
  def call_spy_normalize_method_name(name)
@@ -36,8 +68,8 @@ module MuchStub
36
68
 
37
69
  def call_spy_define_spied_method(name)
38
70
  method_name = call_spy_normalize_method_name(name)
39
- self.define_singleton_method(name) do |*args, &block|
40
- call = MuchStub::Call.new(*args, &block)
71
+ call_spy_define_metaclass_method(name) do |*args, &block|
72
+ call = ::MuchStub::Call.new(*args, &block)
41
73
  @call_spy_method_calls[method_name] << call
42
74
  call_spy_method_return_value(name, call)
43
75
  end
@@ -47,45 +79,46 @@ module MuchStub
47
79
  spied_method_name = query_method_match[1]
48
80
  query_method_suffix = query_method_match[2]
49
81
  method_name = call_spy_normalize_method_name(spied_method_name)
50
- self.define_singleton_method("#{method_name}#{query_method_suffix}") do
51
- yield(method_name) if block_given?
82
+ call_spy_define_metaclass_method("#{method_name}#{query_method_suffix}") do
83
+ yield(method_name) if ::Kernel.block_given?
52
84
  end
53
85
  end
54
86
 
87
+ def call_spy_define_metaclass_method(name, &block)
88
+ metaclass = class << self; self; end
89
+ metaclass.define_method(name, &block)
90
+ end
91
+
55
92
  def method_missing(name, *args, &block)
56
93
  if (match = name.match(/(\w+)(_calls)\z/))
57
94
  call_spy_define_query_method(match) do |method_name|
58
95
  @call_spy_method_calls[method_name]
59
96
  end
60
- self.send(name, *args, &block)
97
+ self.__send__(name, *args, &block)
61
98
  elsif (match = name.match(/(\w+)(_last_called_with)\z/))
62
99
  call_spy_define_query_method(match) do |method_name|
63
- self.send("#{method_name}_calls").last
100
+ self.__send__("#{method_name}_calls").last
64
101
  end
65
- self.send(name, *args, &block)
102
+ self.__send__(name, *args, &block)
66
103
  elsif (match = name.match(/(\w+)(_called_with)\z/))
67
104
  call_spy_define_query_method(match) do |method_name|
68
- self.send("#{method_name}_last_called_with")
105
+ self.__send__("#{method_name}_last_called_with")
69
106
  end
70
- self.send(name, *args, &block)
107
+ self.__send__(name, *args, &block)
71
108
  elsif (match = name.match(/(\w+)(_call_count)\z/))
72
109
  call_spy_define_query_method(match) do |method_name|
73
- self.send("#{method_name}_calls").size
110
+ self.__send__("#{method_name}_calls").size
74
111
  end
75
- self.send(name, *args, &block)
112
+ self.__send__(name, *args, &block)
76
113
  elsif (match = name.match(/(\w+)(_called\?)\z/))
77
114
  call_spy_define_query_method(match) do |method_name|
78
- self.send("#{method_name}_call_count") > 0
115
+ self.__send__("#{method_name}_call_count") > 0
79
116
  end
80
- self.send(name, *args, &block)
117
+ self.__send__(name, *args, &block)
81
118
  else
82
119
  call_spy_define_spied_method(name)
83
- self.send(name, *args, &block)
120
+ self.__send__(name, *args, &block)
84
121
  end
85
122
  end
86
-
87
- def respond_to_missing?(*args)
88
- super
89
- end
90
123
  end
91
124
  end
@@ -1,3 +1,3 @@
1
1
  module MuchStub
2
- VERSION = "0.1.3"
2
+ VERSION = "0.1.4"
3
3
  end
@@ -20,6 +20,5 @@ Gem::Specification.new do |gem|
20
20
 
21
21
  gem.required_ruby_version = "~> 2.5"
22
22
 
23
- gem.add_development_dependency("assert", ["~> 2.18.1"])
24
-
23
+ gem.add_development_dependency("assert", ["~> 2.18.2"])
25
24
  end
@@ -4,7 +4,7 @@ require "much-stub/call_spy"
4
4
  require "test/support/factory"
5
5
 
6
6
  class MuchStub::CallSpy
7
- class UnitTests < Assert::Context
7
+ class UnitTests < ::Assert::Context
8
8
  desc "MuchStub::CallSpy"
9
9
  setup do
10
10
  @unit_class = MuchStub::CallSpy
@@ -19,7 +19,7 @@ class MuchStub::CallSpy
19
19
  subject{ @spy }
20
20
 
21
21
  should "spy on method calls and return itself" do
22
- assert_false subject.respond_to?(:get)
22
+ assert_true subject.respond_to?(:get)
23
23
 
24
24
  assert_equal [], subject.get_calls
25
25
  assert_nil subject.get_last_called_with
@@ -25,10 +25,32 @@ module MuchStub
25
25
  stub1 = MuchStub.(@myobj, :mymeth)
26
26
  assert_kind_of MuchStub::Stub, stub1
27
27
 
28
- stub2 = MuchStub.call(@myobj, :mymeth)
28
+ stub2 = MuchStub.stub(@myobj, :mymeth)
29
29
  assert_kind_of MuchStub::Stub, stub2
30
30
  end
31
31
 
32
+ should "build a stub with an on_call block" do
33
+ my_meth_called_with = nil
34
+ stub1 =
35
+ MuchStub.on_call(@myobj, :mymeth) { |call|
36
+ my_meth_called_with = call
37
+ }
38
+
39
+ @myobj.mymeth
40
+ assert_kind_of MuchStub::Stub, stub1
41
+ assert_equal [], my_meth_called_with.args
42
+
43
+ my_meth_called_with = nil
44
+ stub2 =
45
+ MuchStub.stub_on_call(@myobj, :mymeth) { |call|
46
+ my_meth_called_with = call
47
+ }
48
+
49
+ @myobj.mymeth
50
+ assert_kind_of MuchStub::Stub, stub2
51
+ assert_equal [], my_meth_called_with.args
52
+ end
53
+
32
54
  should "lookup stubs that have been called before" do
33
55
  stub1 = MuchStub.(@myobj, :mymeth)
34
56
  stub2 = MuchStub.(@myobj, :mymeth)
@@ -112,11 +134,13 @@ module MuchStub
112
134
  :one,
113
135
  :two,
114
136
  :three,
137
+ :to_s,
115
138
  ready?: true)
116
139
 
117
140
  assert_equal spy, myobj.one
118
141
  assert_equal spy, myobj.two("a")
119
142
  assert_equal spy, myobj.three
143
+ assert_equal spy, myobj.to_s
120
144
 
121
145
  assert_true myobj.one.two("b").three.ready?
122
146
 
@@ -124,6 +148,7 @@ module MuchStub
124
148
  assert_equal 2, spy.one_call_count
125
149
  assert_equal 2, spy.two_call_count
126
150
  assert_equal 2, spy.three_call_count
151
+ assert_equal 1, spy.to_s_call_count
127
152
  assert_equal 1, spy.ready_predicate_call_count
128
153
  assert_equal ["b"], spy.two_last_called_with.args
129
154
  assert_true spy.ready_predicate_called?
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: much-stub
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.3
4
+ version: 0.1.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Kelly Redding
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2020-07-13 00:00:00.000000000 Z
12
+ date: 2020-09-01 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: assert
@@ -17,14 +17,14 @@ dependencies:
17
17
  requirements:
18
18
  - - "~>"
19
19
  - !ruby/object:Gem::Version
20
- version: 2.18.1
20
+ version: 2.18.2
21
21
  type: :development
22
22
  prerelease: false
23
23
  version_requirements: !ruby/object:Gem::Requirement
24
24
  requirements:
25
25
  - - "~>"
26
26
  - !ruby/object:Gem::Version
27
- version: 2.18.1
27
+ version: 2.18.2
28
28
  description: Stubbing API for replacing method calls on objects in test runs.
29
29
  email:
30
30
  - kelly@kellyredding.com