mocha 1.1.0 → 1.13.0
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/README.md +114 -28
- data/RELEASE.md +248 -1
- data/Rakefile +53 -35
- data/gemfiles/Gemfile.test-unit.latest +5 -1
- data/init.rb +1 -3
- data/lib/mocha/any_instance_method.rb +12 -72
- data/lib/mocha/api.rb +121 -56
- 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 +361 -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 +15 -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 +8 -2
- 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_185_and_below.rb +4 -1
- data/lib/mocha/integration/test_unit/ruby_version_186_and_above.rb +4 -1
- data/lib/mocha/integration/test_unit.rb +7 -0
- data/lib/mocha/integration.rb +2 -5
- data/lib/mocha/invocation.rb +77 -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 +8 -0
- data/lib/mocha/mock.rb +94 -46
- data/lib/mocha/mockery.rb +72 -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 +6 -12
- data/lib/mocha/parameter_matchers/equals.rb +1 -7
- 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 +50 -8
- 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 +4 -0
- 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/singleton_class.rb +9 -0
- data/lib/mocha/state_machine.rb +33 -46
- data/lib/mocha/stubbed_method.rb +125 -0
- data/lib/mocha/stubbing_error.rb +2 -13
- data/lib/mocha/test_unit.rb +7 -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/lib/mocha.rb +8 -0
- data/mocha.gemspec +42 -40
- data/yard-templates/default/layout/html/google_analytics.erb +6 -9
- data/yard-templates/default/layout/html/setup.rb +2 -3
- metadata +45 -191
- 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/lib/mocha/class_method.rb +0 -127
- 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_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/sequence.rb
CHANGED
@@ -1,16 +1,14 @@
|
|
1
1
|
module Mocha
|
2
|
-
|
3
2
|
# Used to constrain the order in which expectations can occur.
|
4
3
|
#
|
5
4
|
# @see API#sequence
|
6
5
|
# @see Expectation#in_sequence
|
7
6
|
class Sequence
|
8
|
-
|
9
7
|
# @private
|
10
8
|
class InSequenceOrderingConstraint
|
11
|
-
|
12
9
|
def initialize(sequence, index)
|
13
|
-
@sequence
|
10
|
+
@sequence = sequence
|
11
|
+
@index = index
|
14
12
|
end
|
15
13
|
|
16
14
|
def allows_invocation_now?
|
@@ -20,7 +18,6 @@ module Mocha
|
|
20
18
|
def mocha_inspect
|
21
19
|
"in sequence #{@sequence.mocha_inspect}"
|
22
20
|
end
|
23
|
-
|
24
21
|
end
|
25
22
|
|
26
23
|
# @private
|
@@ -38,14 +35,12 @@ module Mocha
|
|
38
35
|
|
39
36
|
# @private
|
40
37
|
def satisfied_to_index?(index)
|
41
|
-
@expectations[0...index].all?
|
38
|
+
@expectations[0...index].all?(&:satisfied?)
|
42
39
|
end
|
43
40
|
|
44
41
|
# @private
|
45
42
|
def mocha_inspect
|
46
|
-
|
43
|
+
@name.mocha_inspect.to_s
|
47
44
|
end
|
48
|
-
|
49
45
|
end
|
50
|
-
|
51
46
|
end
|
data/lib/mocha/setup.rb
CHANGED
data/lib/mocha/state_machine.rb
CHANGED
@@ -1,52 +1,34 @@
|
|
1
1
|
module Mocha
|
2
|
-
|
3
2
|
# A state machine that is used to constrain the order of invocations.
|
4
3
|
# An invocation can be constrained to occur when a state {#is}, or {#is_not}, active.
|
5
4
|
class StateMachine
|
6
|
-
|
7
|
-
|
8
|
-
class State
|
9
|
-
|
10
|
-
# @private
|
11
|
-
def initialize(state_machine, state)
|
12
|
-
@state_machine, @state = state_machine, state
|
13
|
-
end
|
14
|
-
|
5
|
+
# Provides the ability to determine whether a {StateMachine} is in a specified state at some point in the future.
|
6
|
+
class StatePredicate
|
15
7
|
# @private
|
16
|
-
def
|
17
|
-
@state_machine
|
8
|
+
def initialize(state_machine, state, description, &active_check)
|
9
|
+
@state_machine = state_machine
|
10
|
+
@state = state
|
11
|
+
@description = description
|
12
|
+
@active_check = active_check
|
18
13
|
end
|
19
14
|
|
20
15
|
# @private
|
21
16
|
def active?
|
22
|
-
@state_machine.current_state
|
17
|
+
@active_check.call(@state_machine.current_state, @state)
|
23
18
|
end
|
24
19
|
|
25
20
|
# @private
|
26
21
|
def mocha_inspect
|
27
|
-
"#{@state_machine.name}
|
22
|
+
"#{@state_machine.name} #{@description} #{@state.mocha_inspect}"
|
28
23
|
end
|
29
|
-
|
30
24
|
end
|
31
25
|
|
32
|
-
# Provides
|
33
|
-
class StatePredicate
|
34
|
-
|
35
|
-
# @private
|
36
|
-
def initialize(state_machine, state)
|
37
|
-
@state_machine, @state = state_machine, state
|
38
|
-
end
|
39
|
-
|
40
|
-
# @private
|
41
|
-
def active?
|
42
|
-
@state_machine.current_state != @state
|
43
|
-
end
|
44
|
-
|
26
|
+
# Provides a mechanism to change the state of a {StateMachine} at some point in the future.
|
27
|
+
class State < StatePredicate
|
45
28
|
# @private
|
46
|
-
def
|
47
|
-
|
29
|
+
def activate
|
30
|
+
@state_machine.current_state = @state
|
48
31
|
end
|
49
|
-
|
50
32
|
end
|
51
33
|
|
52
34
|
# @private
|
@@ -77,30 +59,35 @@ module Mocha
|
|
77
59
|
@current_state = next_state_name
|
78
60
|
end
|
79
61
|
|
80
|
-
# Provides a
|
62
|
+
# Provides mechanisms to (a) determine whether the {StateMachine} is in a given state; or (b) to change the {StateMachine} into the given state.
|
63
|
+
#
|
64
|
+
# @param [String] state_name name of expected/desired state.
|
65
|
+
# @return [StatePredicate,State] (a) state predicate which, when queried, will indicate whether the {StateMachine} is in the given state; or (b) state which, when activated, will change the {StateMachine} into the given state.
|
81
66
|
#
|
82
|
-
#
|
67
|
+
# @overload def is(expected_state_name)
|
68
|
+
# Provides a mechanism to determine whether the {StateMachine} is in the state specified by +expected_state_name+ at some point in the future
|
69
|
+
# @param [String] expected_state_name name of expected state.
|
70
|
+
# @return [StatePredicate] state predicate which, when queried, will indicate whether the {StateMachine} is in the state specified by +expected_state_name+
|
83
71
|
#
|
84
|
-
# @
|
85
|
-
#
|
72
|
+
# @overload def is(desired_state_name)
|
73
|
+
# Provides a mechanism to change the {StateMachine} into the state specified by +desired_state_name+ at some point in the future.
|
74
|
+
# @param [String] desired_state_name name of desired new state.
|
75
|
+
# @return [State] state which, when activated, will change the {StateMachine} into the state with the specified +desired_state_name+.
|
86
76
|
def is(state_name)
|
87
|
-
State.new(self, state_name)
|
77
|
+
State.new(self, state_name, 'is') { |current, given| current == given }
|
88
78
|
end
|
89
79
|
|
90
|
-
# Provides a mechanism to determine whether the {StateMachine} is not in the state specified by +
|
91
|
-
|
92
|
-
|
80
|
+
# Provides a mechanism to determine whether the {StateMachine} is *not* in the state specified by +unexpected_state_name+ at some point in the future.
|
81
|
+
#
|
82
|
+
# @param [String] unexpected_state_name name of unexpected state.
|
83
|
+
# @return [StatePredicate] state predicate which, when queried, will indicate whether the {StateMachine} is *not* in the state specified by +unexpected_state_name+.
|
84
|
+
def is_not(unexpected_state_name) # rubocop:disable Naming/PredicateName
|
85
|
+
StatePredicate.new(self, unexpected_state_name, 'is not') { |current, given| current != given }
|
93
86
|
end
|
94
87
|
|
95
88
|
# @private
|
96
89
|
def mocha_inspect
|
97
|
-
|
98
|
-
"#{@name} is #{@current_state.mocha_inspect}"
|
99
|
-
else
|
100
|
-
"#{@name} has no current state"
|
101
|
-
end
|
90
|
+
%(#{@name} #{@current_state ? "is #{@current_state.mocha_inspect}" : 'has no current state'})
|
102
91
|
end
|
103
|
-
|
104
92
|
end
|
105
|
-
|
106
93
|
end
|
@@ -0,0 +1,125 @@
|
|
1
|
+
require 'mocha/ruby_version'
|
2
|
+
require 'mocha/singleton_class'
|
3
|
+
|
4
|
+
module Mocha
|
5
|
+
class StubbedMethod
|
6
|
+
PrependedModule = Class.new(Module)
|
7
|
+
|
8
|
+
attr_reader :stubbee, :method_name
|
9
|
+
|
10
|
+
def initialize(stubbee, method_name)
|
11
|
+
@stubbee = stubbee
|
12
|
+
@original_method = nil
|
13
|
+
@original_visibility = nil
|
14
|
+
@method_name = PRE_RUBY_V19 ? method_name.to_s : method_name.to_sym
|
15
|
+
end
|
16
|
+
|
17
|
+
def stub
|
18
|
+
hide_original_method
|
19
|
+
define_new_method
|
20
|
+
end
|
21
|
+
|
22
|
+
def unstub
|
23
|
+
remove_new_method
|
24
|
+
restore_original_method
|
25
|
+
mock.unstub(method_name.to_sym)
|
26
|
+
return if mock.any_expectations?
|
27
|
+
reset_mocha
|
28
|
+
end
|
29
|
+
|
30
|
+
def mock
|
31
|
+
mock_owner.mocha
|
32
|
+
end
|
33
|
+
|
34
|
+
def reset_mocha
|
35
|
+
mock_owner.reset_mocha
|
36
|
+
end
|
37
|
+
|
38
|
+
def hide_original_method
|
39
|
+
return unless original_method_owner.__method_exists__?(method_name)
|
40
|
+
store_original_method_visibility
|
41
|
+
if use_prepended_module_for_stub_method?
|
42
|
+
use_prepended_module_for_stub_method
|
43
|
+
else
|
44
|
+
begin
|
45
|
+
store_original_method
|
46
|
+
# rubocop:disable Lint/HandleExceptions
|
47
|
+
rescue NameError
|
48
|
+
# deal with nasties like ActiveRecord::Associations::AssociationProxy
|
49
|
+
end
|
50
|
+
# rubocop:enable Lint/HandleExceptions
|
51
|
+
if stub_method_overwrites_original_method?
|
52
|
+
remove_original_method_from_stubbee
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
def define_new_method
|
58
|
+
self_in_scope = self
|
59
|
+
method_name_in_scope = method_name
|
60
|
+
stub_method_owner.send(:define_method, method_name) do |*args, &block|
|
61
|
+
self_in_scope.mock.method_missing(method_name_in_scope, *args, &block)
|
62
|
+
end
|
63
|
+
retain_original_visibility(stub_method_owner)
|
64
|
+
end
|
65
|
+
|
66
|
+
def remove_new_method
|
67
|
+
stub_method_owner.send(:remove_method, method_name)
|
68
|
+
end
|
69
|
+
|
70
|
+
def store_original_method
|
71
|
+
@original_method = stubbee_method(method_name)
|
72
|
+
end
|
73
|
+
|
74
|
+
def restore_original_method
|
75
|
+
return if use_prepended_module_for_stub_method?
|
76
|
+
if stub_method_overwrites_original_method?
|
77
|
+
original_method_owner.send(:define_method, method_name, method_body(@original_method))
|
78
|
+
end
|
79
|
+
retain_original_visibility(original_method_owner)
|
80
|
+
end
|
81
|
+
|
82
|
+
def matches?(other)
|
83
|
+
return false unless other.class == self.class
|
84
|
+
(stubbee.object_id == other.stubbee.object_id) && (method_name == other.method_name)
|
85
|
+
end
|
86
|
+
|
87
|
+
alias_method :==, :eql?
|
88
|
+
|
89
|
+
def to_s
|
90
|
+
"#{stubbee}.#{method_name}"
|
91
|
+
end
|
92
|
+
|
93
|
+
private
|
94
|
+
|
95
|
+
def retain_original_visibility(method_owner)
|
96
|
+
return unless @original_visibility
|
97
|
+
Module.instance_method(@original_visibility).bind(method_owner).call(method_name)
|
98
|
+
end
|
99
|
+
|
100
|
+
def store_original_method_visibility
|
101
|
+
@original_visibility = original_method_owner.__method_visibility__(method_name)
|
102
|
+
end
|
103
|
+
|
104
|
+
def stub_method_overwrites_original_method?
|
105
|
+
@original_method && @original_method.owner == original_method_owner
|
106
|
+
end
|
107
|
+
|
108
|
+
def remove_original_method_from_stubbee
|
109
|
+
original_method_owner.send(:remove_method, method_name)
|
110
|
+
end
|
111
|
+
|
112
|
+
def use_prepended_module_for_stub_method?
|
113
|
+
RUBY_V2_PLUS
|
114
|
+
end
|
115
|
+
|
116
|
+
def use_prepended_module_for_stub_method
|
117
|
+
@stub_method_owner = PrependedModule.new
|
118
|
+
original_method_owner.__send__ :prepend, @stub_method_owner
|
119
|
+
end
|
120
|
+
|
121
|
+
def stub_method_owner
|
122
|
+
@stub_method_owner ||= original_method_owner
|
123
|
+
end
|
124
|
+
end
|
125
|
+
end
|
data/lib/mocha/stubbing_error.rb
CHANGED
@@ -1,19 +1,8 @@
|
|
1
|
-
require 'mocha/
|
1
|
+
require 'mocha/error_with_filtered_backtrace'
|
2
2
|
|
3
3
|
module Mocha
|
4
|
-
|
5
4
|
# Exception raised when stubbing a particular method is not allowed.
|
6
5
|
#
|
7
6
|
# @see Configuration.prevent
|
8
|
-
class StubbingError <
|
9
|
-
|
10
|
-
# @private
|
11
|
-
def initialize(message = nil, backtrace = [])
|
12
|
-
super(message)
|
13
|
-
filter = BacktraceFilter.new
|
14
|
-
set_backtrace(filter.filtered(backtrace))
|
15
|
-
end
|
16
|
-
|
17
|
-
end
|
18
|
-
|
7
|
+
class StubbingError < ErrorWithFilteredBacktrace; end
|
19
8
|
end
|
data/lib/mocha/test_unit.rb
CHANGED
@@ -1,3 +1,8 @@
|
|
1
|
-
require
|
1
|
+
require 'mocha/integration/test_unit'
|
2
|
+
require 'mocha/deprecation'
|
2
3
|
|
3
|
-
Mocha::Integration::TestUnit.activate
|
4
|
+
unless Mocha::Integration::TestUnit.activate
|
5
|
+
Mocha::Deprecation.warning(
|
6
|
+
"Test::Unit must be loaded *before* `require 'mocha/test_unit'`."
|
7
|
+
)
|
8
|
+
end
|
data/lib/mocha/thrower.rb
CHANGED
@@ -1,15 +1,13 @@
|
|
1
1
|
module Mocha
|
2
|
-
|
3
2
|
class Thrower
|
4
|
-
|
5
3
|
def initialize(tag, object = nil)
|
6
|
-
@tag
|
4
|
+
@tag = tag
|
5
|
+
@object = object
|
7
6
|
end
|
8
7
|
|
9
|
-
def evaluate
|
8
|
+
def evaluate(invocation)
|
9
|
+
invocation.threw(@tag, @object)
|
10
10
|
throw @tag, @object
|
11
11
|
end
|
12
|
-
|
13
12
|
end
|
14
|
-
|
15
13
|
end
|
data/lib/mocha/version.rb
CHANGED
@@ -1,31 +1,21 @@
|
|
1
|
-
require 'mocha/no_yields'
|
2
|
-
require 'mocha/single_yield'
|
3
|
-
require 'mocha/multiple_yields'
|
4
|
-
|
5
1
|
module Mocha
|
6
|
-
|
7
2
|
class YieldParameters
|
8
|
-
|
9
3
|
def initialize
|
10
4
|
@parameter_groups = []
|
11
5
|
end
|
12
6
|
|
13
7
|
def next_invocation
|
14
8
|
case @parameter_groups.length
|
15
|
-
|
16
|
-
|
17
|
-
|
9
|
+
when 0 then []
|
10
|
+
when 1 then @parameter_groups.first
|
11
|
+
else @parameter_groups.shift
|
18
12
|
end
|
19
13
|
end
|
20
14
|
|
21
|
-
def add(*
|
22
|
-
@parameter_groups <<
|
23
|
-
|
24
|
-
|
25
|
-
def multiple_add(*parameter_groups)
|
26
|
-
@parameter_groups << MultipleYields.new(*parameter_groups)
|
15
|
+
def add(*parameter_groups)
|
16
|
+
@parameter_groups << parameter_groups.map do |pg|
|
17
|
+
pg.is_a?(Array) ? pg : [pg]
|
18
|
+
end
|
27
19
|
end
|
28
|
-
|
29
20
|
end
|
30
|
-
|
31
21
|
end
|
data/lib/mocha.rb
CHANGED
data/mocha.gemspec
CHANGED
@@ -1,53 +1,55 @@
|
|
1
|
-
# -*- encoding: utf-8 -*-
|
2
1
|
lib = File.expand_path('../lib/', __FILE__)
|
3
2
|
$LOAD_PATH.unshift lib unless $LOAD_PATH.include?(lib)
|
4
|
-
require
|
3
|
+
require 'mocha/version'
|
5
4
|
|
6
|
-
Gem::Specification.new do |s|
|
7
|
-
s.name =
|
5
|
+
Gem::Specification.new do |s| # rubocop:disable Metrics/BlockLength
|
6
|
+
s.name = 'mocha'
|
8
7
|
s.version = Mocha::VERSION
|
8
|
+
s.licenses = ['MIT', 'BSD-2-Clause']
|
9
|
+
s.required_ruby_version = '>= 1.8.7'
|
9
10
|
|
10
|
-
s.
|
11
|
-
s.
|
12
|
-
s.
|
13
|
-
s.email = "mocha-developer@googlegroups.com"
|
11
|
+
s.authors = ['James Mead']
|
12
|
+
s.description = 'Mocking and stubbing library with JMock/SchMock syntax, which allows mocking and stubbing of methods on real (non-mock) classes.'
|
13
|
+
s.email = 'mocha-developer@googlegroups.com'
|
14
14
|
|
15
|
-
s.files =
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
s.
|
20
|
-
s.require_paths = ["lib"]
|
21
|
-
s.rubyforge_project = "mocha"
|
22
|
-
s.summary = "Mocking and stubbing library"
|
23
|
-
s.has_rdoc = "yard"
|
15
|
+
s.files = Dir.chdir(File.expand_path('..', __FILE__)) do
|
16
|
+
`git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(docs|test)/}) }
|
17
|
+
end
|
18
|
+
s.files.delete('.circleci/config.yml')
|
19
|
+
s.files.delete('.gitignore')
|
24
20
|
|
25
|
-
s.
|
26
|
-
|
27
|
-
|
28
|
-
s.specification_version = 3
|
21
|
+
s.homepage = 'https://mocha.jamesmead.org'
|
22
|
+
s.require_paths = ['lib']
|
23
|
+
s.summary = 'Mocking and stubbing library'
|
29
24
|
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
s.add_development_dependency("yard")
|
35
|
-
s.add_development_dependency("redcarpet", "~> 1")
|
36
|
-
end
|
37
|
-
else
|
38
|
-
s.add_dependency("rake", ">= 0")
|
39
|
-
s.add_dependency("introspection", "~> 0.0.1")
|
40
|
-
unless ENV["MOCHA_NO_DOCS"]
|
41
|
-
s.add_dependency("yard")
|
42
|
-
s.add_dependency("redcarpet", "~> 1")
|
25
|
+
unless s.respond_to?(:add_development_dependency)
|
26
|
+
class << s
|
27
|
+
def add_development_dependency(*args)
|
28
|
+
add_dependency(*args)
|
43
29
|
end
|
44
30
|
end
|
31
|
+
end
|
32
|
+
|
33
|
+
if RUBY_VERSION < '1.9.3'
|
34
|
+
s.add_development_dependency 'rake', '~> 10.0'
|
35
|
+
elsif RUBY_VERSION < '2'
|
36
|
+
s.add_development_dependency 'rake', '~> 12.2.1'
|
37
|
+
elsif RUBY_VERSION < '2.2'
|
38
|
+
s.add_development_dependency 'rake', '~> 12.3.3'
|
45
39
|
else
|
46
|
-
s.
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
40
|
+
s.add_development_dependency 'rake'
|
41
|
+
end
|
42
|
+
|
43
|
+
s.add_development_dependency('introspection', '~> 0.0.1')
|
44
|
+
if RUBY_VERSION >= '2.2.0'
|
45
|
+
# No test libraries in standard library
|
46
|
+
s.add_development_dependency('minitest')
|
47
|
+
end
|
48
|
+
if RUBY_VERSION >= '2.2.0'
|
49
|
+
s.add_development_dependency('rubocop', '<= 0.58.2')
|
50
|
+
end
|
51
|
+
if ENV['MOCHA_GENERATE_DOCS']
|
52
|
+
s.add_development_dependency('redcarpet')
|
53
|
+
s.add_development_dependency('yard')
|
52
54
|
end
|
53
55
|
end
|
@@ -1,11 +1,8 @@
|
|
1
|
-
<script src="/
|
2
|
-
|
1
|
+
<script async src="https://www.googletagmanager.com/gtag/js?id=<%= ENV['GOOGLE_ANALYTICS_WEB_PROPERTY_ID'] %>"></script>
|
3
2
|
<script>
|
4
|
-
|
5
|
-
(
|
6
|
-
|
7
|
-
})(window,document,'script','//www.google-analytics.com/analytics.js','ga');
|
3
|
+
window.dataLayer = window.dataLayer || [];
|
4
|
+
function gtag(){dataLayer.push(arguments);}
|
5
|
+
gtag('js', new Date());
|
8
6
|
|
9
|
-
|
10
|
-
|
11
|
-
</script>
|
7
|
+
gtag('config', '<%= ENV['GOOGLE_ANALYTICS_WEB_PROPERTY_ID'] %>');
|
8
|
+
</script>
|