mocha 1.8.0 → 1.13.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.github/FUNDING.yml +1 -0
- data/.rubocop.yml +3 -0
- data/.rubocop_todo.yml +7 -30
- data/.yardopts +1 -0
- data/CONTRIBUTING.md +1 -1
- data/README.md +56 -31
- data/RELEASE.md +166 -0
- data/Rakefile +15 -7
- data/init.rb +1 -3
- data/lib/mocha/any_instance_method.rb +11 -53
- data/lib/mocha/api.rb +119 -56
- data/lib/mocha/block_matcher.rb +31 -0
- data/lib/mocha/cardinality.rb +52 -34
- data/lib/mocha/class_methods.rb +17 -15
- data/lib/mocha/configuration.rb +351 -67
- data/lib/mocha/deprecation.rb +2 -1
- data/lib/mocha/detection/test_unit.rb +1 -3
- data/lib/mocha/exception_raiser.rb +2 -1
- data/lib/mocha/expectation.rb +120 -81
- data/lib/mocha/expectation_error.rb +1 -3
- data/lib/mocha/expectation_list.rb +6 -6
- data/lib/mocha/inspect.rb +30 -26
- data/lib/mocha/instance_method.rb +19 -2
- data/lib/mocha/integration/mini_test.rb +7 -0
- data/lib/mocha/integration/test_unit.rb +7 -0
- data/lib/mocha/integration.rb +1 -3
- data/lib/mocha/invocation.rb +77 -0
- data/lib/mocha/macos_version.rb +5 -0
- data/lib/mocha/minitest.rb +6 -1
- data/lib/mocha/mock.rb +80 -39
- data/lib/mocha/mockery.rb +34 -80
- data/lib/mocha/names.rb +1 -1
- data/lib/mocha/object_methods.rb +13 -19
- data/lib/mocha/parameter_matchers/all_of.rb +1 -1
- data/lib/mocha/parameter_matchers/any_of.rb +1 -1
- data/lib/mocha/parameter_matchers/equivalent_uri.rb +0 -9
- data/lib/mocha/parameter_matchers/has_entries.rb +2 -3
- data/lib/mocha/parameter_matchers/has_entry.rb +24 -16
- data/lib/mocha/parameter_matchers/has_key.rb +2 -3
- data/lib/mocha/parameter_matchers/has_keys.rb +53 -0
- data/lib/mocha/parameter_matchers/has_value.rb +2 -3
- data/lib/mocha/parameter_matchers/includes.rb +2 -0
- data/lib/mocha/parameter_matchers/instance_methods.rb +18 -0
- data/lib/mocha/parameter_matchers/is_a.rb +2 -3
- data/lib/mocha/parameter_matchers/not.rb +2 -3
- data/lib/mocha/parameter_matchers.rb +2 -1
- data/lib/mocha/raised_exception.rb +11 -0
- data/lib/mocha/return_values.rb +3 -3
- data/lib/mocha/setup.rb +5 -0
- data/lib/mocha/single_return_value.rb +2 -1
- data/lib/mocha/singleton_class.rb +9 -0
- data/lib/mocha/state_machine.rb +31 -40
- data/lib/mocha/stubbed_method.rb +125 -0
- data/lib/mocha/test_unit.rb +6 -1
- data/lib/mocha/thrower.rb +2 -1
- data/lib/mocha/thrown_object.rb +12 -0
- data/lib/mocha/version.rb +1 -1
- data/lib/mocha/yield_parameters.rb +5 -11
- data/lib/mocha.rb +8 -0
- data/mocha.gemspec +14 -10
- metadata +16 -233
- data/bin/build-matrix +0 -83
- data/docs/CNAME +0 -1
- data/docs/Mocha/API.html +0 -1056
- data/docs/Mocha/ClassMethods.html +0 -267
- data/docs/Mocha/Configuration.html +0 -626
- data/docs/Mocha/Expectation.html +0 -2709
- data/docs/Mocha/ExpectationError.html +0 -157
- data/docs/Mocha/ExpectationErrorFactory.html +0 -269
- data/docs/Mocha/Hooks.html +0 -385
- data/docs/Mocha/Integration/MiniTest/Adapter.html +0 -165
- data/docs/Mocha/Integration/MiniTest.html +0 -123
- data/docs/Mocha/Integration/TestUnit/Adapter.html +0 -165
- data/docs/Mocha/Integration/TestUnit.html +0 -123
- data/docs/Mocha/Integration.html +0 -125
- data/docs/Mocha/Mock.html +0 -1197
- data/docs/Mocha/ObjectMethods.html +0 -712
- data/docs/Mocha/ParameterMatchers/AllOf.html +0 -154
- data/docs/Mocha/ParameterMatchers/AnyOf.html +0 -154
- data/docs/Mocha/ParameterMatchers/AnyParameters.html +0 -153
- data/docs/Mocha/ParameterMatchers/Anything.html +0 -153
- data/docs/Mocha/ParameterMatchers/Base.html +0 -448
- data/docs/Mocha/ParameterMatchers/Equals.html +0 -154
- data/docs/Mocha/ParameterMatchers/EquivalentUri.html +0 -153
- data/docs/Mocha/ParameterMatchers/HasEntries.html +0 -154
- data/docs/Mocha/ParameterMatchers/HasEntry.html +0 -154
- data/docs/Mocha/ParameterMatchers/HasKey.html +0 -154
- data/docs/Mocha/ParameterMatchers/HasValue.html +0 -154
- data/docs/Mocha/ParameterMatchers/Includes.html +0 -154
- data/docs/Mocha/ParameterMatchers/InstanceOf.html +0 -154
- data/docs/Mocha/ParameterMatchers/IsA.html +0 -153
- data/docs/Mocha/ParameterMatchers/KindOf.html +0 -154
- data/docs/Mocha/ParameterMatchers/Not.html +0 -154
- data/docs/Mocha/ParameterMatchers/Optionally.html +0 -153
- data/docs/Mocha/ParameterMatchers/RegexpMatches.html +0 -154
- data/docs/Mocha/ParameterMatchers/RespondsWith.html +0 -154
- data/docs/Mocha/ParameterMatchers/YamlEquivalent.html +0 -154
- data/docs/Mocha/ParameterMatchers.html +0 -3049
- data/docs/Mocha/Sequence.html +0 -149
- data/docs/Mocha/StateMachine/State.html +0 -141
- data/docs/Mocha/StateMachine/StatePredicate.html +0 -141
- data/docs/Mocha/StateMachine.html +0 -539
- data/docs/Mocha/StubbingError.html +0 -150
- data/docs/Mocha/UnexpectedInvocation.html +0 -140
- data/docs/Mocha.html +0 -127
- data/docs/_index.html +0 -537
- data/docs/class_list.html +0 -51
- data/docs/css/common.css +0 -1
- data/docs/css/full_list.css +0 -58
- data/docs/css/style.css +0 -496
- data/docs/file.COPYING.html +0 -81
- data/docs/file.MIT-LICENSE.html +0 -85
- data/docs/file.README.html +0 -418
- data/docs/file.RELEASE.html +0 -875
- data/docs/file_list.html +0 -71
- data/docs/frames.html +0 -17
- data/docs/index.html +0 -418
- data/docs/js/app.js +0 -292
- data/docs/js/full_list.js +0 -216
- data/docs/js/jquery.js +0 -4
- data/docs/method_list.html +0 -571
- data/docs/top-level-namespace.html +0 -118
- 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 -113
- data/lib/mocha/mini_test.rb +0 -5
- data/lib/mocha/module_method.rb +0 -6
- data/lib/mocha/module_methods.rb +0 -10
- data/lib/mocha/multiple_yields.rb +0 -15
- data/lib/mocha/no_yields.rb +0 -5
- data/lib/mocha/parameter_matchers/object.rb +0 -15
- data/lib/mocha/pretty_parameters.rb +0 -24
- data/lib/mocha/single_yield.rb +0 -13
- data/lib/mocha/standalone.rb +0 -4
- data/lib/mocha/unexpected_invocation.rb +0 -24
- data/lib/mocha_standalone.rb +0 -4
- data/test/acceptance/acceptance_test_helper.rb +0 -35
- data/test/acceptance/bug_18914_test.rb +0 -38
- data/test/acceptance/bug_21465_test.rb +0 -32
- data/test/acceptance/bug_21563_test.rb +0 -23
- data/test/acceptance/exception_rescue_test.rb +0 -54
- data/test/acceptance/expectations_on_multiple_methods_test.rb +0 -56
- data/test/acceptance/expected_invocation_count_test.rb +0 -230
- data/test/acceptance/failure_messages_test.rb +0 -62
- data/test/acceptance/issue_272_test.rb +0 -51
- data/test/acceptance/issue_65_test.rb +0 -65
- data/test/acceptance/issue_70_test.rb +0 -54
- data/test/acceptance/mocha_example_test.rb +0 -97
- data/test/acceptance/mocha_test_result_test.rb +0 -84
- data/test/acceptance/mock_test.rb +0 -98
- data/test/acceptance/mock_with_initializer_block_test.rb +0 -56
- data/test/acceptance/mocked_methods_dispatch_test.rb +0 -76
- data/test/acceptance/multiple_expectations_failure_message_test.rb +0 -67
- data/test/acceptance/optional_parameters_test.rb +0 -68
- data/test/acceptance/parameter_matcher_test.rb +0 -300
- data/test/acceptance/partial_mocks_test.rb +0 -45
- data/test/acceptance/prepend_test.rb +0 -87
- data/test/acceptance/prevent_use_of_mocha_outside_test_test.rb +0 -77
- data/test/acceptance/raise_exception_test.rb +0 -37
- data/test/acceptance/return_value_test.rb +0 -50
- data/test/acceptance/sequence_test.rb +0 -190
- data/test/acceptance/states_test.rb +0 -72
- data/test/acceptance/stub_any_instance_method_defined_on_superclass_test.rb +0 -65
- data/test/acceptance/stub_any_instance_method_test.rb +0 -282
- 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 -79
- data/test/acceptance/stub_class_method_defined_on_module_test.rb +0 -74
- data/test/acceptance/stub_class_method_defined_on_superclass_test.rb +0 -145
- data/test/acceptance/stub_everything_test.rb +0 -54
- data/test/acceptance/stub_instance_method_defined_on_active_record_association_proxy_test.rb +0 -92
- data/test/acceptance/stub_instance_method_defined_on_class_and_aliased_test.rb +0 -68
- data/test/acceptance/stub_instance_method_defined_on_class_test.rb +0 -68
- data/test/acceptance/stub_instance_method_defined_on_kernel_module_test.rb +0 -137
- data/test/acceptance/stub_instance_method_defined_on_module_test.rb +0 -77
- data/test/acceptance/stub_instance_method_defined_on_object_class_test.rb +0 -76
- data/test/acceptance/stub_instance_method_defined_on_singleton_class_test.rb +0 -68
- data/test/acceptance/stub_instance_method_defined_on_superclass_test.rb +0 -71
- data/test/acceptance/stub_method_defined_on_module_and_aliased_test.rb +0 -39
- data/test/acceptance/stub_module_method_test.rb +0 -201
- data/test/acceptance/stub_test.rb +0 -50
- data/test/acceptance/stubba_example_test.rb +0 -94
- data/test/acceptance/stubba_test_result_test.rb +0 -72
- data/test/acceptance/stubbing_error_backtrace_test.rb +0 -64
- data/test/acceptance/stubbing_frozen_object_test.rb +0 -89
- data/test/acceptance/stubbing_method_accepting_block_parameter_test.rb +0 -53
- data/test/acceptance/stubbing_method_unnecessarily_test.rb +0 -63
- data/test/acceptance/stubbing_nil_test.rb +0 -60
- data/test/acceptance/stubbing_non_existent_any_instance_method_test.rb +0 -141
- data/test/acceptance/stubbing_non_existent_class_method_test.rb +0 -157
- data/test/acceptance/stubbing_non_existent_instance_method_test.rb +0 -145
- data/test/acceptance/stubbing_non_public_any_instance_method_test.rb +0 -128
- data/test/acceptance/stubbing_non_public_class_method_test.rb +0 -163
- data/test/acceptance/stubbing_non_public_instance_method_test.rb +0 -141
- data/test/acceptance/stubbing_on_non_mock_object_test.rb +0 -70
- data/test/acceptance/stubbing_same_class_method_on_parent_and_child_classes_test.rb +0 -34
- data/test/acceptance/throw_test.rb +0 -43
- data/test/acceptance/unexpected_invocation_test.rb +0 -24
- data/test/acceptance/unstubbing_test.rb +0 -195
- 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 -176
- data/test/integration/test_unit_test.rb +0 -8
- data/test/method_definer.rb +0 -22
- data/test/mini_test_result.rb +0 -96
- data/test/minitest_result.rb +0 -48
- data/test/simple_counter.rb +0 -11
- data/test/test_helper.rb +0 -58
- data/test/test_runner.rb +0 -56
- data/test/test_unit_result.rb +0 -22
- data/test/unit/any_instance_method_test.rb +0 -150
- data/test/unit/array_inspect_test.rb +0 -14
- data/test/unit/backtrace_filter_test.rb +0 -17
- data/test/unit/cardinality_test.rb +0 -54
- data/test/unit/central_test.rb +0 -99
- data/test/unit/change_state_side_effect_test.rb +0 -37
- data/test/unit/class_method_test.rb +0 -254
- data/test/unit/class_methods_test.rb +0 -69
- data/test/unit/configuration_test.rb +0 -37
- data/test/unit/date_time_inspect_test.rb +0 -19
- data/test/unit/exception_raiser_test.rb +0 -40
- data/test/unit/expectation_list_test.rb +0 -80
- data/test/unit/expectation_test.rb +0 -492
- data/test/unit/hash_inspect_test.rb +0 -14
- data/test/unit/hooks_test.rb +0 -35
- data/test/unit/in_state_ordering_constraint_test.rb +0 -39
- data/test/unit/method_matcher_test.rb +0 -26
- data/test/unit/mock_test.rb +0 -363
- data/test/unit/mockery_test.rb +0 -174
- data/test/unit/module_methods_test.rb +0 -17
- data/test/unit/multiple_yields_test.rb +0 -16
- data/test/unit/no_yields_test.rb +0 -16
- data/test/unit/object_inspect_test.rb +0 -58
- data/test/unit/object_methods_test.rb +0 -62
- data/test/unit/parameter_matchers/all_of_test.rb +0 -24
- data/test/unit/parameter_matchers/any_of_test.rb +0 -24
- data/test/unit/parameter_matchers/anything_test.rb +0 -19
- data/test/unit/parameter_matchers/equals_test.rb +0 -23
- data/test/unit/parameter_matchers/equivalent_uri_test.rb +0 -50
- data/test/unit/parameter_matchers/has_entries_test.rb +0 -51
- data/test/unit/parameter_matchers/has_entry_test.rb +0 -128
- data/test/unit/parameter_matchers/has_key_test.rb +0 -54
- data/test/unit/parameter_matchers/has_value_test.rb +0 -55
- data/test/unit/parameter_matchers/includes_test.rb +0 -106
- data/test/unit/parameter_matchers/instance_of_test.rb +0 -23
- data/test/unit/parameter_matchers/is_a_test.rb +0 -23
- data/test/unit/parameter_matchers/kind_of_test.rb +0 -23
- data/test/unit/parameter_matchers/not_test.rb +0 -24
- data/test/unit/parameter_matchers/regexp_matches_test.rb +0 -45
- data/test/unit/parameter_matchers/responds_with_test.rb +0 -38
- data/test/unit/parameter_matchers/stub_matcher.rb +0 -23
- data/test/unit/parameter_matchers/yaml_equivalent_test.rb +0 -23
- data/test/unit/parameters_matcher_test.rb +0 -119
- data/test/unit/receivers_test.rb +0 -96
- data/test/unit/return_values_test.rb +0 -61
- data/test/unit/sequence_test.rb +0 -100
- data/test/unit/single_return_value_test.rb +0 -12
- data/test/unit/single_yield_test.rb +0 -16
- data/test/unit/state_machine_test.rb +0 -96
- data/test/unit/string_inspect_test.rb +0 -9
- data/test/unit/thrower_test.rb +0 -18
- data/test/unit/yield_parameters_test.rb +0 -91
@@ -20,11 +20,10 @@ module Mocha
|
|
20
20
|
# object.expects(:method_1).with(has_value(1))
|
21
21
|
# object.method_1('key_2' => 2)
|
22
22
|
# # error raised, because method_1 was not called with Hash containing value: 1
|
23
|
-
#
|
24
|
-
def has_value(value)
|
23
|
+
#
|
24
|
+
def has_value(value) # rubocop:disable Naming/PredicateName
|
25
25
|
HasValue.new(value)
|
26
26
|
end
|
27
|
-
# rubocop:enable Naming/PredicateName
|
28
27
|
|
29
28
|
# Parameter matcher which matches when actual parameter contains +Hash+ entry with expected value.
|
30
29
|
class HasValue < Base
|
@@ -72,6 +72,7 @@ module Mocha
|
|
72
72
|
end
|
73
73
|
|
74
74
|
# @private
|
75
|
+
# rubocop:disable Metrics/PerceivedComplexity
|
75
76
|
def matches?(available_parameters)
|
76
77
|
parameter = available_parameters.shift
|
77
78
|
return false unless parameter.respond_to?(:include?)
|
@@ -89,6 +90,7 @@ module Mocha
|
|
89
90
|
AllOf.new(*includes_matchers).matches?([parameter])
|
90
91
|
end
|
91
92
|
end
|
93
|
+
# rubocop:enable Metrics/PerceivedComplexity
|
92
94
|
|
93
95
|
# @private
|
94
96
|
def mocha_inspect
|
@@ -0,0 +1,18 @@
|
|
1
|
+
require 'mocha/parameter_matchers/equals'
|
2
|
+
|
3
|
+
module Mocha
|
4
|
+
module ParameterMatchers
|
5
|
+
# @private
|
6
|
+
module InstanceMethods
|
7
|
+
# @private
|
8
|
+
def to_matcher
|
9
|
+
Mocha::ParameterMatchers::Equals.new(self)
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
# @private
|
16
|
+
class Object
|
17
|
+
include Mocha::ParameterMatchers::InstanceMethods
|
18
|
+
end
|
@@ -21,11 +21,10 @@ module Mocha
|
|
21
21
|
# object.expects(:method_1).with(is_a(Integer))
|
22
22
|
# object.method_1('string')
|
23
23
|
# # error raised, because method_1 was not called with an Integer
|
24
|
-
#
|
25
|
-
def is_a(klass)
|
24
|
+
#
|
25
|
+
def is_a(klass) # rubocop:disable Naming/PredicateName
|
26
26
|
IsA.new(klass)
|
27
27
|
end
|
28
|
-
# rubocop:enable Naming/PredicateName
|
29
28
|
|
30
29
|
# Parameter matcher which matches when actual parameter is a specific class.
|
31
30
|
class IsA < Base
|
@@ -20,11 +20,10 @@ module Mocha
|
|
20
20
|
# object.expects(:method_1).with(Not(includes(1)))
|
21
21
|
# object.method_1([0, 1, 2, 3])
|
22
22
|
# # error raised, because method_1 was not called with object not including 1
|
23
|
-
#
|
24
|
-
def Not(matcher)
|
23
|
+
#
|
24
|
+
def Not(matcher) # rubocop:disable Naming/MethodName
|
25
25
|
Not.new(matcher)
|
26
26
|
end
|
27
|
-
# rubocop:enable Naming/MethodName
|
28
27
|
|
29
28
|
# Parameter matcher which inverts the logic of the specified matcher using a logical NOT operation.
|
30
29
|
class Not < Base
|
@@ -3,7 +3,7 @@ module Mocha
|
|
3
3
|
module ParameterMatchers; end
|
4
4
|
end
|
5
5
|
|
6
|
-
require 'mocha/parameter_matchers/
|
6
|
+
require 'mocha/parameter_matchers/instance_methods'
|
7
7
|
|
8
8
|
require 'mocha/parameter_matchers/all_of'
|
9
9
|
require 'mocha/parameter_matchers/any_of'
|
@@ -13,6 +13,7 @@ require 'mocha/parameter_matchers/equals'
|
|
13
13
|
require 'mocha/parameter_matchers/has_entry'
|
14
14
|
require 'mocha/parameter_matchers/has_entries'
|
15
15
|
require 'mocha/parameter_matchers/has_key'
|
16
|
+
require 'mocha/parameter_matchers/has_keys'
|
16
17
|
require 'mocha/parameter_matchers/has_value'
|
17
18
|
require 'mocha/parameter_matchers/includes'
|
18
19
|
require 'mocha/parameter_matchers/instance_of'
|
data/lib/mocha/return_values.rb
CHANGED
@@ -12,11 +12,11 @@ module Mocha
|
|
12
12
|
@values = values
|
13
13
|
end
|
14
14
|
|
15
|
-
def next
|
15
|
+
def next(invocation)
|
16
16
|
case @values.length
|
17
17
|
when 0 then nil
|
18
|
-
when 1 then @values.first.evaluate
|
19
|
-
else @values.shift.evaluate
|
18
|
+
when 1 then @values.first.evaluate(invocation)
|
19
|
+
else @values.shift.evaluate(invocation)
|
20
20
|
end
|
21
21
|
end
|
22
22
|
|
data/lib/mocha/setup.rb
CHANGED
data/lib/mocha/state_machine.rb
CHANGED
@@ -2,46 +2,32 @@ module Mocha
|
|
2
2
|
# A state machine that is used to constrain the order of invocations.
|
3
3
|
# An invocation can be constrained to occur when a state {#is}, or {#is_not}, active.
|
4
4
|
class StateMachine
|
5
|
-
# Provides
|
6
|
-
class
|
5
|
+
# Provides the ability to determine whether a {StateMachine} is in a specified state at some point in the future.
|
6
|
+
class StatePredicate
|
7
7
|
# @private
|
8
|
-
def initialize(state_machine, state)
|
8
|
+
def initialize(state_machine, state, description, &active_check)
|
9
9
|
@state_machine = state_machine
|
10
10
|
@state = state
|
11
|
-
|
12
|
-
|
13
|
-
# @private
|
14
|
-
def activate
|
15
|
-
@state_machine.current_state = @state
|
11
|
+
@description = description
|
12
|
+
@active_check = active_check
|
16
13
|
end
|
17
14
|
|
18
15
|
# @private
|
19
16
|
def active?
|
20
|
-
@state_machine.current_state
|
17
|
+
@active_check.call(@state_machine.current_state, @state)
|
21
18
|
end
|
22
19
|
|
23
20
|
# @private
|
24
21
|
def mocha_inspect
|
25
|
-
"#{@state_machine.name}
|
22
|
+
"#{@state_machine.name} #{@description} #{@state.mocha_inspect}"
|
26
23
|
end
|
27
24
|
end
|
28
25
|
|
29
|
-
# Provides
|
30
|
-
class StatePredicate
|
31
|
-
# @private
|
32
|
-
def initialize(state_machine, state)
|
33
|
-
@state_machine = state_machine
|
34
|
-
@state = state
|
35
|
-
end
|
36
|
-
|
37
|
-
# @private
|
38
|
-
def active?
|
39
|
-
@state_machine.current_state != @state
|
40
|
-
end
|
41
|
-
|
26
|
+
# Provides a mechanism to change the state of a {StateMachine} at some point in the future.
|
27
|
+
class State < StatePredicate
|
42
28
|
# @private
|
43
|
-
def
|
44
|
-
|
29
|
+
def activate
|
30
|
+
@state_machine.current_state = @state
|
45
31
|
end
|
46
32
|
end
|
47
33
|
|
@@ -73,30 +59,35 @@ module Mocha
|
|
73
59
|
@current_state = next_state_name
|
74
60
|
end
|
75
61
|
|
76
|
-
# 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.
|
77
63
|
#
|
78
|
-
#
|
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.
|
79
66
|
#
|
80
|
-
# @
|
81
|
-
#
|
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+
|
71
|
+
#
|
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+.
|
82
76
|
def is(state_name)
|
83
|
-
State.new(self, state_name)
|
77
|
+
State.new(self, state_name, 'is') { |current, given| current == given }
|
84
78
|
end
|
85
79
|
|
86
|
-
# Provides a mechanism to determine whether the {StateMachine} is not in the state specified by +
|
87
|
-
#
|
88
|
-
|
89
|
-
|
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 }
|
90
86
|
end
|
91
|
-
# rubocop:enable Naming/PredicateName
|
92
87
|
|
93
88
|
# @private
|
94
89
|
def mocha_inspect
|
95
|
-
|
96
|
-
"#{@name} is #{@current_state.mocha_inspect}"
|
97
|
-
else
|
98
|
-
"#{@name} has no current state"
|
99
|
-
end
|
90
|
+
%(#{@name} #{@current_state ? "is #{@current_state.mocha_inspect}" : 'has no current state'})
|
100
91
|
end
|
101
92
|
end
|
102
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/test_unit.rb
CHANGED
@@ -1,3 +1,8 @@
|
|
1
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
data/lib/mocha/version.rb
CHANGED
@@ -1,7 +1,3 @@
|
|
1
|
-
require 'mocha/no_yields'
|
2
|
-
require 'mocha/single_yield'
|
3
|
-
require 'mocha/multiple_yields'
|
4
|
-
|
5
1
|
module Mocha
|
6
2
|
class YieldParameters
|
7
3
|
def initialize
|
@@ -10,18 +6,16 @@ module Mocha
|
|
10
6
|
|
11
7
|
def next_invocation
|
12
8
|
case @parameter_groups.length
|
13
|
-
when 0 then
|
9
|
+
when 0 then []
|
14
10
|
when 1 then @parameter_groups.first
|
15
11
|
else @parameter_groups.shift
|
16
12
|
end
|
17
13
|
end
|
18
14
|
|
19
|
-
def add(*
|
20
|
-
@parameter_groups <<
|
21
|
-
|
22
|
-
|
23
|
-
def multiple_add(*parameter_groups)
|
24
|
-
@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
|
25
19
|
end
|
26
20
|
end
|
27
21
|
end
|
data/lib/mocha.rb
CHANGED
data/mocha.gemspec
CHANGED
@@ -2,7 +2,7 @@ lib = File.expand_path('../lib/', __FILE__)
|
|
2
2
|
$LOAD_PATH.unshift lib unless $LOAD_PATH.include?(lib)
|
3
3
|
require 'mocha/version'
|
4
4
|
|
5
|
-
Gem::Specification.new do |s|
|
5
|
+
Gem::Specification.new do |s| # rubocop:disable Metrics/BlockLength
|
6
6
|
s.name = 'mocha'
|
7
7
|
s.version = Mocha::VERSION
|
8
8
|
s.licenses = ['MIT', 'BSD-2-Clause']
|
@@ -12,16 +12,16 @@ Gem::Specification.new do |s|
|
|
12
12
|
s.description = 'Mocking and stubbing library with JMock/SchMock syntax, which allows mocking and stubbing of methods on real (non-mock) classes.'
|
13
13
|
s.email = 'mocha-developer@googlegroups.com'
|
14
14
|
|
15
|
-
s.files =
|
16
|
-
|
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')
|
17
19
|
s.files.delete('.gitignore')
|
18
20
|
|
19
21
|
s.homepage = 'https://mocha.jamesmead.org'
|
20
22
|
s.require_paths = ['lib']
|
21
23
|
s.summary = 'Mocking and stubbing library'
|
22
24
|
|
23
|
-
s.add_dependency('metaclass', '~> 0.0.1')
|
24
|
-
|
25
25
|
unless s.respond_to?(:add_development_dependency)
|
26
26
|
class << s
|
27
27
|
def add_development_dependency(*args)
|
@@ -30,18 +30,22 @@ Gem::Specification.new do |s|
|
|
30
30
|
end
|
31
31
|
end
|
32
32
|
|
33
|
-
if RUBY_VERSION
|
34
|
-
s.add_development_dependency
|
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'
|
35
39
|
else
|
36
|
-
|
37
|
-
s.add_development_dependency('rake', '~> 10.0')
|
40
|
+
s.add_development_dependency 'rake'
|
38
41
|
end
|
42
|
+
|
39
43
|
s.add_development_dependency('introspection', '~> 0.0.1')
|
40
44
|
if RUBY_VERSION >= '2.2.0'
|
41
45
|
# No test libraries in standard library
|
42
46
|
s.add_development_dependency('minitest')
|
43
47
|
end
|
44
|
-
if RUBY_VERSION >= '
|
48
|
+
if RUBY_VERSION >= '2.2.0'
|
45
49
|
s.add_development_dependency('rubocop', '<= 0.58.2')
|
46
50
|
end
|
47
51
|
if ENV['MOCHA_GENERATE_DOCS']
|