mocha 2.7.1 → 3.0.0.pre.rc.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.rubocop.yml +67 -3
- data/.rubocop_todo.yml +25 -13
- data/Gemfile +11 -27
- data/README.md +3 -4
- data/RELEASE.md +37 -0
- data/Rakefile +6 -5
- data/gemfiles/Gemfile.minitest.latest +3 -3
- data/gemfiles/Gemfile.rubocop +9 -0
- data/gemfiles/Gemfile.test-unit.latest +3 -3
- data/lib/mocha/any_instance_method.rb +2 -0
- data/lib/mocha/any_instance_receiver.rb +20 -0
- data/lib/mocha/api.rb +4 -2
- data/lib/mocha/argument_iterator.rb +5 -5
- data/lib/mocha/backtrace_filter.rb +2 -0
- data/lib/mocha/{block_matcher.rb → block_matchers.rb} +2 -0
- data/lib/mocha/cardinality.rb +2 -2
- data/lib/mocha/central.rb +4 -0
- data/lib/mocha/change_state_side_effect.rb +2 -0
- data/lib/mocha/class_methods.rb +5 -4
- data/lib/mocha/configuration.rb +18 -41
- data/lib/mocha/default_name.rb +15 -0
- data/lib/mocha/default_receiver.rb +13 -0
- data/lib/mocha/deprecation.rb +15 -9
- data/lib/mocha/detection/minitest.rb +2 -0
- data/lib/mocha/detection/test_unit.rb +4 -1
- data/lib/mocha/error_with_filtered_backtrace.rb +2 -0
- data/lib/mocha/exception_raiser.rb +3 -0
- data/lib/mocha/expectation.rb +57 -23
- data/lib/mocha/expectation_error.rb +2 -0
- data/lib/mocha/expectation_error_factory.rb +2 -0
- data/lib/mocha/expectation_list.rb +2 -0
- data/lib/mocha/hooks.rb +2 -0
- data/lib/mocha/impersonating_any_instance_name.rb +13 -0
- data/lib/mocha/impersonating_name.rb +13 -0
- data/lib/mocha/in_state_ordering_constraint.rb +2 -0
- data/lib/mocha/inspect.rb +13 -10
- data/lib/mocha/instance_method.rb +2 -0
- data/lib/mocha/integration/assertion_counter.rb +2 -0
- data/lib/mocha/integration/minitest/adapter.rb +3 -0
- data/lib/mocha/integration/minitest.rb +4 -3
- data/lib/mocha/integration/monkey_patcher.rb +4 -2
- data/lib/mocha/integration/test_unit/adapter.rb +3 -0
- data/lib/mocha/integration/test_unit.rb +4 -3
- data/lib/mocha/invocation.rb +9 -6
- data/lib/mocha/logger.rb +2 -0
- data/lib/mocha/macos_version.rb +2 -0
- data/lib/mocha/method_matcher.rb +2 -0
- data/lib/mocha/minitest.rb +2 -1
- data/lib/mocha/mock.rb +8 -8
- data/lib/mocha/mockery.rb +16 -6
- data/lib/mocha/name.rb +13 -0
- data/lib/mocha/not_initialized_error.rb +2 -0
- data/lib/mocha/object_methods.rb +7 -5
- data/lib/mocha/object_receiver.rb +20 -0
- data/lib/mocha/parameter_matchers/all_of.rb +5 -1
- data/lib/mocha/parameter_matchers/any_of.rb +5 -1
- data/lib/mocha/parameter_matchers/any_parameters.rb +5 -1
- data/lib/mocha/parameter_matchers/anything.rb +5 -1
- data/lib/mocha/parameter_matchers/base.rb +4 -2
- data/lib/mocha/parameter_matchers/equals.rb +5 -1
- data/lib/mocha/parameter_matchers/equivalent_uri.rb +5 -1
- data/lib/mocha/parameter_matchers/has_entries.rb +5 -1
- data/lib/mocha/parameter_matchers/has_entry.rb +6 -1
- data/lib/mocha/parameter_matchers/has_key.rb +6 -1
- data/lib/mocha/parameter_matchers/has_keys.rb +6 -2
- data/lib/mocha/parameter_matchers/has_value.rb +6 -1
- data/lib/mocha/parameter_matchers/includes.rb +8 -7
- data/lib/mocha/parameter_matchers/instance_methods.rb +4 -2
- data/lib/mocha/parameter_matchers/instance_of.rb +5 -1
- data/lib/mocha/parameter_matchers/is_a.rb +5 -1
- data/lib/mocha/parameter_matchers/kind_of.rb +5 -1
- data/lib/mocha/parameter_matchers/not.rb +5 -1
- data/lib/mocha/parameter_matchers/optionally.rb +6 -1
- data/lib/mocha/parameter_matchers/positional_or_keyword_hash.rb +41 -16
- data/lib/mocha/parameter_matchers/regexp_matches.rb +6 -1
- data/lib/mocha/parameter_matchers/responds_with.rb +5 -1
- data/lib/mocha/parameter_matchers/yaml_equivalent.rb +5 -1
- data/lib/mocha/parameter_matchers.rb +2 -0
- data/lib/mocha/parameters_matcher.rb +9 -1
- data/lib/mocha/raised_exception.rb +2 -0
- data/lib/mocha/return_values.rb +2 -0
- data/lib/mocha/ruby_version.rb +3 -0
- data/lib/mocha/sequence.rb +2 -0
- data/lib/mocha/single_return_value.rb +1 -1
- data/lib/mocha/state_machine.rb +2 -0
- data/lib/mocha/stubbed_method.rb +9 -2
- data/lib/mocha/stubbing_error.rb +2 -0
- data/lib/mocha/test_unit.rb +2 -1
- data/lib/mocha/thrower.rb +2 -0
- data/lib/mocha/thrown_object.rb +2 -0
- data/lib/mocha/version.rb +3 -1
- data/lib/mocha/yield_parameters.rb +2 -0
- data/lib/mocha.rb +5 -0
- data/mocha.gemspec +10 -4
- metadata +17 -15
- data/lib/mocha/debug.rb +0 -9
- data/lib/mocha/integration/minitest/exception_translation.rb +0 -14
- data/lib/mocha/is_a.rb +0 -7
- data/lib/mocha/names.rb +0 -43
- data/lib/mocha/receivers.rb +0 -45
data/lib/mocha/deprecation.rb
CHANGED
@@ -1,21 +1,27 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'mocha/backtrace_filter'
|
2
4
|
|
3
5
|
module Mocha
|
4
6
|
class Deprecation
|
5
|
-
class
|
6
|
-
|
7
|
-
|
8
|
-
def warning(*messages)
|
9
|
-
message = messages.join
|
10
|
-
@messages << message
|
11
|
-
return if mode == :disabled
|
7
|
+
class Logger
|
8
|
+
def warning(message)
|
12
9
|
filter = BacktraceFilter.new
|
13
10
|
location = filter.filtered(caller)[0]
|
14
11
|
warn "Mocha deprecation warning at #{location}: #{message}"
|
15
12
|
end
|
16
13
|
end
|
17
14
|
|
18
|
-
|
19
|
-
|
15
|
+
class << self
|
16
|
+
attr_writer :logger
|
17
|
+
|
18
|
+
def warning(message)
|
19
|
+
logger.call(message)
|
20
|
+
end
|
21
|
+
|
22
|
+
def logger
|
23
|
+
@logger || Logger.new
|
24
|
+
end
|
25
|
+
end
|
20
26
|
end
|
21
27
|
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Mocha
|
2
4
|
module Detection
|
3
5
|
module TestUnit
|
@@ -14,7 +16,8 @@ module Mocha
|
|
14
16
|
if testcase
|
15
17
|
begin
|
16
18
|
require 'test/unit/version'
|
17
|
-
rescue LoadError
|
19
|
+
rescue LoadError
|
20
|
+
warn "Unable to load 'test/unit/version', but continuing anyway" if $DEBUG
|
18
21
|
end
|
19
22
|
if defined?(::Test::Unit::VERSION)
|
20
23
|
version = ::Test::Unit::VERSION
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Mocha
|
2
4
|
class ExceptionRaiser
|
3
5
|
def initialize(exception, message)
|
@@ -9,6 +11,7 @@ module Mocha
|
|
9
11
|
invocation.raised(@exception)
|
10
12
|
raise @exception, @exception.to_s if @exception.is_a?(Module) && (@exception < Interrupt)
|
11
13
|
raise @exception, @message if @message
|
14
|
+
|
12
15
|
raise @exception
|
13
16
|
end
|
14
17
|
end
|
data/lib/mocha/expectation.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'ruby2_keywords'
|
2
4
|
require 'mocha/method_matcher'
|
3
5
|
require 'mocha/parameters_matcher'
|
@@ -6,23 +8,22 @@ require 'mocha/return_values'
|
|
6
8
|
require 'mocha/exception_raiser'
|
7
9
|
require 'mocha/thrower'
|
8
10
|
require 'mocha/yield_parameters'
|
9
|
-
require 'mocha/is_a'
|
10
11
|
require 'mocha/in_state_ordering_constraint'
|
11
12
|
require 'mocha/change_state_side_effect'
|
12
13
|
require 'mocha/cardinality'
|
13
14
|
require 'mocha/configuration'
|
14
|
-
require 'mocha/
|
15
|
+
require 'mocha/block_matchers'
|
15
16
|
require 'mocha/backtrace_filter'
|
16
17
|
|
17
18
|
module Mocha
|
18
19
|
# Methods on expectations returned from {Mock#expects}, {Mock#stubs}, {ObjectMethods#expects} and {ObjectMethods#stubs}.
|
19
20
|
class Expectation
|
20
|
-
# Modifies expectation so that the number of
|
21
|
+
# Modifies expectation so that the number of invocations of the expected method must be within a specified range or exactly equal to a specified number.
|
21
22
|
#
|
22
|
-
# @param [Range,Integer]
|
23
|
+
# @param [Range,Integer] range_or_number specifies the allowable range for the number of expected invocations or the specified number of expected invocations.
|
23
24
|
# @return [Expectation] the same expectation, thereby allowing invocations of other {Expectation} methods to be chained.
|
24
25
|
#
|
25
|
-
# @example Specifying
|
26
|
+
# @example Specifying an exact number of expected invocations.
|
26
27
|
# object = mock()
|
27
28
|
# object.expects(:expected_method).times(3)
|
28
29
|
# 3.times { object.expected_method }
|
@@ -33,7 +34,7 @@ module Mocha
|
|
33
34
|
# 2.times { object.expected_method }
|
34
35
|
# # => verify fails
|
35
36
|
#
|
36
|
-
# @example Specifying a range
|
37
|
+
# @example Specifying a range for the number of expected invocations.
|
37
38
|
# object = mock()
|
38
39
|
# object.expects(:expected_method).times(2..4)
|
39
40
|
# 3.times { object.expected_method }
|
@@ -43,12 +44,41 @@ module Mocha
|
|
43
44
|
# object.expects(:expected_method).times(2..4)
|
44
45
|
# object.expected_method
|
45
46
|
# # => verify fails
|
46
|
-
def times(
|
47
|
-
@cardinality.times(
|
47
|
+
def times(range_or_number)
|
48
|
+
@cardinality.times(range_or_number)
|
49
|
+
self
|
50
|
+
end
|
51
|
+
|
52
|
+
# Modifies expectation so that the expected method must be called exactly three times. This is equivalent to calling {#times} with an argument of +3+.
|
53
|
+
#
|
54
|
+
# @return [Expectation] the same expectation, thereby allowing invocations of other {Expectation} methods to be chained.
|
55
|
+
#
|
56
|
+
# @example Expected method must be invoked exactly three times.
|
57
|
+
# object = mock()
|
58
|
+
# object.expects(:expected_method).thrice
|
59
|
+
# object.expected_method
|
60
|
+
# object.expected_method
|
61
|
+
# object.expected_method
|
62
|
+
# # => verify succeeds
|
63
|
+
#
|
64
|
+
# object = mock()
|
65
|
+
# object.expects(:expected_method).thrice
|
66
|
+
# object.expected_method
|
67
|
+
# object.expected_method
|
68
|
+
# object.expected_method
|
69
|
+
# object.expected_method # => unexpected invocation
|
70
|
+
#
|
71
|
+
# object = mock()
|
72
|
+
# object.expects(:expected_method).thrice
|
73
|
+
# object.expected_method
|
74
|
+
# object.expected_method
|
75
|
+
# # => verify fails
|
76
|
+
def thrice
|
77
|
+
@cardinality.exactly(3)
|
48
78
|
self
|
49
79
|
end
|
50
80
|
|
51
|
-
# Modifies expectation so that the expected method must be called exactly twice.
|
81
|
+
# Modifies expectation so that the expected method must be called exactly twice. This is equivalent to calling {#times} with an argument of +2+.
|
52
82
|
#
|
53
83
|
# @return [Expectation] the same expectation, thereby allowing invocations of other {Expectation} methods to be chained.
|
54
84
|
#
|
@@ -74,7 +104,7 @@ module Mocha
|
|
74
104
|
self
|
75
105
|
end
|
76
106
|
|
77
|
-
# Modifies expectation so that the expected method must be called exactly once.
|
107
|
+
# Modifies expectation so that the expected method must be called exactly once. This is equivalent to calling {#times} with an argument of +1+.
|
78
108
|
#
|
79
109
|
# Note that this is the default behaviour for an expectation, but you may wish to use it for clarity/emphasis.
|
80
110
|
#
|
@@ -136,7 +166,7 @@ module Mocha
|
|
136
166
|
self
|
137
167
|
end
|
138
168
|
|
139
|
-
# Modifies expectation so that the expected method must be called at least once.
|
169
|
+
# Modifies expectation so that the expected method must be called at least once. This is equivalent to calling {#at_least} with an argument of +1+.
|
140
170
|
#
|
141
171
|
# @return [Expectation] the same expectation, thereby allowing invocations of other {Expectation} methods to be chained.
|
142
172
|
#
|
@@ -172,7 +202,7 @@ module Mocha
|
|
172
202
|
self
|
173
203
|
end
|
174
204
|
|
175
|
-
# Modifies expectation so that the expected method must be called at most once.
|
205
|
+
# Modifies expectation so that the expected method must be called at most once. This is equivalent to calling {#at_most} with an argument of +1+.
|
176
206
|
#
|
177
207
|
# @return [Expectation] the same expectation, thereby allowing invocations of other {Expectation} methods to be chained.
|
178
208
|
#
|
@@ -200,9 +230,9 @@ module Mocha
|
|
200
230
|
#
|
201
231
|
# Positional arguments were separated from keyword arguments in Ruby v3 (see {https://www.ruby-lang.org/en/news/2019/12/12/separation-of-positional-and-keyword-arguments-in-ruby-3-0 this article}). In relation to this a new configuration option ({Configuration#strict_keyword_argument_matching=}) is available in Ruby >= 2.7.
|
202
232
|
#
|
203
|
-
# When {Configuration#strict_keyword_argument_matching=} is set to +false+ (which is
|
233
|
+
# When {Configuration#strict_keyword_argument_matching=} is set to +false+ (which is the default in Ruby v2.7), a positional +Hash+ and a set of keyword arguments passed to {#with} are treated the same for the purposes of parameter matching. However, a deprecation warning will be displayed if a positional +Hash+ matches a set of keyword arguments or vice versa.
|
204
234
|
#
|
205
|
-
# When {Configuration#strict_keyword_argument_matching=} is set to +true
|
235
|
+
# When {Configuration#strict_keyword_argument_matching=} is set to +true+ (which is the default in Ruby >= v3.0), an actual positional +Hash+ will not match an expected set of keyword arguments; and vice versa, an actual set of keyword arguments will not match an expected positional +Hash+, i.e. the parameter matching is stricter.
|
206
236
|
#
|
207
237
|
# @see ParameterMatchers
|
208
238
|
# @see Configuration#strict_keyword_argument_matching=
|
@@ -235,7 +265,11 @@ module Mocha
|
|
235
265
|
# object.expected_method(['string1'], 'any-old-value')
|
236
266
|
# # => verify fails
|
237
267
|
#
|
238
|
-
# @example Loose keyword argument matching (default)
|
268
|
+
# @example Loose keyword argument matching (default in Ruby v2.7).
|
269
|
+
#
|
270
|
+
# Mocha.configure do |c|
|
271
|
+
# c.strict_keyword_argument_matching = false
|
272
|
+
# end
|
239
273
|
#
|
240
274
|
# class Example
|
241
275
|
# def foo(a, bar:); end
|
@@ -246,7 +280,7 @@ module Mocha
|
|
246
280
|
# example.foo('a', { bar: 'b' })
|
247
281
|
# # This passes the test, but would result in an ArgumentError in practice
|
248
282
|
#
|
249
|
-
# @example Strict keyword argument matching
|
283
|
+
# @example Strict keyword argument matching (default in Ruby >= 3.0).
|
250
284
|
#
|
251
285
|
# Mocha.configure do |c|
|
252
286
|
# c.strict_keyword_argument_matching = true
|
@@ -711,19 +745,19 @@ module Mocha
|
|
711
745
|
|
712
746
|
# @private
|
713
747
|
def mocha_inspect
|
714
|
-
|
715
|
-
|
748
|
+
strings = ["#{@cardinality.anticipated_times}, #{@cardinality.invoked_times}: #{method_signature}"]
|
749
|
+
strings << "; #{@ordering_constraints.map(&:mocha_inspect).join('; ')}" unless @ordering_constraints.empty?
|
716
750
|
if Mocha.configuration.display_matching_invocations_on_failure?
|
717
|
-
|
751
|
+
strings << @cardinality.actual_invocations
|
718
752
|
end
|
719
|
-
|
753
|
+
strings.join
|
720
754
|
end
|
721
755
|
|
722
756
|
# @private
|
723
757
|
def method_signature
|
724
|
-
|
725
|
-
|
726
|
-
|
758
|
+
strings = ["#{@mock.mocha_inspect}.#{@method_matcher.mocha_inspect}#{@parameters_matcher.mocha_inspect}"]
|
759
|
+
strings << " #{@block_matcher.mocha_inspect}" if @block_matcher.mocha_inspect
|
760
|
+
strings.join
|
727
761
|
end
|
728
762
|
|
729
763
|
# @private
|
data/lib/mocha/hooks.rb
CHANGED
data/lib/mocha/inspect.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'date'
|
2
4
|
|
3
5
|
module Mocha
|
@@ -11,7 +13,7 @@ module Mocha
|
|
11
13
|
end
|
12
14
|
|
13
15
|
module ArrayMethods
|
14
|
-
def mocha_inspect(wrapped
|
16
|
+
def mocha_inspect(wrapped: true)
|
15
17
|
unwrapped = collect(&:mocha_inspect).join(', ')
|
16
18
|
wrapped ? "[#{unwrapped}]" : unwrapped
|
17
19
|
end
|
@@ -19,17 +21,18 @@ module Mocha
|
|
19
21
|
|
20
22
|
module HashMethods
|
21
23
|
def mocha_inspect
|
24
|
+
unwrapped = collect do |key, value|
|
25
|
+
case key
|
26
|
+
when Symbol
|
27
|
+
"#{key}: #{value.mocha_inspect}"
|
28
|
+
else
|
29
|
+
"#{key.mocha_inspect} => #{value.mocha_inspect}"
|
30
|
+
end
|
31
|
+
end.join(', ')
|
32
|
+
|
22
33
|
if Hash.ruby2_keywords_hash?(self)
|
23
|
-
|
24
|
-
case key
|
25
|
-
when Symbol
|
26
|
-
"#{key}: #{value.mocha_inspect}"
|
27
|
-
else
|
28
|
-
"#{key.mocha_inspect} => #{value.mocha_inspect}"
|
29
|
-
end
|
30
|
-
end.join(', ')
|
34
|
+
empty? ? '**{}' : unwrapped
|
31
35
|
else
|
32
|
-
unwrapped = collect { |key, value| "#{key.mocha_inspect} => #{value.mocha_inspect}" }.join(', ')
|
33
36
|
"{#{unwrapped}}"
|
34
37
|
end
|
35
38
|
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'mocha/api'
|
2
4
|
require 'mocha/integration/assertion_counter'
|
3
5
|
require 'mocha/expectation_error_factory'
|
@@ -35,6 +37,7 @@ module Mocha
|
|
35
37
|
# @private
|
36
38
|
def before_teardown
|
37
39
|
return unless passed?
|
40
|
+
|
38
41
|
assertion_counter = Integration::AssertionCounter.new(self)
|
39
42
|
mocha_verify(assertion_counter)
|
40
43
|
ensure
|
@@ -1,4 +1,5 @@
|
|
1
|
-
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
2
3
|
require 'mocha/detection/minitest'
|
3
4
|
require 'mocha/integration/minitest/adapter'
|
4
5
|
|
@@ -10,14 +11,14 @@ module Mocha
|
|
10
11
|
return false unless target
|
11
12
|
|
12
13
|
minitest_version = Gem::Version.new(Detection::Minitest.version)
|
13
|
-
|
14
|
+
warn "Detected Minitest version: #{minitest_version}" if $DEBUG
|
14
15
|
|
15
16
|
unless Minitest::Adapter.applicable_to?(minitest_version)
|
16
17
|
raise 'Versions of minitest earlier than v3.3.0 are not supported.'
|
17
18
|
end
|
18
19
|
|
19
20
|
unless target < Minitest::Adapter
|
20
|
-
|
21
|
+
warn "Applying #{Minitest::Adapter.description}" if $DEBUG
|
21
22
|
target.send(:include, Minitest::Adapter)
|
22
23
|
end
|
23
24
|
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'mocha/api'
|
2
4
|
|
3
5
|
module Mocha
|
@@ -5,12 +7,12 @@ module Mocha
|
|
5
7
|
module MonkeyPatcher
|
6
8
|
def self.apply(mod, run_method_patch)
|
7
9
|
if mod < Mocha::API
|
8
|
-
|
10
|
+
warn "Mocha::API already included in #{mod}" if $DEBUG
|
9
11
|
else
|
10
12
|
mod.send(:include, Mocha::API)
|
11
13
|
end
|
12
14
|
if mod.method_defined?(:run_before_mocha)
|
13
|
-
|
15
|
+
warn "#{mod}#run_before_mocha method already defined" if $DEBUG
|
14
16
|
elsif mod.method_defined?(:run)
|
15
17
|
mod.send(:alias_method, :run_before_mocha, :run)
|
16
18
|
mod.send(:remove_method, :run)
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'mocha/api'
|
2
4
|
require 'mocha/integration/assertion_counter'
|
3
5
|
require 'mocha/expectation_error'
|
@@ -45,6 +47,7 @@ module Mocha
|
|
45
47
|
# @private
|
46
48
|
def handle_mocha_expectation_error(exception)
|
47
49
|
return false unless exception.is_a?(Mocha::ExpectationError)
|
50
|
+
|
48
51
|
problem_occurred
|
49
52
|
add_failure(exception.message, exception.backtrace)
|
50
53
|
true
|
@@ -1,4 +1,5 @@
|
|
1
|
-
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
2
3
|
require 'mocha/detection/test_unit'
|
3
4
|
require 'mocha/integration/test_unit/adapter'
|
4
5
|
|
@@ -10,14 +11,14 @@ module Mocha
|
|
10
11
|
return false unless target
|
11
12
|
|
12
13
|
test_unit_version = Gem::Version.new(Detection::TestUnit.version)
|
13
|
-
|
14
|
+
warn "Detected Test::Unit version: #{test_unit_version}" if $DEBUG
|
14
15
|
|
15
16
|
unless TestUnit::Adapter.applicable_to?(test_unit_version)
|
16
17
|
raise 'Versions of test-unit earlier than v2.5.1 are not supported.'
|
17
18
|
end
|
18
19
|
|
19
20
|
unless target < TestUnit::Adapter
|
20
|
-
|
21
|
+
warn "Applying #{TestUnit::Adapter.description}" if $DEBUG
|
21
22
|
target.send(:include, TestUnit::Adapter)
|
22
23
|
end
|
23
24
|
|
data/lib/mocha/invocation.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'mocha/parameters_matcher'
|
2
4
|
require 'mocha/raised_exception'
|
3
5
|
require 'mocha/return_values'
|
@@ -21,6 +23,7 @@ module Mocha
|
|
21
23
|
yield_parameters.next_invocation.each do |yield_args|
|
22
24
|
@yields << ParametersMatcher.new(yield_args)
|
23
25
|
raise LocalJumpError unless @block
|
26
|
+
|
24
27
|
@block.call(*yield_args)
|
25
28
|
end
|
26
29
|
return_values.next(self)
|
@@ -43,9 +46,9 @@ module Mocha
|
|
43
46
|
end
|
44
47
|
|
45
48
|
def call_description
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
+
strings = ["#{@mock.mocha_inspect}.#{@method_name}#{argument_description}"]
|
50
|
+
strings << ' { ... }' unless @block.nil?
|
51
|
+
strings.join
|
49
52
|
end
|
50
53
|
|
51
54
|
def short_call_description
|
@@ -53,9 +56,9 @@ module Mocha
|
|
53
56
|
end
|
54
57
|
|
55
58
|
def result_description
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
+
strings = ["# => #{@result.mocha_inspect}"]
|
60
|
+
strings << " after yielding #{@yields.map(&:mocha_inspect).join(', then ')}" if @yields.any?
|
61
|
+
strings.join
|
59
62
|
end
|
60
63
|
|
61
64
|
def full_description
|
data/lib/mocha/logger.rb
CHANGED
data/lib/mocha/macos_version.rb
CHANGED
data/lib/mocha/method_matcher.rb
CHANGED
data/lib/mocha/minitest.rb
CHANGED
data/lib/mocha/mock.rb
CHANGED
@@ -1,9 +1,11 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'ruby2_keywords'
|
2
4
|
require 'mocha/expectation'
|
3
5
|
require 'mocha/expectation_list'
|
4
6
|
require 'mocha/invocation'
|
5
|
-
require 'mocha/
|
6
|
-
require 'mocha/
|
7
|
+
require 'mocha/default_name'
|
8
|
+
require 'mocha/default_receiver'
|
7
9
|
require 'mocha/method_matcher'
|
8
10
|
require 'mocha/parameters_matcher'
|
9
11
|
require 'mocha/argument_iterator'
|
@@ -114,8 +116,7 @@ module Mocha
|
|
114
116
|
def expects(method_name_or_hash, backtrace = nil)
|
115
117
|
expectation = nil
|
116
118
|
iterator = ArgumentIterator.new(method_name_or_hash)
|
117
|
-
iterator.each do
|
118
|
-
method_name = args.shift
|
119
|
+
iterator.each do |method_name, *args|
|
119
120
|
ensure_method_not_already_defined(method_name)
|
120
121
|
expectation = Expectation.new(self, method_name, backtrace)
|
121
122
|
expectation.in_sequence(@mockery.sequences.last) if @mockery.sequences.any?
|
@@ -153,8 +154,7 @@ module Mocha
|
|
153
154
|
def stubs(method_name_or_hash, backtrace = nil)
|
154
155
|
expectation = nil
|
155
156
|
iterator = ArgumentIterator.new(method_name_or_hash)
|
156
|
-
iterator.each do
|
157
|
-
method_name = args.shift
|
157
|
+
iterator.each do |method_name, *args|
|
158
158
|
ensure_method_not_already_defined(method_name)
|
159
159
|
expectation = Expectation.new(self, method_name, backtrace)
|
160
160
|
expectation.at_least(0)
|
@@ -315,13 +315,13 @@ module Mocha
|
|
315
315
|
end
|
316
316
|
|
317
317
|
# @private
|
318
|
-
def method_missing(symbol, *arguments, &block)
|
318
|
+
def method_missing(symbol, *arguments, &block)
|
319
319
|
handle_method_call(symbol, arguments, block)
|
320
320
|
end
|
321
321
|
ruby2_keywords(:method_missing)
|
322
322
|
|
323
323
|
# @private
|
324
|
-
def handle_method_call(symbol, arguments, block)
|
324
|
+
def handle_method_call(symbol, arguments, block)
|
325
325
|
check_expiry
|
326
326
|
check_responder_responds_to(symbol)
|
327
327
|
invocation = Invocation.new(self, symbol, arguments, block)
|
data/lib/mocha/mockery.rb
CHANGED
@@ -1,7 +1,12 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'mocha/central'
|
2
4
|
require 'mocha/mock'
|
3
|
-
require 'mocha/
|
4
|
-
require 'mocha/
|
5
|
+
require 'mocha/name'
|
6
|
+
require 'mocha/impersonating_name'
|
7
|
+
require 'mocha/impersonating_any_instance_name'
|
8
|
+
require 'mocha/object_receiver'
|
9
|
+
require 'mocha/any_instance_receiver'
|
5
10
|
require 'mocha/state_machine'
|
6
11
|
require 'mocha/logger'
|
7
12
|
require 'mocha/configuration'
|
@@ -49,9 +54,13 @@ module Mocha
|
|
49
54
|
end
|
50
55
|
|
51
56
|
def teardown(origin = nil)
|
57
|
+
if @instances.nil?
|
58
|
+
raise NotInitializedError, 'Mocha::Mockery.teardown called before Mocha::Mockery.setup'
|
59
|
+
end
|
60
|
+
|
52
61
|
instance.teardown(origin)
|
53
62
|
ensure
|
54
|
-
@instances.pop
|
63
|
+
@instances.pop unless @instances.nil?
|
55
64
|
end
|
56
65
|
end
|
57
66
|
|
@@ -124,12 +133,11 @@ module Mocha
|
|
124
133
|
def on_stubbing(object, method)
|
125
134
|
signature_proc = lambda { "#{object.mocha_inspect}.#{method}" }
|
126
135
|
check(:stubbing_non_existent_method, 'non-existent method', signature_proc) do
|
127
|
-
!(object.stubba_class.__method_exists__?(method
|
136
|
+
!(object.stubba_class.__method_exists__?(method) || object.respond_to?(method))
|
128
137
|
end
|
129
138
|
check(:stubbing_non_public_method, 'non-public method', signature_proc) do
|
130
|
-
object.stubba_class.__method_exists__?(method, false)
|
139
|
+
object.stubba_class.__method_exists__?(method, include_public_methods: false)
|
131
140
|
end
|
132
|
-
check(:stubbing_method_on_nil, 'method on nil', signature_proc) { object.nil? }
|
133
141
|
check(:stubbing_method_on_non_mock_object, 'method on non-mock object', signature_proc)
|
134
142
|
end
|
135
143
|
|
@@ -144,9 +152,11 @@ module Mocha
|
|
144
152
|
def check(action, description, signature_proc, backtrace = caller)
|
145
153
|
treatment = Mocha.configuration.send(action)
|
146
154
|
return if (treatment == :allow) || (block_given? && !yield)
|
155
|
+
|
147
156
|
method_signature = signature_proc.call
|
148
157
|
message = "stubbing #{description}: #{method_signature}"
|
149
158
|
raise StubbingError.new(message, backtrace) if treatment == :prevent
|
159
|
+
|
150
160
|
logger.warn(message) if treatment == :warn
|
151
161
|
end
|
152
162
|
|