mocha 1.1.0 → 2.0.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/.github/FUNDING.yml +1 -0
- data/.rubocop.yml +65 -0
- data/.rubocop_todo.yml +27 -0
- data/.yardopts +1 -0
- data/CONTRIBUTING.md +4 -9
- data/Gemfile +27 -0
- data/README.md +120 -28
- data/RELEASE.md +351 -1
- data/Rakefile +60 -43
- data/gemfiles/Gemfile.minitest.latest +1 -0
- data/gemfiles/Gemfile.test-unit.latest +1 -0
- data/lib/mocha/any_instance_method.rb +9 -74
- data/lib/mocha/api.rb +85 -69
- data/lib/mocha/argument_iterator.rb +4 -8
- data/lib/mocha/backtrace_filter.rb +1 -5
- data/lib/mocha/block_matcher.rb +31 -0
- data/lib/mocha/cardinality.rb +60 -49
- data/lib/mocha/central.rb +21 -12
- data/lib/mocha/change_state_side_effect.rb +0 -4
- data/lib/mocha/class_methods.rb +19 -20
- data/lib/mocha/configuration.rb +312 -47
- data/lib/mocha/debug.rb +3 -2
- data/lib/mocha/deprecation.rb +8 -11
- data/lib/mocha/detection/mini_test.rb +0 -2
- data/lib/mocha/detection/test_unit.rb +3 -5
- data/lib/mocha/error_with_filtered_backtrace.rb +13 -0
- data/lib/mocha/exception_raiser.rb +4 -6
- data/lib/mocha/expectation.rb +186 -95
- data/lib/mocha/expectation_error.rb +1 -1
- data/lib/mocha/expectation_error_factory.rb +0 -1
- data/lib/mocha/expectation_list.rb +7 -11
- data/lib/mocha/hooks.rb +1 -3
- data/lib/mocha/in_state_ordering_constraint.rb +0 -4
- data/lib/mocha/inspect.rb +30 -38
- data/lib/mocha/instance_method.rb +11 -8
- data/lib/mocha/integration/mini_test/adapter.rb +2 -4
- data/lib/mocha/integration/mini_test/exception_translation.rb +1 -1
- data/lib/mocha/integration/mini_test.rb +10 -31
- data/lib/mocha/integration/monkey_patcher.rb +8 -2
- data/lib/mocha/integration/test_unit/adapter.rb +5 -6
- data/lib/mocha/integration/test_unit.rb +10 -26
- data/lib/mocha/invocation.rb +73 -0
- data/lib/mocha/is_a.rb +0 -2
- data/lib/mocha/logger.rb +0 -4
- data/lib/mocha/macos_version.rb +5 -0
- data/lib/mocha/method_matcher.rb +1 -5
- data/lib/mocha/minitest.rb +6 -0
- data/lib/mocha/mock.rb +105 -57
- data/lib/mocha/mockery.rb +70 -98
- data/lib/mocha/names.rb +2 -12
- data/lib/mocha/not_initialized_error.rb +7 -0
- data/lib/mocha/object_methods.rb +25 -31
- data/lib/mocha/parameter_matchers/all_of.rb +2 -8
- data/lib/mocha/parameter_matchers/any_of.rb +2 -8
- data/lib/mocha/parameter_matchers/any_parameters.rb +3 -9
- data/lib/mocha/parameter_matchers/anything.rb +2 -8
- data/lib/mocha/parameter_matchers/base.rb +7 -13
- data/lib/mocha/parameter_matchers/equals.rb +1 -7
- data/lib/mocha/parameter_matchers/{query_string.rb → equivalent_uri.rb} +14 -15
- data/lib/mocha/parameter_matchers/has_entries.rb +2 -7
- data/lib/mocha/parameter_matchers/has_entry.rb +26 -21
- data/lib/mocha/parameter_matchers/has_key.rb +2 -7
- data/lib/mocha/parameter_matchers/has_keys.rb +53 -0
- data/lib/mocha/parameter_matchers/has_value.rb +2 -7
- data/lib/mocha/parameter_matchers/includes.rb +50 -8
- data/lib/mocha/parameter_matchers/instance_methods.rb +27 -0
- data/lib/mocha/parameter_matchers/instance_of.rb +0 -6
- data/lib/mocha/parameter_matchers/is_a.rb +2 -7
- data/lib/mocha/parameter_matchers/kind_of.rb +2 -6
- data/lib/mocha/parameter_matchers/not.rb +2 -7
- data/lib/mocha/parameter_matchers/optionally.rb +4 -10
- data/lib/mocha/parameter_matchers/positional_or_keyword_hash.rb +64 -0
- data/lib/mocha/parameter_matchers/regexp_matches.rb +0 -6
- data/lib/mocha/parameter_matchers/responds_with.rb +3 -8
- data/lib/mocha/parameter_matchers/yaml_equivalent.rb +2 -6
- data/lib/mocha/parameter_matchers.rb +3 -4
- data/lib/mocha/parameters_matcher.rb +8 -11
- data/lib/mocha/raised_exception.rb +11 -0
- data/lib/mocha/receivers.rb +10 -14
- data/lib/mocha/return_values.rb +4 -8
- data/lib/mocha/ruby_version.rb +3 -0
- data/lib/mocha/sequence.rb +4 -9
- data/lib/mocha/single_return_value.rb +2 -5
- data/lib/mocha/state_machine.rb +33 -46
- data/lib/mocha/stubbed_method.rb +88 -0
- data/lib/mocha/stubbing_error.rb +2 -13
- data/lib/mocha/test_unit.rb +5 -2
- data/lib/mocha/thrower.rb +4 -6
- data/lib/mocha/thrown_object.rb +12 -0
- data/lib/mocha/version.rb +1 -1
- data/lib/mocha/yield_parameters.rb +7 -17
- data/mocha.gemspec +16 -43
- data/yard-templates/default/layout/html/google_analytics.erb +6 -9
- data/yard-templates/default/layout/html/setup.rb +2 -3
- metadata +38 -246
- data/bin/build-matrix +0 -71
- data/gemfiles/Gemfile.minitest.1.3.0 +0 -7
- data/gemfiles/Gemfile.minitest.1.4.0 +0 -7
- data/gemfiles/Gemfile.minitest.1.4.1 +0 -7
- data/gemfiles/Gemfile.minitest.1.4.2 +0 -7
- data/gemfiles/Gemfile.minitest.2.0.0 +0 -7
- data/gemfiles/Gemfile.minitest.2.0.1 +0 -7
- data/gemfiles/Gemfile.minitest.2.11.0 +0 -7
- data/gemfiles/Gemfile.minitest.2.11.2 +0 -7
- data/gemfiles/Gemfile.minitest.2.3.0 +0 -7
- data/gemfiles/Gemfile.test-unit.2.0.0 +0 -7
- data/gemfiles/Gemfile.test-unit.2.0.1 +0 -7
- data/gemfiles/Gemfile.test-unit.2.0.3 +0 -7
- data/init.rb +0 -3
- data/lib/mocha/class_method.rb +0 -127
- data/lib/mocha/integration/mini_test/nothing.rb +0 -19
- data/lib/mocha/integration/mini_test/version_13.rb +0 -51
- data/lib/mocha/integration/mini_test/version_140.rb +0 -51
- data/lib/mocha/integration/mini_test/version_141.rb +0 -62
- data/lib/mocha/integration/mini_test/version_142_to_172.rb +0 -62
- data/lib/mocha/integration/mini_test/version_200.rb +0 -63
- data/lib/mocha/integration/mini_test/version_201_to_222.rb +0 -63
- data/lib/mocha/integration/mini_test/version_2110_to_2111.rb +0 -67
- data/lib/mocha/integration/mini_test/version_2112_to_320.rb +0 -70
- data/lib/mocha/integration/mini_test/version_230_to_2101.rb +0 -65
- data/lib/mocha/integration/test_unit/gem_version_200.rb +0 -59
- data/lib/mocha/integration/test_unit/gem_version_201_to_202.rb +0 -59
- data/lib/mocha/integration/test_unit/gem_version_203_to_220.rb +0 -59
- data/lib/mocha/integration/test_unit/gem_version_230_to_250.rb +0 -65
- data/lib/mocha/integration/test_unit/nothing.rb +0 -19
- data/lib/mocha/integration/test_unit/ruby_version_185_and_below.rb +0 -58
- data/lib/mocha/integration/test_unit/ruby_version_186_and_above.rb +0 -60
- data/lib/mocha/integration.rb +0 -14
- data/lib/mocha/mini_test.rb +0 -3
- data/lib/mocha/module_method.rb +0 -16
- data/lib/mocha/module_methods.rb +0 -14
- data/lib/mocha/multiple_yields.rb +0 -20
- data/lib/mocha/no_yields.rb +0 -11
- data/lib/mocha/parameter_matchers/object.rb +0 -17
- data/lib/mocha/pretty_parameters.rb +0 -28
- data/lib/mocha/setup.rb +0 -9
- data/lib/mocha/single_yield.rb +0 -18
- data/lib/mocha/standalone.rb +0 -4
- data/lib/mocha/unexpected_invocation.rb +0 -26
- data/lib/mocha_standalone.rb +0 -4
- data/test/acceptance/acceptance_test_helper.rb +0 -41
- data/test/acceptance/bug_18914_test.rb +0 -43
- data/test/acceptance/bug_21465_test.rb +0 -34
- data/test/acceptance/bug_21563_test.rb +0 -25
- data/test/acceptance/exception_rescue_test.rb +0 -55
- data/test/acceptance/expectations_on_multiple_methods_test.rb +0 -55
- data/test/acceptance/expected_invocation_count_test.rb +0 -232
- data/test/acceptance/failure_messages_test.rb +0 -64
- data/test/acceptance/issue_65_test.rb +0 -63
- data/test/acceptance/issue_70_test.rb +0 -55
- data/test/acceptance/mocha_example_test.rb +0 -98
- data/test/acceptance/mocha_test_result_test.rb +0 -84
- data/test/acceptance/mock_test.rb +0 -100
- data/test/acceptance/mock_with_initializer_block_test.rb +0 -51
- data/test/acceptance/mocked_methods_dispatch_test.rb +0 -78
- data/test/acceptance/multiple_expectations_failure_message_test.rb +0 -68
- data/test/acceptance/optional_parameters_test.rb +0 -70
- data/test/acceptance/parameter_matcher_test.rb +0 -337
- data/test/acceptance/partial_mocks_test.rb +0 -47
- data/test/acceptance/prepend_test.rb +0 -88
- data/test/acceptance/raise_exception_test.rb +0 -39
- data/test/acceptance/return_value_test.rb +0 -52
- data/test/acceptance/sequence_test.rb +0 -192
- data/test/acceptance/states_test.rb +0 -70
- data/test/acceptance/stub_any_instance_method_defined_on_superclass_test.rb +0 -34
- data/test/acceptance/stub_any_instance_method_test.rb +0 -238
- data/test/acceptance/stub_class_method_defined_on_active_record_association_proxy_test.rb +0 -106
- data/test/acceptance/stub_class_method_defined_on_class_test.rb +0 -78
- data/test/acceptance/stub_class_method_defined_on_module_test.rb +0 -75
- data/test/acceptance/stub_class_method_defined_on_superclass_test.rb +0 -112
- data/test/acceptance/stub_everything_test.rb +0 -56
- data/test/acceptance/stub_instance_method_defined_on_active_record_association_proxy_test.rb +0 -93
- data/test/acceptance/stub_instance_method_defined_on_class_and_aliased_test.rb +0 -69
- data/test/acceptance/stub_instance_method_defined_on_class_test.rb +0 -69
- data/test/acceptance/stub_instance_method_defined_on_kernel_module_test.rb +0 -75
- data/test/acceptance/stub_instance_method_defined_on_module_test.rb +0 -75
- data/test/acceptance/stub_instance_method_defined_on_object_class_test.rb +0 -75
- data/test/acceptance/stub_instance_method_defined_on_singleton_class_test.rb +0 -70
- data/test/acceptance/stub_instance_method_defined_on_superclass_test.rb +0 -72
- data/test/acceptance/stub_module_method_test.rb +0 -163
- data/test/acceptance/stub_test.rb +0 -52
- data/test/acceptance/stubba_example_test.rb +0 -102
- data/test/acceptance/stubba_test_result_test.rb +0 -66
- data/test/acceptance/stubbing_error_backtrace_test.rb +0 -64
- data/test/acceptance/stubbing_frozen_object_test.rb +0 -88
- data/test/acceptance/stubbing_method_accepting_block_parameter_test.rb +0 -48
- data/test/acceptance/stubbing_method_unnecessarily_test.rb +0 -65
- data/test/acceptance/stubbing_nil_test.rb +0 -59
- data/test/acceptance/stubbing_non_existent_any_instance_method_test.rb +0 -130
- data/test/acceptance/stubbing_non_existent_class_method_test.rb +0 -157
- data/test/acceptance/stubbing_non_existent_instance_method_test.rb +0 -147
- data/test/acceptance/stubbing_non_public_any_instance_method_test.rb +0 -130
- data/test/acceptance/stubbing_non_public_class_method_test.rb +0 -163
- data/test/acceptance/stubbing_non_public_instance_method_test.rb +0 -143
- data/test/acceptance/stubbing_on_non_mock_object_test.rb +0 -64
- data/test/acceptance/stubbing_same_class_method_on_parent_and_child_classes_test.rb +0 -35
- data/test/acceptance/throw_test.rb +0 -45
- data/test/acceptance/unexpected_invocation_test.rb +0 -25
- data/test/acceptance/unstubbing_test.rb +0 -168
- data/test/assertions.rb +0 -6
- data/test/deprecation_disabler.rb +0 -15
- data/test/execution_point.rb +0 -36
- data/test/integration/mini_test_test.rb +0 -8
- data/test/integration/shared_tests.rb +0 -174
- data/test/integration/test_unit_test.rb +0 -8
- data/test/method_definer.rb +0 -24
- data/test/mini_test_result.rb +0 -90
- data/test/minitest_result.rb +0 -49
- data/test/simple_counter.rb +0 -13
- data/test/test_helper.rb +0 -50
- data/test/test_runner.rb +0 -58
- data/test/test_unit_result.rb +0 -20
- data/test/unit/any_instance_method_test.rb +0 -132
- data/test/unit/array_inspect_test.rb +0 -16
- data/test/unit/backtrace_filter_test.rb +0 -19
- data/test/unit/cardinality_test.rb +0 -56
- data/test/unit/central_test.rb +0 -100
- data/test/unit/change_state_side_effect_test.rb +0 -41
- data/test/unit/class_method_test.rb +0 -223
- data/test/unit/class_methods_test.rb +0 -40
- data/test/unit/configuration_test.rb +0 -38
- data/test/unit/date_time_inspect_test.rb +0 -21
- data/test/unit/exception_raiser_test.rb +0 -42
- data/test/unit/expectation_list_test.rb +0 -82
- data/test/unit/expectation_test.rb +0 -497
- data/test/unit/hash_inspect_test.rb +0 -16
- data/test/unit/hooks_test.rb +0 -29
- data/test/unit/in_state_ordering_constraint_test.rb +0 -43
- data/test/unit/method_matcher_test.rb +0 -28
- data/test/unit/mock_test.rb +0 -341
- data/test/unit/mockery_test.rb +0 -151
- data/test/unit/module_methods_test.rb +0 -19
- data/test/unit/multiple_yields_test.rb +0 -18
- data/test/unit/no_yields_test.rb +0 -18
- data/test/unit/object_inspect_test.rb +0 -38
- data/test/unit/object_methods_test.rb +0 -46
- data/test/unit/parameter_matchers/all_of_test.rb +0 -26
- data/test/unit/parameter_matchers/any_of_test.rb +0 -26
- data/test/unit/parameter_matchers/anything_test.rb +0 -21
- data/test/unit/parameter_matchers/equals_test.rb +0 -25
- data/test/unit/parameter_matchers/has_entries_test.rb +0 -51
- data/test/unit/parameter_matchers/has_entry_test.rb +0 -129
- data/test/unit/parameter_matchers/has_key_test.rb +0 -55
- data/test/unit/parameter_matchers/has_value_test.rb +0 -57
- data/test/unit/parameter_matchers/includes_test.rb +0 -59
- data/test/unit/parameter_matchers/instance_of_test.rb +0 -25
- data/test/unit/parameter_matchers/is_a_test.rb +0 -25
- data/test/unit/parameter_matchers/kind_of_test.rb +0 -25
- data/test/unit/parameter_matchers/not_test.rb +0 -26
- data/test/unit/parameter_matchers/regexp_matches_test.rb +0 -46
- data/test/unit/parameter_matchers/responds_with_test.rb +0 -32
- data/test/unit/parameter_matchers/stub_matcher.rb +0 -27
- data/test/unit/parameter_matchers/yaml_equivalent_test.rb +0 -25
- data/test/unit/parameters_matcher_test.rb +0 -121
- data/test/unit/receivers_test.rb +0 -66
- data/test/unit/return_values_test.rb +0 -63
- data/test/unit/sequence_test.rb +0 -104
- data/test/unit/single_return_value_test.rb +0 -14
- data/test/unit/single_yield_test.rb +0 -18
- data/test/unit/state_machine_test.rb +0 -98
- data/test/unit/string_inspect_test.rb +0 -11
- data/test/unit/thrower_test.rb +0 -20
- data/test/unit/yield_parameters_test.rb +0 -93
data/lib/mocha/object_methods.rb
CHANGED
@@ -4,18 +4,20 @@ require 'mocha/argument_iterator'
|
|
4
4
|
require 'mocha/expectation_error_factory'
|
5
5
|
|
6
6
|
module Mocha
|
7
|
-
|
8
7
|
# Methods added to all objects to allow mocking and stubbing on real (i.e. non-mock) objects.
|
9
8
|
#
|
10
9
|
# Both {#expects} and {#stubs} return an {Expectation} which can be further modified by methods on {Expectation}.
|
11
10
|
module ObjectMethods
|
12
|
-
|
13
11
|
# @private
|
14
12
|
alias_method :_method, :method
|
15
13
|
|
16
14
|
# @private
|
17
|
-
def mocha
|
18
|
-
|
15
|
+
def mocha(instantiate = true)
|
16
|
+
if instantiate
|
17
|
+
@mocha ||= Mocha::Mockery.instance.mock_impersonating(self)
|
18
|
+
else
|
19
|
+
defined?(@mocha) ? @mocha : nil
|
20
|
+
end
|
19
21
|
end
|
20
22
|
|
21
23
|
# @private
|
@@ -33,17 +35,22 @@ module Mocha
|
|
33
35
|
self
|
34
36
|
end
|
35
37
|
|
38
|
+
# @private
|
39
|
+
def stubba_class
|
40
|
+
singleton_class
|
41
|
+
end
|
42
|
+
|
36
43
|
# Adds an expectation that the specified method must be called exactly once with any parameters.
|
37
44
|
#
|
38
45
|
# The original implementation of the method is replaced during the test and then restored at the end of the test. The temporary replacement method has the same visibility as the original method.
|
39
46
|
#
|
40
|
-
# @
|
41
|
-
# @
|
47
|
+
# @return [Expectation] last-built expectation which can be further modified by methods on {Expectation}.
|
48
|
+
# @raise [StubbingError] if attempting to stub method which is not allowed.
|
42
49
|
#
|
43
50
|
# @overload def expects(method_name)
|
51
|
+
# @param [Symbol,String] method_name name of expected method
|
44
52
|
# @overload def expects(expected_methods_vs_return_values)
|
45
|
-
#
|
46
|
-
# @raise [StubbingError] if attempting to stub method which is not allowed.
|
53
|
+
# @param [Hash] expected_methods_vs_return_values expected method name symbols as keys and corresponding return values as values - these expectations are setup as if {#expects} were called multiple times.
|
47
54
|
#
|
48
55
|
# @example Setting up an expectation on a non-mock object.
|
49
56
|
# product = Product.new
|
@@ -71,14 +78,14 @@ module Mocha
|
|
71
78
|
expectation = nil
|
72
79
|
mockery = Mocha::Mockery.instance
|
73
80
|
iterator = ArgumentIterator.new(expected_methods_vs_return_values)
|
74
|
-
iterator.each
|
81
|
+
iterator.each do |*args|
|
75
82
|
method_name = args.shift
|
76
83
|
mockery.on_stubbing(self, method_name)
|
77
84
|
method = stubba_method.new(stubba_object, method_name)
|
78
85
|
mockery.stubba.stub(method)
|
79
86
|
expectation = mocha.expects(method_name, caller)
|
80
|
-
expectation.returns(args.shift)
|
81
|
-
|
87
|
+
expectation.returns(args.shift) unless args.empty?
|
88
|
+
end
|
82
89
|
expectation
|
83
90
|
end
|
84
91
|
|
@@ -86,13 +93,13 @@ module Mocha
|
|
86
93
|
#
|
87
94
|
# The original implementation of the method is replaced during the test and then restored at the end of the test. The temporary replacement method has the same visibility as the original method.
|
88
95
|
#
|
89
|
-
# @
|
90
|
-
# @
|
96
|
+
# @return [Expectation] last-built expectation which can be further modified by methods on {Expectation}.
|
97
|
+
# @raise [StubbingError] if attempting to stub method which is not allowed.
|
91
98
|
#
|
92
99
|
# @overload def stubs(method_name)
|
100
|
+
# @param [Symbol,String] method_name name of stubbed method
|
93
101
|
# @overload def stubs(stubbed_methods_vs_return_values)
|
94
|
-
#
|
95
|
-
# @raise [StubbingError] if attempting to stub method which is not allowed.
|
102
|
+
# @param [Hash] stubbed_methods_vs_return_values stubbed method name symbols as keys and corresponding return values as values - these stubbed methods are setup as if {#stubs} were called multiple times.
|
96
103
|
#
|
97
104
|
# @example Setting up a stubbed methods on a non-mock object.
|
98
105
|
# product = Product.new
|
@@ -117,14 +124,14 @@ module Mocha
|
|
117
124
|
expectation = nil
|
118
125
|
mockery = Mocha::Mockery.instance
|
119
126
|
iterator = ArgumentIterator.new(stubbed_methods_vs_return_values)
|
120
|
-
iterator.each
|
127
|
+
iterator.each do |*args|
|
121
128
|
method_name = args.shift
|
122
129
|
mockery.on_stubbing(self, method_name)
|
123
130
|
method = stubba_method.new(stubba_object, method_name)
|
124
131
|
mockery.stubba.stub(method)
|
125
132
|
expectation = mocha.stubs(method_name, caller)
|
126
|
-
expectation.returns(args.shift)
|
127
|
-
|
133
|
+
expectation.returns(args.shift) unless args.empty?
|
134
|
+
end
|
128
135
|
expectation
|
129
136
|
end
|
130
137
|
|
@@ -158,18 +165,5 @@ module Mocha
|
|
158
165
|
mockery.stubba.unstub(method)
|
159
166
|
end
|
160
167
|
end
|
161
|
-
|
162
|
-
# @private
|
163
|
-
def method_exists?(method, include_public_methods = true)
|
164
|
-
if include_public_methods
|
165
|
-
return true if public_methods(include_superclass_methods = true).include?(method)
|
166
|
-
return true if respond_to?(method.to_sym)
|
167
|
-
end
|
168
|
-
return true if protected_methods(include_superclass_methods = true).include?(method)
|
169
|
-
return true if private_methods(include_superclass_methods = true).include?(method)
|
170
|
-
return false
|
171
|
-
end
|
172
|
-
|
173
168
|
end
|
174
|
-
|
175
169
|
end
|
@@ -1,12 +1,10 @@
|
|
1
1
|
require 'mocha/parameter_matchers/base'
|
2
2
|
|
3
3
|
module Mocha
|
4
|
-
|
5
4
|
module ParameterMatchers
|
6
|
-
|
7
5
|
# Matches if all +matchers+ match.
|
8
6
|
#
|
9
|
-
# @param [*Array<Base>]
|
7
|
+
# @param [*Array<Base>] matchers parameter matchers.
|
10
8
|
# @return [AllOf] parameter matcher.
|
11
9
|
#
|
12
10
|
# @see Expectation#with
|
@@ -28,7 +26,6 @@ module Mocha
|
|
28
26
|
|
29
27
|
# Parameter matcher which combines a number of other matchers using a logical AND.
|
30
28
|
class AllOf < Base
|
31
|
-
|
32
29
|
# @private
|
33
30
|
def initialize(*matchers)
|
34
31
|
@matchers = matchers
|
@@ -42,11 +39,8 @@ module Mocha
|
|
42
39
|
|
43
40
|
# @private
|
44
41
|
def mocha_inspect
|
45
|
-
"all_of(#{@matchers.map
|
42
|
+
"all_of(#{@matchers.map(&:mocha_inspect).join(', ')})"
|
46
43
|
end
|
47
|
-
|
48
44
|
end
|
49
|
-
|
50
45
|
end
|
51
|
-
|
52
46
|
end
|
@@ -1,12 +1,10 @@
|
|
1
1
|
require 'mocha/parameter_matchers/base'
|
2
2
|
|
3
3
|
module Mocha
|
4
|
-
|
5
4
|
module ParameterMatchers
|
6
|
-
|
7
5
|
# Matches if any +matchers+ match.
|
8
6
|
#
|
9
|
-
# @param [*Array<Base>]
|
7
|
+
# @param [*Array<Base>] matchers parameter matchers.
|
10
8
|
# @return [AnyOf] parameter matcher.
|
11
9
|
#
|
12
10
|
# @see Expectation#with
|
@@ -34,7 +32,6 @@ module Mocha
|
|
34
32
|
|
35
33
|
# Parameter matcher which combines a number of other matchers using a logical OR.
|
36
34
|
class AnyOf < Base
|
37
|
-
|
38
35
|
# @private
|
39
36
|
def initialize(*matchers)
|
40
37
|
@matchers = matchers
|
@@ -48,11 +45,8 @@ module Mocha
|
|
48
45
|
|
49
46
|
# @private
|
50
47
|
def mocha_inspect
|
51
|
-
"any_of(#{@matchers.map
|
48
|
+
"any_of(#{@matchers.map(&:mocha_inspect).join(', ')})"
|
52
49
|
end
|
53
|
-
|
54
50
|
end
|
55
|
-
|
56
51
|
end
|
57
|
-
|
58
52
|
end
|
@@ -1,9 +1,7 @@
|
|
1
1
|
require 'mocha/parameter_matchers/base'
|
2
2
|
|
3
3
|
module Mocha
|
4
|
-
|
5
4
|
module ParameterMatchers
|
6
|
-
|
7
5
|
# Matches any parameters. This is used as the default for a newly built expectation.
|
8
6
|
#
|
9
7
|
# @return [AnyParameters] parameter matcher.
|
@@ -26,22 +24,18 @@ module Mocha
|
|
26
24
|
|
27
25
|
# Parameter matcher which always matches whatever the parameters.
|
28
26
|
class AnyParameters < Base
|
29
|
-
|
30
27
|
# @private
|
31
28
|
def matches?(available_parameters)
|
32
|
-
|
29
|
+
until available_parameters.empty?
|
33
30
|
available_parameters.shift
|
34
31
|
end
|
35
|
-
|
32
|
+
true
|
36
33
|
end
|
37
34
|
|
38
35
|
# @private
|
39
36
|
def mocha_inspect
|
40
|
-
|
37
|
+
'any_parameters'
|
41
38
|
end
|
42
|
-
|
43
39
|
end
|
44
|
-
|
45
40
|
end
|
46
|
-
|
47
41
|
end
|
@@ -1,9 +1,7 @@
|
|
1
1
|
require 'mocha/parameter_matchers/base'
|
2
2
|
|
3
3
|
module Mocha
|
4
|
-
|
5
4
|
module ParameterMatchers
|
6
|
-
|
7
5
|
# Matches any object.
|
8
6
|
#
|
9
7
|
# @return [Anything] parameter matcher.
|
@@ -23,20 +21,16 @@ module Mocha
|
|
23
21
|
|
24
22
|
# Parameter matcher which always matches a single parameter.
|
25
23
|
class Anything < Base
|
26
|
-
|
27
24
|
# @private
|
28
25
|
def matches?(available_parameters)
|
29
26
|
available_parameters.shift
|
30
|
-
|
27
|
+
true
|
31
28
|
end
|
32
29
|
|
33
30
|
# @private
|
34
31
|
def mocha_inspect
|
35
|
-
|
32
|
+
'anything'
|
36
33
|
end
|
37
|
-
|
38
34
|
end
|
39
|
-
|
40
35
|
end
|
41
|
-
|
42
36
|
end
|
@@ -1,12 +1,9 @@
|
|
1
1
|
module Mocha
|
2
|
-
|
3
2
|
module ParameterMatchers
|
4
|
-
|
5
3
|
# @abstract Subclass and implement +#matches?+ and +#mocha_inspect+ to define a custom matcher. Also add a suitably named instance method to {ParameterMatchers} to build an instance of the new matcher c.f. {#equals}.
|
6
4
|
class Base
|
7
|
-
|
8
5
|
# @private
|
9
|
-
def to_matcher
|
6
|
+
def to_matcher(_expectation = nil)
|
10
7
|
self
|
11
8
|
end
|
12
9
|
|
@@ -16,7 +13,7 @@ module Mocha
|
|
16
13
|
#
|
17
14
|
# This shorthand will not work with an implicit equals match. Instead, an explicit {Equals} matcher should be used.
|
18
15
|
#
|
19
|
-
# @param [Base]
|
16
|
+
# @param [Base] other parameter matcher.
|
20
17
|
# @return [AllOf] parameter matcher.
|
21
18
|
#
|
22
19
|
# @see Expectation#with
|
@@ -30,8 +27,8 @@ module Mocha
|
|
30
27
|
#
|
31
28
|
# object.expects(:run).with(has_key(:foo) & has_key(:bar))
|
32
29
|
# object.run(:foo => 'foovalue', :bar => 'barvalue)
|
33
|
-
def &(
|
34
|
-
AllOf.new(self,
|
30
|
+
def &(other)
|
31
|
+
AllOf.new(self, other)
|
35
32
|
end
|
36
33
|
|
37
34
|
# A shorthand way of combining two matchers when at least one must match.
|
@@ -40,7 +37,7 @@ module Mocha
|
|
40
37
|
#
|
41
38
|
# This shorthand will not work with an implicit equals match. Instead, an explicit {Equals} matcher should be used.
|
42
39
|
#
|
43
|
-
# @param [Base]
|
40
|
+
# @param [Base] other parameter matcher.
|
44
41
|
# @return [AnyOf] parameter matcher.
|
45
42
|
#
|
46
43
|
# @see Expectation#with
|
@@ -60,12 +57,9 @@ module Mocha
|
|
60
57
|
# object.run(1) # passes
|
61
58
|
# object.run(2) # passes
|
62
59
|
# object.run(3) # fails
|
63
|
-
def |(
|
64
|
-
AnyOf.new(self,
|
60
|
+
def |(other)
|
61
|
+
AnyOf.new(self, other)
|
65
62
|
end
|
66
|
-
|
67
63
|
end
|
68
|
-
|
69
64
|
end
|
70
|
-
|
71
65
|
end
|
@@ -1,9 +1,7 @@
|
|
1
1
|
require 'mocha/parameter_matchers/base'
|
2
2
|
|
3
3
|
module Mocha
|
4
|
-
|
5
4
|
module ParameterMatchers
|
6
|
-
|
7
5
|
# Matches any +Object+ equalling +value+.
|
8
6
|
#
|
9
7
|
# @param [Object] value expected value.
|
@@ -22,14 +20,13 @@ module Mocha
|
|
22
20
|
# object = mock()
|
23
21
|
# object.expects(:method_1).with(equals(2))
|
24
22
|
# object.method_1(3)
|
25
|
-
# # error raised, because method_1 was not called with an +Object+ that equals
|
23
|
+
# # error raised, because method_1 was not called with an +Object+ that equals 2
|
26
24
|
def equals(value)
|
27
25
|
Equals.new(value)
|
28
26
|
end
|
29
27
|
|
30
28
|
# Parameter matcher which matches when actual parameter equals expected value.
|
31
29
|
class Equals < Base
|
32
|
-
|
33
30
|
# @private
|
34
31
|
def initialize(value)
|
35
32
|
@value = value
|
@@ -45,9 +42,6 @@ module Mocha
|
|
45
42
|
def mocha_inspect
|
46
43
|
@value.mocha_inspect
|
47
44
|
end
|
48
|
-
|
49
45
|
end
|
50
|
-
|
51
46
|
end
|
52
|
-
|
53
47
|
end
|
@@ -1,34 +1,33 @@
|
|
1
1
|
require 'mocha/parameter_matchers/base'
|
2
2
|
require 'uri'
|
3
|
+
require 'cgi'
|
3
4
|
|
4
5
|
module Mocha
|
5
6
|
module ParameterMatchers
|
6
|
-
|
7
7
|
# Matches a URI without regard to the ordering of parameters in the query string.
|
8
8
|
#
|
9
9
|
# @param [String] uri URI to match.
|
10
|
-
# @return [
|
10
|
+
# @return [EquivalentUri] parameter matcher.
|
11
11
|
#
|
12
12
|
# @see Expectation#with
|
13
13
|
#
|
14
|
-
# @example Actual URI
|
14
|
+
# @example Actual URI is equivalent.
|
15
15
|
# object = mock()
|
16
|
-
# object.expects(:method_1).with(
|
16
|
+
# object.expects(:method_1).with(equivalent_uri('http://example.com/foo?a=1&b=2))
|
17
17
|
# object.method_1('http://example.com/foo?b=2&a=1')
|
18
18
|
# # no error raised
|
19
19
|
#
|
20
|
-
# @example Actual URI
|
20
|
+
# @example Actual URI is not equivalent.
|
21
21
|
# object = mock()
|
22
|
-
# object.expects(:method_1).with(
|
22
|
+
# object.expects(:method_1).with(equivalent_uri('http://example.com/foo?a=1&b=2))
|
23
23
|
# object.method_1('http://example.com/foo?a=1&b=3')
|
24
24
|
# # error raised, because the query parameters were different
|
25
|
-
def
|
26
|
-
|
25
|
+
def equivalent_uri(uri)
|
26
|
+
EquivalentUri.new(uri)
|
27
27
|
end
|
28
28
|
|
29
29
|
# Parameter matcher which matches URIs with equivalent query strings.
|
30
|
-
class
|
31
|
-
|
30
|
+
class EquivalentUri < Base
|
32
31
|
# @private
|
33
32
|
def initialize(uri)
|
34
33
|
@uri = URI.parse(uri)
|
@@ -43,16 +42,16 @@ module Mocha
|
|
43
42
|
|
44
43
|
# @private
|
45
44
|
def mocha_inspect
|
46
|
-
"
|
45
|
+
"equivalent_uri(#{@uri.mocha_inspect})"
|
47
46
|
end
|
48
47
|
|
49
|
-
|
48
|
+
private
|
49
|
+
|
50
50
|
# @private
|
51
51
|
def explode(uri)
|
52
|
-
query_hash = (uri.query || '')
|
53
|
-
URI::Generic::COMPONENT.inject({}){ |h, k| h.merge(k => uri.__send__(k)) }.merge(:query => query_hash)
|
52
|
+
query_hash = CGI.parse(uri.query || '')
|
53
|
+
URI::Generic::COMPONENT.inject({}) { |h, k| h.merge(k => uri.__send__(k)) }.merge(:query => query_hash)
|
54
54
|
end
|
55
|
-
|
56
55
|
end
|
57
56
|
end
|
58
57
|
end
|
@@ -3,9 +3,7 @@ require 'mocha/parameter_matchers/all_of'
|
|
3
3
|
require 'mocha/parameter_matchers/has_entry'
|
4
4
|
|
5
5
|
module Mocha
|
6
|
-
|
7
6
|
module ParameterMatchers
|
8
|
-
|
9
7
|
# Matches +Hash+ containing all +entries+.
|
10
8
|
#
|
11
9
|
# @param [Hash] entries expected +Hash+ entries.
|
@@ -24,13 +22,13 @@ module Mocha
|
|
24
22
|
# object.expects(:method_1).with(has_entries('key_1' => 1, 'key_2' => 2))
|
25
23
|
# object.method_1('key_1' => 1, 'key_2' => 99)
|
26
24
|
# # error raised, because method_1 was not called with Hash containing entries: 'key_1' => 1, 'key_2' => 2
|
27
|
-
|
25
|
+
#
|
26
|
+
def has_entries(entries) # rubocop:disable Naming/PredicateName
|
28
27
|
HasEntries.new(entries)
|
29
28
|
end
|
30
29
|
|
31
30
|
# Parameter matcher which matches when actual parameter contains all expected +Hash+ entries.
|
32
31
|
class HasEntries < Base
|
33
|
-
|
34
32
|
# @private
|
35
33
|
def initialize(entries)
|
36
34
|
@entries = entries
|
@@ -47,9 +45,6 @@ module Mocha
|
|
47
45
|
def mocha_inspect
|
48
46
|
"has_entries(#{@entries.mocha_inspect})"
|
49
47
|
end
|
50
|
-
|
51
48
|
end
|
52
|
-
|
53
49
|
end
|
54
|
-
|
55
50
|
end
|
@@ -1,9 +1,7 @@
|
|
1
1
|
require 'mocha/parameter_matchers/base'
|
2
2
|
|
3
3
|
module Mocha
|
4
|
-
|
5
4
|
module ParameterMatchers
|
6
|
-
|
7
5
|
# Matches +Hash+ containing entry with +key+ and +value+.
|
8
6
|
#
|
9
7
|
# @overload def has_entry(key, value)
|
@@ -41,36 +39,27 @@ module Mocha
|
|
41
39
|
# object.expects(:method_1).with(has_entry('key_1' => 1))
|
42
40
|
# object.method_1('key_1' => 2, 'key_2' => 1)
|
43
41
|
# # error raised, because method_1 was not called with Hash containing entry: 'key_1' => 1
|
44
|
-
|
42
|
+
#
|
43
|
+
def has_entry(*options) # rubocop:disable Naming/PredicateName
|
45
44
|
case options.length
|
45
|
+
when 0
|
46
|
+
raise ArgumentError, 'No arguments. Expecting at least one.'
|
46
47
|
when 1
|
47
|
-
|
48
|
-
when Hash
|
49
|
-
case options[0].length
|
50
|
-
when 0
|
51
|
-
raise ArgumentError.new("Argument has no entries.")
|
52
|
-
when 1
|
53
|
-
key, value = options[0].first
|
54
|
-
else
|
55
|
-
raise ArgumentError.new("Argument has multiple entries. Use Mocha::ParameterMatchers#has_entries instead.")
|
56
|
-
end
|
57
|
-
else
|
58
|
-
raise ArgumentError.new("Argument is not a Hash.")
|
59
|
-
end
|
48
|
+
key, value = parse_option(options[0])
|
60
49
|
when 2
|
61
50
|
key, value = options
|
62
51
|
else
|
63
|
-
raise ArgumentError
|
52
|
+
raise ArgumentError, 'Too many arguments; use either a single argument (must be a Hash) or two arguments (a key and a value).'
|
64
53
|
end
|
65
54
|
HasEntry.new(key, value)
|
66
55
|
end
|
67
56
|
|
68
57
|
# Parameter matcher which matches when actual parameter contains expected +Hash+ entry.
|
69
58
|
class HasEntry < Base
|
70
|
-
|
71
59
|
# @private
|
72
60
|
def initialize(key, value)
|
73
|
-
@key
|
61
|
+
@key = key
|
62
|
+
@value = value
|
74
63
|
end
|
75
64
|
|
76
65
|
# @private
|
@@ -85,9 +74,25 @@ module Mocha
|
|
85
74
|
def mocha_inspect
|
86
75
|
"has_entry(#{@key.mocha_inspect} => #{@value.mocha_inspect})"
|
87
76
|
end
|
88
|
-
|
89
77
|
end
|
90
78
|
|
91
|
-
|
79
|
+
private
|
92
80
|
|
81
|
+
# @private
|
82
|
+
def parse_option(option)
|
83
|
+
case option
|
84
|
+
when Hash
|
85
|
+
case option.length
|
86
|
+
when 0
|
87
|
+
raise ArgumentError, 'Argument has no entries.'
|
88
|
+
when 1
|
89
|
+
option.first
|
90
|
+
else
|
91
|
+
raise ArgumentError, 'Argument has multiple entries. Use Mocha::ParameterMatchers#has_entries instead.'
|
92
|
+
end
|
93
|
+
else
|
94
|
+
raise ArgumentError, 'Argument is not a Hash.'
|
95
|
+
end
|
96
|
+
end
|
97
|
+
end
|
93
98
|
end
|
@@ -1,9 +1,7 @@
|
|
1
1
|
require 'mocha/parameter_matchers/base'
|
2
2
|
|
3
3
|
module Mocha
|
4
|
-
|
5
4
|
module ParameterMatchers
|
6
|
-
|
7
5
|
# Matches +Hash+ containing +key+.
|
8
6
|
#
|
9
7
|
# @param [Object] key expected key.
|
@@ -22,13 +20,13 @@ module Mocha
|
|
22
20
|
# object.expects(:method_1).with(has_key('key_1'))
|
23
21
|
# object.method_1('key_2' => 2)
|
24
22
|
# # error raised, because method_1 was not called with Hash containing key: 'key_1'
|
25
|
-
|
23
|
+
#
|
24
|
+
def has_key(key) # rubocop:disable Naming/PredicateName
|
26
25
|
HasKey.new(key)
|
27
26
|
end
|
28
27
|
|
29
28
|
# Parameter matcher which matches when actual parameter contains +Hash+ entry with expected key.
|
30
29
|
class HasKey < Base
|
31
|
-
|
32
30
|
# @private
|
33
31
|
def initialize(key)
|
34
32
|
@key = key
|
@@ -45,9 +43,6 @@ module Mocha
|
|
45
43
|
def mocha_inspect
|
46
44
|
"has_key(#{@key.mocha_inspect})"
|
47
45
|
end
|
48
|
-
|
49
46
|
end
|
50
|
-
|
51
47
|
end
|
52
|
-
|
53
48
|
end
|
@@ -0,0 +1,53 @@
|
|
1
|
+
require 'mocha/parameter_matchers/base'
|
2
|
+
|
3
|
+
module Mocha
|
4
|
+
module ParameterMatchers
|
5
|
+
# Matches +Hash+ containing +keys+.
|
6
|
+
#
|
7
|
+
# @param [*Array<Object>] keys expected keys.
|
8
|
+
# @return [HasKeys] parameter matcher.
|
9
|
+
#
|
10
|
+
# @see Expectation#with
|
11
|
+
#
|
12
|
+
# @example Actual parameter contains entry with expected keys.
|
13
|
+
# object = mock()
|
14
|
+
# object.expects(:method_1).with(has_keys(:key_1, :key_2))
|
15
|
+
# object.method_1(:key_1 => 1, :key_2 => 2, :key_3 => 3)
|
16
|
+
# # no error raised
|
17
|
+
#
|
18
|
+
# @example Actual parameter does not contain all expected keys.
|
19
|
+
# object = mock()
|
20
|
+
# object.expects(:method_1).with(has_keys(:key_1, :key_2))
|
21
|
+
# object.method_1(:key_2 => 2)
|
22
|
+
# # error raised, because method_1 was not called with Hash containing key: :key_1
|
23
|
+
#
|
24
|
+
def has_keys(*keys) # rubocop:disable Naming/PredicateName
|
25
|
+
HasKeys.new(*keys)
|
26
|
+
end
|
27
|
+
|
28
|
+
# Parameter matcher which matches when actual parameter contains +Hash+ with all expected keys.
|
29
|
+
class HasKeys < Base
|
30
|
+
# @private
|
31
|
+
def initialize(*keys)
|
32
|
+
raise ArgumentError, 'No arguments. Expecting at least one.' if keys.empty?
|
33
|
+
|
34
|
+
@keys = keys
|
35
|
+
end
|
36
|
+
|
37
|
+
# @private
|
38
|
+
def matches?(available_parameters)
|
39
|
+
parameter = available_parameters.shift
|
40
|
+
return false unless parameter.respond_to?(:keys)
|
41
|
+
|
42
|
+
@keys.map(&:to_matcher).all? do |matcher|
|
43
|
+
parameter.keys.any? { |key| matcher.matches?([key]) }
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
# @private
|
48
|
+
def mocha_inspect
|
49
|
+
"has_keys(#{@keys.mocha_inspect(false)})"
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
@@ -1,9 +1,7 @@
|
|
1
1
|
require 'mocha/parameter_matchers/base'
|
2
2
|
|
3
3
|
module Mocha
|
4
|
-
|
5
4
|
module ParameterMatchers
|
6
|
-
|
7
5
|
# Matches +Hash+ containing +value+.
|
8
6
|
#
|
9
7
|
# @param [Object] value expected value.
|
@@ -22,13 +20,13 @@ module Mocha
|
|
22
20
|
# object.expects(:method_1).with(has_value(1))
|
23
21
|
# object.method_1('key_2' => 2)
|
24
22
|
# # error raised, because method_1 was not called with Hash containing value: 1
|
25
|
-
|
23
|
+
#
|
24
|
+
def has_value(value) # rubocop:disable Naming/PredicateName
|
26
25
|
HasValue.new(value)
|
27
26
|
end
|
28
27
|
|
29
28
|
# Parameter matcher which matches when actual parameter contains +Hash+ entry with expected value.
|
30
29
|
class HasValue < Base
|
31
|
-
|
32
30
|
# @private
|
33
31
|
def initialize(value)
|
34
32
|
@value = value
|
@@ -45,9 +43,6 @@ module Mocha
|
|
45
43
|
def mocha_inspect
|
46
44
|
"has_value(#{@value.mocha_inspect})"
|
47
45
|
end
|
48
|
-
|
49
46
|
end
|
50
|
-
|
51
47
|
end
|
52
|
-
|
53
48
|
end
|