mocha 1.2.1 → 1.16.1
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 +5 -5
- data/.github/FUNDING.yml +1 -0
- data/.rubocop.yml +61 -0
- data/.rubocop_todo.yml +27 -0
- data/.yardopts +1 -0
- data/CONTRIBUTING.md +4 -9
- data/Gemfile +29 -0
- data/README.md +104 -106
- data/RELEASE.md +277 -1
- data/Rakefile +46 -44
- data/gemfiles/Gemfile.minitest.latest +1 -0
- data/gemfiles/Gemfile.test-unit.latest +2 -5
- data/init.rb +1 -3
- data/lib/mocha/any_instance_method.rb +9 -62
- data/lib/mocha/api.rb +144 -68
- 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 -21
- data/lib/mocha/configuration.rb +372 -18
- 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 +125 -89
- 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/nothing.rb +4 -4
- data/lib/mocha/integration/mini_test/version_13.rb +4 -1
- data/lib/mocha/integration/mini_test/version_140.rb +4 -1
- data/lib/mocha/integration/mini_test/version_141.rb +4 -1
- data/lib/mocha/integration/mini_test/version_142_to_172.rb +4 -1
- data/lib/mocha/integration/mini_test/version_200.rb +4 -1
- data/lib/mocha/integration/mini_test/version_201_to_222.rb +4 -1
- data/lib/mocha/integration/mini_test/version_2110_to_2111.rb +4 -1
- data/lib/mocha/integration/mini_test/version_2112_to_320.rb +4 -1
- data/lib/mocha/integration/mini_test/version_230_to_2101.rb +4 -1
- data/lib/mocha/integration/mini_test.rb +7 -0
- data/lib/mocha/integration/monkey_patcher.rb +5 -7
- data/lib/mocha/integration/test_unit/adapter.rb +5 -6
- data/lib/mocha/integration/test_unit/gem_version_200.rb +5 -2
- data/lib/mocha/integration/test_unit/gem_version_201_to_202.rb +5 -2
- data/lib/mocha/integration/test_unit/gem_version_203_to_220.rb +5 -2
- data/lib/mocha/integration/test_unit/gem_version_230_to_250.rb +5 -2
- data/lib/mocha/integration/test_unit/nothing.rb +4 -4
- data/lib/mocha/integration/test_unit/ruby_version_186_and_above.rb +4 -1
- data/lib/mocha/integration/test_unit.rb +7 -2
- data/lib/mocha/integration.rb +2 -5
- data/lib/mocha/invocation.rb +86 -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 +9 -0
- data/lib/mocha/mock.rb +102 -58
- data/lib/mocha/mockery.rb +70 -99
- 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 +6 -12
- data/lib/mocha/parameter_matchers/equals.rb +0 -6
- data/lib/mocha/parameter_matchers/{query_string.rb → equivalent_uri.rb} +15 -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 +6 -7
- data/lib/mocha/parameter_matchers/instance_methods.rb +18 -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/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 +6 -9
- 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 +8 -1
- data/lib/mocha/sequence.rb +4 -9
- data/lib/mocha/setup.rb +5 -0
- data/lib/mocha/single_return_value.rb +2 -5
- data/lib/mocha/state_machine.rb +33 -46
- data/lib/mocha/stubbed_method.rb +124 -0
- data/lib/mocha/stubbing_error.rb +2 -13
- data/lib/mocha/test_unit.rb +8 -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 +14 -65
- data/yard-templates/default/layout/html/google_analytics.erb +6 -9
- data/yard-templates/default/layout/html/setup.rb +2 -3
- metadata +25 -247
- data/bin/build-matrix +0 -70
- 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/lib/mocha/class_method.rb +0 -119
- data/lib/mocha/integration/test_unit/ruby_version_185_and_below.rb +0 -58
- 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/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_272_test.rb +0 -52
- 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 -89
- 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 -280
- 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 -78
- 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_method_defined_on_module_and_aliased_test.rb +0 -39
- 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 -61
- data/test/acceptance/stubbing_non_existent_any_instance_method_test.rb +0 -143
- 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 -8
- 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 -134
- 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 -225
- 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 -342
- 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 -39
- 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 -102
- 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/mockery.rb
CHANGED
@@ -1,4 +1,3 @@
|
|
1
|
-
require 'mocha/ruby_version'
|
2
1
|
require 'mocha/central'
|
3
2
|
require 'mocha/mock'
|
4
3
|
require 'mocha/names'
|
@@ -7,16 +6,42 @@ require 'mocha/state_machine'
|
|
7
6
|
require 'mocha/logger'
|
8
7
|
require 'mocha/configuration'
|
9
8
|
require 'mocha/stubbing_error'
|
9
|
+
require 'mocha/not_initialized_error'
|
10
10
|
require 'mocha/expectation_error_factory'
|
11
11
|
|
12
12
|
module Mocha
|
13
|
-
|
14
13
|
class Mockery
|
14
|
+
class Null < self
|
15
|
+
def add_mock(*)
|
16
|
+
raise_not_initialized_error
|
17
|
+
end
|
15
18
|
|
16
|
-
|
19
|
+
def add_state_machine(*)
|
20
|
+
raise_not_initialized_error
|
21
|
+
end
|
22
|
+
|
23
|
+
def stubba
|
24
|
+
Central::Null.new(&method(:raise_not_initialized_error))
|
25
|
+
end
|
17
26
|
|
27
|
+
private
|
28
|
+
|
29
|
+
def raise_not_initialized_error
|
30
|
+
message = 'Mocha methods cannot be used outside the context of a test'
|
31
|
+
raise NotInitializedError.new(message, caller)
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
class << self
|
18
36
|
def instance
|
19
|
-
@
|
37
|
+
@instances.last || Null.new
|
38
|
+
end
|
39
|
+
|
40
|
+
def setup
|
41
|
+
@instances ||= []
|
42
|
+
mockery = new
|
43
|
+
mockery.logger = instance.logger unless @instances.empty?
|
44
|
+
@instances.push(mockery)
|
20
45
|
end
|
21
46
|
|
22
47
|
def verify(*args)
|
@@ -25,28 +50,25 @@ module Mocha
|
|
25
50
|
|
26
51
|
def teardown
|
27
52
|
instance.teardown
|
53
|
+
ensure
|
54
|
+
@instances.pop
|
28
55
|
end
|
29
|
-
|
30
|
-
def reset_instance
|
31
|
-
@instance = nil
|
32
|
-
end
|
33
|
-
|
34
56
|
end
|
35
57
|
|
36
|
-
def named_mock(name
|
37
|
-
add_mock(Mock.new(self, Name.new(name)
|
58
|
+
def named_mock(name)
|
59
|
+
add_mock(Mock.new(self, Name.new(name)))
|
38
60
|
end
|
39
61
|
|
40
|
-
def unnamed_mock
|
41
|
-
add_mock(Mock.new(self
|
62
|
+
def unnamed_mock
|
63
|
+
add_mock(Mock.new(self))
|
42
64
|
end
|
43
65
|
|
44
|
-
def mock_impersonating(object
|
45
|
-
add_mock(Mock.new(self, ImpersonatingName.new(object), ObjectReceiver.new(object)
|
66
|
+
def mock_impersonating(object)
|
67
|
+
add_mock(Mock.new(self, ImpersonatingName.new(object), ObjectReceiver.new(object)))
|
46
68
|
end
|
47
69
|
|
48
|
-
def mock_impersonating_any_instance_of(klass
|
49
|
-
add_mock(Mock.new(self, ImpersonatingAnyInstanceName.new(klass), AnyInstanceReceiver.new(klass)
|
70
|
+
def mock_impersonating_any_instance_of(klass)
|
71
|
+
add_mock(Mock.new(self, ImpersonatingAnyInstanceName.new(klass), AnyInstanceReceiver.new(klass)))
|
50
72
|
end
|
51
73
|
|
52
74
|
def new_state_machine(name)
|
@@ -56,24 +78,22 @@ module Mocha
|
|
56
78
|
def verify(assertion_counter = nil)
|
57
79
|
unless mocks.all? { |mock| mock.__verified__?(assertion_counter) }
|
58
80
|
message = "not all expectations were satisfied\n#{mocha_inspect}"
|
59
|
-
if unsatisfied_expectations.empty?
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
81
|
+
backtrace = if unsatisfied_expectations.empty?
|
82
|
+
caller
|
83
|
+
else
|
84
|
+
unsatisfied_expectations[0].backtrace
|
85
|
+
end
|
64
86
|
raise ExpectationErrorFactory.build(message, backtrace)
|
65
87
|
end
|
66
|
-
expectations.each do |
|
67
|
-
|
68
|
-
|
69
|
-
on_stubbing_method_unnecessarily(e)
|
70
|
-
end
|
71
|
-
end
|
88
|
+
expectations.reject(&:used?).each do |expectation|
|
89
|
+
signature_proc = lambda { expectation.method_signature }
|
90
|
+
check(:stubbing_method_unnecessarily, 'method unnecessarily', signature_proc, expectation.backtrace)
|
72
91
|
end
|
73
92
|
end
|
74
93
|
|
75
94
|
def teardown
|
76
95
|
stubba.unstub_all
|
96
|
+
mocks.each(&:__expire__)
|
77
97
|
reset
|
78
98
|
end
|
79
99
|
|
@@ -90,78 +110,23 @@ module Mocha
|
|
90
110
|
end
|
91
111
|
|
92
112
|
def mocha_inspect
|
93
|
-
message =
|
94
|
-
message << "unsatisfied expectations:\n- #{unsatisfied_expectations.map
|
95
|
-
message << "satisfied expectations:\n- #{satisfied_expectations.map
|
96
|
-
message << "states:\n- #{state_machines.map
|
113
|
+
message = ''
|
114
|
+
message << "unsatisfied expectations:\n- #{unsatisfied_expectations.map(&:mocha_inspect).join("\n- ")}\n" if unsatisfied_expectations.any?
|
115
|
+
message << "satisfied expectations:\n- #{satisfied_expectations.map(&:mocha_inspect).join("\n- ")}\n" if satisfied_expectations.any?
|
116
|
+
message << "states:\n- #{state_machines.map(&:mocha_inspect).join("\n- ")}\n" if state_machines.any?
|
97
117
|
message
|
98
118
|
end
|
99
119
|
|
100
120
|
def on_stubbing(object, method)
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
on_stubbing_non_existent_method(object, method)
|
105
|
-
end
|
106
|
-
end
|
107
|
-
unless Mocha::Configuration.allow?(:stubbing_non_public_method)
|
108
|
-
if object.method_exists?(method, include_public_methods = false)
|
109
|
-
on_stubbing_non_public_method(object, method)
|
110
|
-
end
|
111
|
-
end
|
112
|
-
unless Mocha::Configuration.allow?(:stubbing_method_on_nil)
|
113
|
-
if object.nil?
|
114
|
-
on_stubbing_method_on_nil(object, method)
|
115
|
-
end
|
116
|
-
end
|
117
|
-
unless Mocha::Configuration.allow?(:stubbing_method_on_non_mock_object)
|
118
|
-
on_stubbing_method_on_non_mock_object(object, method)
|
119
|
-
end
|
120
|
-
end
|
121
|
-
|
122
|
-
def on_stubbing_non_existent_method(object, method)
|
123
|
-
if Mocha::Configuration.prevent?(:stubbing_non_existent_method)
|
124
|
-
raise StubbingError.new("stubbing non-existent method: #{object.mocha_inspect}.#{method}", caller)
|
121
|
+
signature_proc = lambda { "#{object.mocha_inspect}.#{method}" }
|
122
|
+
check(:stubbing_non_existent_method, 'non-existent method', signature_proc) do
|
123
|
+
!(object.stubba_class.__method_exists__?(method, true) || object.respond_to?(method))
|
125
124
|
end
|
126
|
-
|
127
|
-
|
128
|
-
end
|
129
|
-
end
|
130
|
-
|
131
|
-
def on_stubbing_non_public_method(object, method)
|
132
|
-
if Mocha::Configuration.prevent?(:stubbing_non_public_method)
|
133
|
-
raise StubbingError.new("stubbing non-public method: #{object.mocha_inspect}.#{method}", caller)
|
134
|
-
end
|
135
|
-
if Mocha::Configuration.warn_when?(:stubbing_non_public_method)
|
136
|
-
logger.warn "stubbing non-public method: #{object.mocha_inspect}.#{method}"
|
137
|
-
end
|
138
|
-
end
|
139
|
-
|
140
|
-
def on_stubbing_method_on_nil(object, method)
|
141
|
-
if Mocha::Configuration.prevent?(:stubbing_method_on_nil)
|
142
|
-
raise StubbingError.new("stubbing method on nil: #{object.mocha_inspect}.#{method}", caller)
|
143
|
-
end
|
144
|
-
if Mocha::Configuration.warn_when?(:stubbing_method_on_nil)
|
145
|
-
logger.warn "stubbing method on nil: #{object.mocha_inspect}.#{method}"
|
146
|
-
end
|
147
|
-
end
|
148
|
-
|
149
|
-
def on_stubbing_method_on_non_mock_object(object, method)
|
150
|
-
if Mocha::Configuration.prevent?(:stubbing_method_on_non_mock_object)
|
151
|
-
raise StubbingError.new("stubbing method on non-mock object: #{object.mocha_inspect}.#{method}", caller)
|
152
|
-
end
|
153
|
-
if Mocha::Configuration.warn_when?(:stubbing_method_on_non_mock_object)
|
154
|
-
logger.warn "stubbing method on non-mock object: #{object.mocha_inspect}.#{method}"
|
155
|
-
end
|
156
|
-
end
|
157
|
-
|
158
|
-
def on_stubbing_method_unnecessarily(expectation)
|
159
|
-
if Mocha::Configuration.prevent?(:stubbing_method_unnecessarily)
|
160
|
-
raise StubbingError.new("stubbing method unnecessarily: #{expectation.method_signature}", expectation.backtrace)
|
161
|
-
end
|
162
|
-
if Mocha::Configuration.warn_when?(:stubbing_method_unnecessarily)
|
163
|
-
logger.warn "stubbing method unnecessarily: #{expectation.method_signature}"
|
125
|
+
check(:stubbing_non_public_method, 'non-public method', signature_proc) do
|
126
|
+
object.stubba_class.__method_exists__?(method, false)
|
164
127
|
end
|
128
|
+
check(:stubbing_method_on_nil, 'method on nil', signature_proc) { object.nil? }
|
129
|
+
check(:stubbing_method_on_non_mock_object, 'method on non-mock object', signature_proc)
|
165
130
|
end
|
166
131
|
|
167
132
|
attr_writer :logger
|
@@ -170,19 +135,27 @@ module Mocha
|
|
170
135
|
@logger ||= Logger.new($stderr)
|
171
136
|
end
|
172
137
|
|
173
|
-
|
174
138
|
private
|
175
139
|
|
140
|
+
def check(action, description, signature_proc, backtrace = caller)
|
141
|
+
treatment = Mocha.configuration.send(action)
|
142
|
+
return if (treatment == :allow) || (block_given? && !yield)
|
143
|
+
method_signature = signature_proc.call
|
144
|
+
message = "stubbing #{description}: #{method_signature}"
|
145
|
+
raise StubbingError.new(message, backtrace) if treatment == :prevent
|
146
|
+
logger.warn(message) if treatment == :warn
|
147
|
+
end
|
148
|
+
|
176
149
|
def expectations
|
177
150
|
mocks.map { |mock| mock.__expectations__.to_a }.flatten
|
178
151
|
end
|
179
152
|
|
180
153
|
def unsatisfied_expectations
|
181
|
-
expectations.reject
|
154
|
+
expectations.reject(&:verified?)
|
182
155
|
end
|
183
156
|
|
184
157
|
def satisfied_expectations
|
185
|
-
expectations.select
|
158
|
+
expectations.select(&:verified?)
|
186
159
|
end
|
187
160
|
|
188
161
|
def add_mock(mock)
|
@@ -200,7 +173,5 @@ module Mocha
|
|
200
173
|
@mocks = nil
|
201
174
|
@state_machines = nil
|
202
175
|
end
|
203
|
-
|
204
176
|
end
|
205
|
-
|
206
177
|
end
|
data/lib/mocha/names.rb
CHANGED
@@ -1,7 +1,5 @@
|
|
1
1
|
module Mocha
|
2
|
-
|
3
2
|
class ImpersonatingName
|
4
|
-
|
5
3
|
def initialize(object)
|
6
4
|
@object = object
|
7
5
|
end
|
@@ -9,11 +7,9 @@ module Mocha
|
|
9
7
|
def mocha_inspect
|
10
8
|
@object.mocha_inspect
|
11
9
|
end
|
12
|
-
|
13
10
|
end
|
14
11
|
|
15
12
|
class ImpersonatingAnyInstanceName
|
16
|
-
|
17
13
|
def initialize(klass)
|
18
14
|
@klass = klass
|
19
15
|
end
|
@@ -21,23 +17,19 @@ module Mocha
|
|
21
17
|
def mocha_inspect
|
22
18
|
"#<AnyInstance:#{@klass.mocha_inspect}>"
|
23
19
|
end
|
24
|
-
|
25
20
|
end
|
26
21
|
|
27
22
|
class Name
|
28
|
-
|
29
23
|
def initialize(name)
|
30
|
-
@name = name
|
24
|
+
@name = name.to_s
|
31
25
|
end
|
32
26
|
|
33
27
|
def mocha_inspect
|
34
28
|
"#<Mock:#{@name}>"
|
35
29
|
end
|
36
|
-
|
37
30
|
end
|
38
31
|
|
39
32
|
class DefaultName
|
40
|
-
|
41
33
|
def initialize(mock)
|
42
34
|
@mock = mock
|
43
35
|
end
|
@@ -45,9 +37,7 @@ module Mocha
|
|
45
37
|
def mocha_inspect
|
46
38
|
address = @mock.__id__ * 2
|
47
39
|
address += 0x100000000 if address < 0
|
48
|
-
"#<Mock:0x#{'%x'
|
40
|
+
"#<Mock:0x#{format('%x', address)}>"
|
49
41
|
end
|
50
|
-
|
51
42
|
end
|
52
|
-
|
53
43
|
end
|
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,10 +1,7 @@
|
|
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
6
|
def to_matcher
|
10
7
|
self
|
@@ -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.
|
@@ -29,7 +27,6 @@ module Mocha
|
|
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
|