mocktail 1.1.2 → 1.1.3
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 +12 -0
- data/Gemfile.lock +1 -1
- data/lib/mocktail/handles_dry_call/fulfills_stubbing/describes_unsatisfied_stubbing.rb +3 -4
- data/lib/mocktail/share/bind.rb +14 -0
- data/lib/mocktail/share/determines_matching_calls.rb +5 -9
- data/lib/mocktail/simulates_argument_error/transforms_params.rb +9 -13
- data/lib/mocktail/value/cabinet.rb +7 -5
- data/lib/mocktail/version.rb +1 -1
- metadata +4 -4
- data/lib/mocktail/share/compares_safely.rb +0 -7
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 0aa187046d2e07280352ba6f0296f5573bda910acb111e06d0932f0e2518064e
|
4
|
+
data.tar.gz: c3e5e74d586969ea5dd88dc86c20a9d2e6f223f1bb8a438325583a8d8fb20bae
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 224a377d46c11b830b90a828e6a0c294e940c3492cde42fda9aa0f865b97cdc69773571d4464bd4bbe185aa29e6860c5a4c2b3b87a458382a84b330ddce5df3e
|
7
|
+
data.tar.gz: 10562536842265afc7f6bef9fa63a8ebab657e78941f13bc0e38cb49cf8f43785d1d926d0f5afe103165d337fe2163cba88aa4aee220004c8a2494e5f5493d4c
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,15 @@
|
|
1
|
+
# 1.1.3
|
2
|
+
|
3
|
+
* Improve the robustness of how we call the original methods on doubles &
|
4
|
+
replaced class methods on mocks internally by Mocktail to avoid behavior being
|
5
|
+
altered by how users configure mock objects
|
6
|
+
|
7
|
+
# 1.1.2
|
8
|
+
|
9
|
+
* Fix cases where classes that redefine built-in methods could cause issues when
|
10
|
+
Mocktail in turn called those methods internally
|
11
|
+
[#15](https://github.com/testdouble/mocktail/pull/15)
|
12
|
+
|
1
13
|
# 1.1.1
|
2
14
|
|
3
15
|
* Improve output for undefined singleton methods
|
data/Gemfile.lock
CHANGED
@@ -1,19 +1,18 @@
|
|
1
1
|
require_relative "../../share/cleans_backtrace"
|
2
|
-
require_relative "../../share/
|
2
|
+
require_relative "../../share/bind"
|
3
3
|
|
4
4
|
module Mocktail
|
5
5
|
class DescribesUnsatisfiedStubbing
|
6
6
|
def initialize
|
7
7
|
@cleans_backtrace = CleansBacktrace.new
|
8
|
-
@compares_safely = ComparesSafely.new
|
9
8
|
end
|
10
9
|
|
11
10
|
def describe(dry_call)
|
12
11
|
UnsatisfyingCall.new(
|
13
12
|
call: dry_call,
|
14
13
|
other_stubbings: Mocktail.cabinet.stubbings.select { |stubbing|
|
15
|
-
|
16
|
-
|
14
|
+
Bind.call(dry_call.double, :==, stubbing.recording.double) &&
|
15
|
+
dry_call.method == stubbing.recording.method
|
17
16
|
},
|
18
17
|
backtrace: @cleans_backtrace.clean(Error.new).backtrace
|
19
18
|
)
|
@@ -0,0 +1,14 @@
|
|
1
|
+
module Mocktail
|
2
|
+
module Bind
|
3
|
+
def self.call(mock, method_name, *args, **kwargs, &blk)
|
4
|
+
if Mocktail.cabinet.double_for_instance(mock)
|
5
|
+
Object.instance_method(method_name).bind_call(mock, *args, **kwargs, &blk)
|
6
|
+
elsif (type_replacement = TopShelf.instance.type_replacement_if_exists_for(mock)) &&
|
7
|
+
(og_method = type_replacement.original_methods&.find { |m| m.name == method_name })
|
8
|
+
og_method.call(*args, **kwargs, &blk)
|
9
|
+
else
|
10
|
+
mock.__send__(method_name, *args, **kwargs, &blk)
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
@@ -1,14 +1,10 @@
|
|
1
|
-
require_relative "
|
1
|
+
require_relative "bind"
|
2
2
|
|
3
3
|
module Mocktail
|
4
4
|
class DeterminesMatchingCalls
|
5
|
-
def initialize
|
6
|
-
@compares_safely = ComparesSafely.new
|
7
|
-
end
|
8
|
-
|
9
5
|
def determine(real_call, demo_call, demo_config)
|
10
|
-
|
11
|
-
|
6
|
+
Bind.call(real_call.double, :==, demo_call.double) &&
|
7
|
+
real_call.method == demo_call.method &&
|
12
8
|
|
13
9
|
# Matcher implementation will replace this:
|
14
10
|
args_match?(real_call.args, demo_call.args, demo_config.ignore_extra_args) &&
|
@@ -55,11 +51,11 @@ module Mocktail
|
|
55
51
|
end
|
56
52
|
|
57
53
|
def match?(real_arg, demo_arg)
|
58
|
-
if
|
54
|
+
if Bind.call(demo_arg, :respond_to?, :is_mocktail_matcher?) &&
|
59
55
|
demo_arg.is_mocktail_matcher?
|
60
56
|
demo_arg.match?(real_arg)
|
61
57
|
else
|
62
|
-
demo_arg
|
58
|
+
Bind.call(demo_arg, :==, real_arg)
|
63
59
|
end
|
64
60
|
end
|
65
61
|
end
|
@@ -1,22 +1,18 @@
|
|
1
|
-
require_relative "../share/
|
1
|
+
require_relative "../share/bind"
|
2
2
|
|
3
3
|
module Mocktail
|
4
4
|
class TransformsParams
|
5
|
-
def initialize
|
6
|
-
@compares_safely = ComparesSafely.new
|
7
|
-
end
|
8
|
-
|
9
5
|
def transform(dry_call)
|
10
6
|
params = dry_call.original_method.parameters
|
11
7
|
|
12
8
|
Signature.new(
|
13
9
|
positional_params: Params.new(
|
14
10
|
all: params.select { |t, _|
|
15
|
-
[:req, :opt, :rest].any? { |param_type|
|
11
|
+
[:req, :opt, :rest].any? { |param_type| Bind.call(t, :==, param_type) }
|
16
12
|
}.map { |_, name| name },
|
17
|
-
required: params.select { |t, _|
|
18
|
-
optional: params.select { |t, _|
|
19
|
-
rest: params.find { |t, _|
|
13
|
+
required: params.select { |t, _| Bind.call(t, :==, :req) }.map { |_, n| n },
|
14
|
+
optional: params.select { |t, _| Bind.call(t, :==, :opt) }.map { |_, n| n },
|
15
|
+
rest: params.find { |t, _| Bind.call(t, :==, :rest) } & [1]
|
20
16
|
),
|
21
17
|
positional_args: dry_call.args,
|
22
18
|
|
@@ -24,13 +20,13 @@ module Mocktail
|
|
24
20
|
all: params.select { |type, _|
|
25
21
|
[:keyreq, :key, :keyrest].include?(type)
|
26
22
|
}.map { |_, name| name },
|
27
|
-
required: params.select { |t, _|
|
28
|
-
optional: params.select { |t, _|
|
29
|
-
rest: params.find { |t, _|
|
23
|
+
required: params.select { |t, _| Bind.call(t, :==, :keyreq) }.map { |_, n| n },
|
24
|
+
optional: params.select { |t, _| Bind.call(t, :==, :key) }.map { |_, n| n },
|
25
|
+
rest: params.find { |t, _| Bind.call(t, :==, :keyrest) } & [1]
|
30
26
|
),
|
31
27
|
keyword_args: dry_call.kwargs,
|
32
28
|
|
33
|
-
block_param: params.find { |t, _|
|
29
|
+
block_param: params.find { |t, _| Bind.call(t, :==, :block) } & [1],
|
34
30
|
block_arg: dry_call.block
|
35
31
|
)
|
36
32
|
end
|
@@ -1,4 +1,4 @@
|
|
1
|
-
require_relative "../share/
|
1
|
+
require_relative "../share/bind"
|
2
2
|
|
3
3
|
# The Cabinet stores all thread-local state, so anything that goes here
|
4
4
|
# is guaranteed by Mocktail to be local to the currently-running thread
|
@@ -8,7 +8,6 @@ module Mocktail
|
|
8
8
|
attr_reader :calls, :stubbings, :unsatisfying_calls
|
9
9
|
|
10
10
|
def initialize
|
11
|
-
@compares_safely = ComparesSafely.new
|
12
11
|
@doubles = []
|
13
12
|
@calls = []
|
14
13
|
@stubbings = []
|
@@ -48,18 +47,21 @@ module Mocktail
|
|
48
47
|
end
|
49
48
|
|
50
49
|
def double_for_instance(thing)
|
51
|
-
@doubles.find { |double|
|
50
|
+
@doubles.find { |double|
|
51
|
+
# Intentionally calling directly to avoid an infinite recursion in Bind.call
|
52
|
+
Object.instance_method(:==).bind_call(double.dry_instance, thing)
|
53
|
+
}
|
52
54
|
end
|
53
55
|
|
54
56
|
def stubbings_for_double(double)
|
55
57
|
@stubbings.select { |stubbing|
|
56
|
-
|
58
|
+
Bind.call(stubbing.recording.double, :==, double.dry_instance)
|
57
59
|
}
|
58
60
|
end
|
59
61
|
|
60
62
|
def calls_for_double(double)
|
61
63
|
@calls.select { |call|
|
62
|
-
|
64
|
+
Bind.call(call.double, :==, double.dry_instance)
|
63
65
|
}
|
64
66
|
end
|
65
67
|
end
|
data/lib/mocktail/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: mocktail
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.1.
|
4
|
+
version: 1.1.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Justin Searls
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2022-06-
|
11
|
+
date: 2022-06-28 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description:
|
14
14
|
email:
|
@@ -67,8 +67,8 @@ files:
|
|
67
67
|
- lib/mocktail/replaces_type/redefines_new.rb
|
68
68
|
- lib/mocktail/replaces_type/redefines_singleton_methods.rb
|
69
69
|
- lib/mocktail/resets_state.rb
|
70
|
+
- lib/mocktail/share/bind.rb
|
70
71
|
- lib/mocktail/share/cleans_backtrace.rb
|
71
|
-
- lib/mocktail/share/compares_safely.rb
|
72
72
|
- lib/mocktail/share/creates_identifier.rb
|
73
73
|
- lib/mocktail/share/determines_matching_calls.rb
|
74
74
|
- lib/mocktail/share/stringifies_call.rb
|
@@ -119,7 +119,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
119
119
|
- !ruby/object:Gem::Version
|
120
120
|
version: '0'
|
121
121
|
requirements: []
|
122
|
-
rubygems_version: 3.3.
|
122
|
+
rubygems_version: 3.3.7
|
123
123
|
signing_key:
|
124
124
|
specification_version: 4
|
125
125
|
summary: Take your objects, and make them a double
|