mocha 1.4.0 → 1.7.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/.rubocop.yml +58 -0
- data/.rubocop_todo.yml +50 -0
- data/README.md +12 -71
- data/RELEASE.md +19 -0
- data/Rakefile +35 -28
- data/bin/build-matrix +17 -18
- data/lib/mocha/any_instance_method.rb +19 -25
- data/lib/mocha/api.rb +1 -5
- data/lib/mocha/argument_iterator.rb +4 -8
- data/lib/mocha/backtrace_filter.rb +1 -5
- data/lib/mocha/cardinality.rb +20 -27
- data/lib/mocha/central.rb +21 -12
- data/lib/mocha/change_state_side_effect.rb +0 -4
- data/lib/mocha/class_method.rb +31 -37
- data/lib/mocha/class_methods.rb +11 -15
- data/lib/mocha/configuration.rb +69 -10
- data/lib/mocha/debug.rb +3 -2
- data/lib/mocha/deprecation.rb +4 -11
- data/lib/mocha/detection/mini_test.rb +0 -2
- data/lib/mocha/detection/test_unit.rb +4 -4
- data/lib/mocha/error_with_filtered_backtrace.rb +13 -0
- data/lib/mocha/exception_raiser.rb +2 -5
- data/lib/mocha/expectation.rb +15 -18
- data/lib/mocha/expectation_error.rb +2 -0
- data/lib/mocha/expectation_error_factory.rb +0 -1
- data/lib/mocha/expectation_list.rb +2 -6
- data/lib/mocha/hooks.rb +1 -3
- data/lib/mocha/in_state_ordering_constraint.rb +0 -4
- data/lib/mocha/inspect.rb +3 -5
- data/lib/mocha/instance_method.rb +0 -2
- 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/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_185_and_below.rb +4 -1
- data/lib/mocha/integration/test_unit/ruby_version_186_and_above.rb +4 -1
- data/lib/mocha/integration.rb +3 -4
- data/lib/mocha/is_a.rb +0 -2
- data/lib/mocha/logger.rb +0 -4
- data/lib/mocha/method_matcher.rb +1 -5
- data/lib/mocha/minitest.rb +1 -1
- data/lib/mocha/mock.rb +25 -30
- data/lib/mocha/mockery.rb +62 -43
- data/lib/mocha/module_method.rb +0 -10
- data/lib/mocha/module_methods.rb +0 -4
- data/lib/mocha/multiple_yields.rb +0 -5
- data/lib/mocha/names.rb +1 -11
- data/lib/mocha/no_yields.rb +1 -7
- data/lib/mocha/not_initialized_error.rb +7 -0
- data/lib/mocha/object_methods.rb +16 -16
- data/lib/mocha/parameter_matchers/all_of.rb +1 -7
- data/lib/mocha/parameter_matchers/any_of.rb +1 -7
- 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/equivalent_uri.rb +6 -6
- data/lib/mocha/parameter_matchers/has_entries.rb +2 -6
- data/lib/mocha/parameter_matchers/has_entry.rb +8 -11
- data/lib/mocha/parameter_matchers/has_key.rb +2 -6
- data/lib/mocha/parameter_matchers/has_value.rb +2 -6
- data/lib/mocha/parameter_matchers/includes.rb +2 -6
- data/lib/mocha/parameter_matchers/instance_of.rb +0 -6
- data/lib/mocha/parameter_matchers/is_a.rb +2 -6
- data/lib/mocha/parameter_matchers/kind_of.rb +2 -6
- data/lib/mocha/parameter_matchers/not.rb +2 -6
- data/lib/mocha/parameter_matchers/object.rb +0 -2
- 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 +0 -2
- data/lib/mocha/parameters_matcher.rb +6 -9
- data/lib/mocha/pretty_parameters.rb +0 -4
- data/lib/mocha/receivers.rb +10 -14
- data/lib/mocha/return_values.rb +3 -7
- data/lib/mocha/sequence.rb +4 -9
- data/lib/mocha/single_return_value.rb +0 -4
- data/lib/mocha/single_yield.rb +0 -5
- data/lib/mocha/state_machine.rb +6 -10
- data/lib/mocha/stubbing_error.rb +2 -13
- data/lib/mocha/test_unit.rb +1 -1
- data/lib/mocha/thrower.rb +2 -5
- data/lib/mocha/unexpected_invocation.rb +3 -5
- data/lib/mocha/version.rb +1 -1
- data/lib/mocha/yield_parameters.rb +3 -7
- data/mocha.gemspec +34 -58
- data/test/acceptance/acceptance_test_helper.rb +0 -6
- data/test/acceptance/bug_18914_test.rb +7 -12
- data/test/acceptance/bug_21465_test.rb +0 -2
- data/test/acceptance/bug_21563_test.rb +0 -2
- data/test/acceptance/exception_rescue_test.rb +7 -8
- data/test/acceptance/expectations_on_multiple_methods_test.rb +2 -1
- data/test/acceptance/expected_invocation_count_test.rb +27 -29
- data/test/acceptance/failure_messages_test.rb +3 -5
- data/test/acceptance/issue_272_test.rb +0 -1
- data/test/acceptance/issue_65_test.rb +15 -13
- data/test/acceptance/issue_70_test.rb +0 -1
- data/test/acceptance/mocha_example_test.rb +5 -6
- data/test/acceptance/mocha_test_result_test.rb +7 -7
- data/test/acceptance/mock_test.rb +2 -4
- data/test/acceptance/mock_with_initializer_block_test.rb +0 -2
- data/test/acceptance/mocked_methods_dispatch_test.rb +0 -2
- data/test/acceptance/multiple_expectations_failure_message_test.rb +16 -17
- data/test/acceptance/optional_parameters_test.rb +0 -2
- data/test/acceptance/parameter_matcher_test.rb +2 -3
- data/test/acceptance/partial_mocks_test.rb +4 -6
- data/test/acceptance/prepend_test.rb +14 -16
- data/test/acceptance/prevent_use_of_mocha_outside_test_test.rb +77 -0
- data/test/acceptance/raise_exception_test.rb +2 -4
- data/test/acceptance/return_value_test.rb +0 -2
- data/test/acceptance/sequence_test.rb +9 -11
- data/test/acceptance/states_test.rb +6 -4
- data/test/acceptance/stub_any_instance_method_defined_on_superclass_test.rb +33 -2
- data/test/acceptance/stub_any_instance_method_test.rb +19 -17
- data/test/acceptance/stub_class_method_defined_on_active_record_association_proxy_test.rb +8 -8
- data/test/acceptance/stub_class_method_defined_on_class_test.rb +2 -1
- data/test/acceptance/stub_class_method_defined_on_module_test.rb +0 -1
- data/test/acceptance/stub_class_method_defined_on_superclass_test.rb +34 -1
- data/test/acceptance/stub_everything_test.rb +1 -3
- data/test/acceptance/stub_instance_method_defined_on_active_record_association_proxy_test.rb +6 -7
- data/test/acceptance/stub_instance_method_defined_on_class_and_aliased_test.rb +0 -1
- data/test/acceptance/stub_instance_method_defined_on_class_test.rb +0 -1
- data/test/acceptance/stub_instance_method_defined_on_kernel_module_test.rb +63 -1
- data/test/acceptance/stub_instance_method_defined_on_module_test.rb +0 -1
- data/test/acceptance/stub_instance_method_defined_on_object_class_test.rb +2 -1
- data/test/acceptance/stub_instance_method_defined_on_singleton_class_test.rb +0 -2
- data/test/acceptance/stub_instance_method_defined_on_superclass_test.rb +0 -1
- data/test/acceptance/stub_module_method_test.rb +13 -13
- data/test/acceptance/stub_test.rb +1 -3
- data/test/acceptance/stubba_example_test.rb +6 -14
- data/test/acceptance/stubba_test_result_test.rb +5 -8
- data/test/acceptance/stubbing_error_backtrace_test.rb +2 -2
- data/test/acceptance/stubbing_frozen_object_test.rb +2 -1
- data/test/acceptance/stubbing_method_accepting_block_parameter_test.rb +12 -7
- data/test/acceptance/stubbing_method_unnecessarily_test.rb +0 -2
- data/test/acceptance/stubbing_nil_test.rb +4 -5
- data/test/acceptance/stubbing_non_existent_any_instance_method_test.rb +1 -3
- data/test/acceptance/stubbing_non_existent_class_method_test.rb +3 -3
- data/test/acceptance/stubbing_non_existent_instance_method_test.rb +1 -3
- data/test/acceptance/stubbing_non_public_any_instance_method_test.rb +0 -2
- data/test/acceptance/stubbing_non_public_class_method_test.rb +3 -3
- data/test/acceptance/stubbing_non_public_instance_method_test.rb +1 -3
- data/test/acceptance/stubbing_on_non_mock_object_test.rb +4 -10
- data/test/acceptance/stubbing_same_class_method_on_parent_and_child_classes_test.rb +3 -4
- data/test/acceptance/throw_test.rb +0 -2
- data/test/acceptance/unexpected_invocation_test.rb +2 -3
- data/test/acceptance/unstubbing_test.rb +41 -14
- data/test/deprecation_disabler.rb +0 -1
- data/test/execution_point.rb +2 -4
- data/test/integration/mini_test_test.rb +2 -2
- data/test/integration/shared_tests.rb +24 -22
- data/test/integration/test_unit_test.rb +2 -2
- data/test/method_definer.rb +1 -3
- data/test/mini_test_result.rb +17 -11
- data/test/minitest_result.rb +0 -1
- data/test/simple_counter.rb +0 -2
- data/test/test_helper.rb +13 -5
- data/test/test_runner.rb +2 -4
- data/test/test_unit_result.rb +4 -2
- data/test/unit/any_instance_method_test.rb +31 -17
- data/test/unit/array_inspect_test.rb +2 -4
- data/test/unit/backtrace_filter_test.rb +3 -5
- data/test/unit/cardinality_test.rb +0 -2
- data/test/unit/central_test.rb +26 -27
- data/test/unit/change_state_side_effect_test.rb +0 -4
- data/test/unit/class_method_test.rb +59 -34
- data/test/unit/class_methods_test.rb +34 -5
- data/test/unit/configuration_test.rb +1 -2
- data/test/unit/date_time_inspect_test.rb +1 -3
- data/test/unit/exception_raiser_test.rb +0 -2
- data/test/unit/expectation_list_test.rb +0 -2
- data/test/unit/expectation_test.rb +41 -46
- data/test/unit/hash_inspect_test.rb +3 -5
- data/test/unit/hooks_test.rb +14 -8
- data/test/unit/in_state_ordering_constraint_test.rb +0 -4
- data/test/unit/method_matcher_test.rb +1 -3
- data/test/unit/mock_test.rb +35 -22
- data/test/unit/mockery_test.rb +45 -28
- data/test/unit/module_methods_test.rb +0 -2
- data/test/unit/multiple_yields_test.rb +0 -2
- data/test/unit/no_yields_test.rb +0 -2
- data/test/unit/object_inspect_test.rb +16 -7
- data/test/unit/object_methods_test.rb +22 -6
- data/test/unit/parameter_matchers/all_of_test.rb +0 -2
- data/test/unit/parameter_matchers/any_of_test.rb +0 -2
- data/test/unit/parameter_matchers/anything_test.rb +2 -4
- data/test/unit/parameter_matchers/equals_test.rb +1 -3
- data/test/unit/parameter_matchers/equivalent_uri_test.rb +0 -1
- data/test/unit/parameter_matchers/has_entries_test.rb +2 -2
- data/test/unit/parameter_matchers/has_entry_test.rb +13 -14
- data/test/unit/parameter_matchers/has_key_test.rb +0 -1
- data/test/unit/parameter_matchers/has_value_test.rb +0 -2
- data/test/unit/parameter_matchers/includes_test.rb +8 -9
- data/test/unit/parameter_matchers/instance_of_test.rb +1 -3
- data/test/unit/parameter_matchers/is_a_test.rb +1 -3
- data/test/unit/parameter_matchers/kind_of_test.rb +1 -3
- data/test/unit/parameter_matchers/not_test.rb +0 -2
- data/test/unit/parameter_matchers/regexp_matches_test.rb +1 -2
- data/test/unit/parameter_matchers/responds_with_test.rb +9 -3
- data/test/unit/parameter_matchers/stub_matcher.rb +0 -4
- data/test/unit/parameter_matchers/yaml_equivalent_test.rb +1 -3
- data/test/unit/parameters_matcher_test.rb +2 -4
- data/test/unit/receivers_test.rb +35 -5
- data/test/unit/return_values_test.rb +3 -5
- data/test/unit/sequence_test.rb +1 -5
- data/test/unit/single_return_value_test.rb +0 -2
- data/test/unit/single_yield_test.rb +0 -2
- data/test/unit/state_machine_test.rb +1 -3
- data/test/unit/string_inspect_test.rb +2 -4
- data/test/unit/thrower_test.rb +0 -2
- data/test/unit/yield_parameters_test.rb +0 -2
- data/yard-templates/default/layout/html/setup.rb +2 -3
- metadata +25 -6
@@ -6,12 +6,12 @@ module Mocha
|
|
6
6
|
module Integration
|
7
7
|
module TestUnit
|
8
8
|
module GemVersion230To250
|
9
|
-
def self.applicable_to?(test_unit_version,
|
9
|
+
def self.applicable_to?(test_unit_version, _ruby_version = nil)
|
10
10
|
Gem::Requirement.new('>= 2.3.0', '<= 2.5.0').satisfied_by?(test_unit_version)
|
11
11
|
end
|
12
12
|
|
13
13
|
def self.description
|
14
|
-
|
14
|
+
'monkey patch for Test::Unit gem >= v2.3.0 and <= v2.5.0'
|
15
15
|
end
|
16
16
|
|
17
17
|
def self.included(mod)
|
@@ -19,6 +19,7 @@ module Mocha
|
|
19
19
|
end
|
20
20
|
|
21
21
|
module RunMethodPatch
|
22
|
+
# rubocop:disable all
|
22
23
|
def run(result)
|
23
24
|
assertion_counter = AssertionCounter.new(self)
|
24
25
|
begin
|
@@ -28,6 +29,7 @@ module Mocha
|
|
28
29
|
yield(Test::Unit::TestCase::STARTED_OBJECT, self)
|
29
30
|
begin
|
30
31
|
begin
|
32
|
+
mocha_setup
|
31
33
|
run_setup
|
32
34
|
run_test
|
33
35
|
run_cleanup
|
@@ -58,6 +60,7 @@ module Mocha
|
|
58
60
|
# @_result = nil # For test-spec's after_all :<
|
59
61
|
end
|
60
62
|
end
|
63
|
+
# rubocop:enable all
|
61
64
|
end
|
62
65
|
end
|
63
66
|
end
|
@@ -2,16 +2,16 @@ module Mocha
|
|
2
2
|
module Integration
|
3
3
|
module TestUnit
|
4
4
|
module Nothing
|
5
|
-
def self.applicable_to?(
|
5
|
+
def self.applicable_to?(_test_unit_version, _ruby_version = nil)
|
6
6
|
true
|
7
7
|
end
|
8
8
|
|
9
9
|
def self.description
|
10
|
-
|
10
|
+
'nothing (no Test::Unit integration available)'
|
11
11
|
end
|
12
12
|
|
13
|
-
def self.included(
|
14
|
-
raise
|
13
|
+
def self.included(_mod)
|
14
|
+
raise 'No Test::Unit integration available'
|
15
15
|
end
|
16
16
|
end
|
17
17
|
end
|
@@ -11,7 +11,7 @@ module Mocha
|
|
11
11
|
end
|
12
12
|
|
13
13
|
def self.description
|
14
|
-
|
14
|
+
'monkey patch for standard library in Ruby <= v1.8.5'
|
15
15
|
end
|
16
16
|
|
17
17
|
def self.included(mod)
|
@@ -19,12 +19,14 @@ module Mocha
|
|
19
19
|
end
|
20
20
|
|
21
21
|
module RunMethodPatch
|
22
|
+
# rubocop:disable all
|
22
23
|
def run(result)
|
23
24
|
assertion_counter = AssertionCounter.new(self)
|
24
25
|
yield(Test::Unit::TestCase::STARTED, name)
|
25
26
|
@_result = result
|
26
27
|
begin
|
27
28
|
begin
|
29
|
+
mocha_setup
|
28
30
|
setup
|
29
31
|
__send__(@method_name)
|
30
32
|
mocha_verify(assertion_counter)
|
@@ -51,6 +53,7 @@ module Mocha
|
|
51
53
|
result.add_run
|
52
54
|
yield(Test::Unit::TestCase::FINISHED, name)
|
53
55
|
end
|
56
|
+
# rubocop:enable all
|
54
57
|
end
|
55
58
|
end
|
56
59
|
end
|
@@ -11,7 +11,7 @@ module Mocha
|
|
11
11
|
end
|
12
12
|
|
13
13
|
def self.description
|
14
|
-
|
14
|
+
'monkey patch for standard library Test::Unit in Ruby >= v1.8.6'
|
15
15
|
end
|
16
16
|
|
17
17
|
def self.included(mod)
|
@@ -19,12 +19,14 @@ module Mocha
|
|
19
19
|
end
|
20
20
|
|
21
21
|
module RunMethodPatch
|
22
|
+
# rubocop:disable all
|
22
23
|
def run(result)
|
23
24
|
assertion_counter = AssertionCounter.new(self)
|
24
25
|
yield(Test::Unit::TestCase::STARTED, name)
|
25
26
|
@_result = result
|
26
27
|
begin
|
27
28
|
begin
|
29
|
+
mocha_setup
|
28
30
|
setup
|
29
31
|
__send__(@method_name)
|
30
32
|
mocha_verify(assertion_counter)
|
@@ -53,6 +55,7 @@ module Mocha
|
|
53
55
|
result.add_run
|
54
56
|
yield(Test::Unit::TestCase::FINISHED, name)
|
55
57
|
end
|
58
|
+
# rubocop:enable all
|
56
59
|
end
|
57
60
|
end
|
58
61
|
end
|
data/lib/mocha/integration.rb
CHANGED
@@ -5,10 +5,9 @@ require 'mocha/integration/mini_test'
|
|
5
5
|
module Mocha
|
6
6
|
module Integration
|
7
7
|
def self.activate
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
end
|
8
|
+
return unless [Integration::TestUnit, Integration::MiniTest].map(&:activate).none?
|
9
|
+
Deprecation.warning("Test::Unit or MiniTest must be loaded *before* `require 'mocha/setup'`.")
|
10
|
+
Deprecation.warning("If you're integrating with a test library other than Test::Unit or MiniTest, you should use `require 'mocha/api'` instead of `require 'mocha/setup'`.")
|
12
11
|
end
|
13
12
|
end
|
14
13
|
end
|
data/lib/mocha/is_a.rb
CHANGED
data/lib/mocha/logger.rb
CHANGED
data/lib/mocha/method_matcher.rb
CHANGED
@@ -1,7 +1,5 @@
|
|
1
1
|
module Mocha
|
2
|
-
|
3
2
|
class MethodMatcher
|
4
|
-
|
5
3
|
attr_reader :expected_method_name
|
6
4
|
|
7
5
|
def initialize(expected_method_name)
|
@@ -13,9 +11,7 @@ module Mocha
|
|
13
11
|
end
|
14
12
|
|
15
13
|
def mocha_inspect
|
16
|
-
|
14
|
+
@expected_method_name.to_s
|
17
15
|
end
|
18
|
-
|
19
16
|
end
|
20
|
-
|
21
17
|
end
|
data/lib/mocha/minitest.rb
CHANGED
data/lib/mocha/mock.rb
CHANGED
@@ -12,7 +12,6 @@ require 'mocha/deprecation'
|
|
12
12
|
require 'mocha/ruby_version'
|
13
13
|
|
14
14
|
module Mocha
|
15
|
-
|
16
15
|
# Traditional mock object.
|
17
16
|
#
|
18
17
|
# All methods return an {Expectation} which can be further modified by
|
@@ -69,7 +68,6 @@ module Mocha
|
|
69
68
|
# different mock objects, use the {Expectation#in_sequence} method to
|
70
69
|
# explicitly define a total or partial ordering of invocations.
|
71
70
|
class Mock
|
72
|
-
|
73
71
|
# Adds an expectation that the specified method must be called exactly once with any parameters.
|
74
72
|
#
|
75
73
|
# @param [Symbol,String] method_name name of expected method
|
@@ -106,13 +104,13 @@ module Mocha
|
|
106
104
|
# object.expects(:expected_method_two).returns(:result_two)
|
107
105
|
def expects(method_name_or_hash, backtrace = nil)
|
108
106
|
iterator = ArgumentIterator.new(method_name_or_hash)
|
109
|
-
iterator.each
|
107
|
+
iterator.each do |*args|
|
110
108
|
method_name = args.shift
|
111
109
|
ensure_method_not_already_defined(method_name)
|
112
110
|
expectation = Expectation.new(self, method_name, backtrace)
|
113
|
-
expectation.returns(args.shift)
|
111
|
+
expectation.returns(args.shift) unless args.empty?
|
114
112
|
@expectations.add(expectation)
|
115
|
-
|
113
|
+
end
|
116
114
|
end
|
117
115
|
|
118
116
|
# Adds an expectation that the specified method may be called any number of times with any parameters.
|
@@ -142,14 +140,14 @@ module Mocha
|
|
142
140
|
# object.stubs(:stubbed_method_two).returns(:result_two)
|
143
141
|
def stubs(method_name_or_hash, backtrace = nil)
|
144
142
|
iterator = ArgumentIterator.new(method_name_or_hash)
|
145
|
-
iterator.each
|
143
|
+
iterator.each do |*args|
|
146
144
|
method_name = args.shift
|
147
145
|
ensure_method_not_already_defined(method_name)
|
148
146
|
expectation = Expectation.new(self, method_name, backtrace)
|
149
147
|
expectation.at_least(0)
|
150
|
-
expectation.returns(args.shift)
|
148
|
+
expectation.returns(args.shift) unless args.empty?
|
151
149
|
@expectations.add(expectation)
|
152
|
-
|
150
|
+
end
|
153
151
|
end
|
154
152
|
|
155
153
|
# Removes the specified stubbed method (added by calls to {#expects} or {#stubs}) and all expectations associated with it.
|
@@ -261,10 +259,9 @@ module Mocha
|
|
261
259
|
@everything_stubbed = false
|
262
260
|
@responder = nil
|
263
261
|
@unexpected_invocation = nil
|
264
|
-
|
265
|
-
|
266
|
-
|
267
|
-
end
|
262
|
+
return unless block
|
263
|
+
Deprecation.warning('Passing a block is deprecated. Use Object#tap or define stubs/expectations with an explicit receiver instead.')
|
264
|
+
instance_eval(&block)
|
268
265
|
end
|
269
266
|
|
270
267
|
# @private
|
@@ -293,30 +290,30 @@ module Mocha
|
|
293
290
|
end
|
294
291
|
|
295
292
|
# @private
|
293
|
+
# rubocop:disable Style/MethodMissingSuper
|
296
294
|
def method_missing(symbol, *arguments, &block)
|
297
|
-
if @responder
|
298
|
-
raise NoMethodError, "undefined method `#{symbol}' for #{
|
295
|
+
if @responder && !@responder.respond_to?(symbol)
|
296
|
+
raise NoMethodError, "undefined method `#{symbol}' for #{mocha_inspect} which responds like #{@responder.mocha_inspect}"
|
299
297
|
end
|
300
|
-
if matching_expectation_allowing_invocation = all_expectations.match_allowing_invocation(symbol, *arguments)
|
298
|
+
if (matching_expectation_allowing_invocation = all_expectations.match_allowing_invocation(symbol, *arguments))
|
301
299
|
matching_expectation_allowing_invocation.invoke(&block)
|
302
|
-
|
303
|
-
if
|
304
|
-
|
305
|
-
|
306
|
-
|
307
|
-
|
308
|
-
|
309
|
-
|
310
|
-
message = @unexpected_invocation.short_description
|
311
|
-
end
|
312
|
-
raise ExpectationErrorFactory.build(message, caller)
|
300
|
+
elsif (matching_expectation = all_expectations.match(symbol, *arguments)) || (!matching_expectation && !@everything_stubbed)
|
301
|
+
if @unexpected_invocation.nil?
|
302
|
+
@unexpected_invocation = UnexpectedInvocation.new(self, symbol, *arguments)
|
303
|
+
matching_expectation.invoke(&block) if matching_expectation
|
304
|
+
message = @unexpected_invocation.full_description
|
305
|
+
message << @mockery.mocha_inspect
|
306
|
+
else
|
307
|
+
message = @unexpected_invocation.short_description
|
313
308
|
end
|
309
|
+
raise ExpectationErrorFactory.build(message, caller)
|
314
310
|
end
|
315
311
|
end
|
312
|
+
# rubocop:enable Style/MethodMissingSuper
|
316
313
|
|
317
314
|
# @private
|
318
315
|
def respond_to_missing?(symbol, include_private = false)
|
319
|
-
if @responder
|
316
|
+
if @responder
|
320
317
|
if @responder.method(:respond_to?).arity > 1
|
321
318
|
@responder.respond_to?(symbol, include_private)
|
322
319
|
else
|
@@ -351,14 +348,12 @@ module Mocha
|
|
351
348
|
|
352
349
|
# @private
|
353
350
|
def ensure_method_not_already_defined(method_name)
|
354
|
-
|
351
|
+
__metaclass__.send(:undef_method, method_name) if __metaclass__.method_defined?(method_name) || __metaclass__.private_method_defined?(method_name)
|
355
352
|
end
|
356
353
|
|
357
354
|
# @private
|
358
355
|
def any_expectations?
|
359
356
|
@expectations.any?
|
360
357
|
end
|
361
|
-
|
362
358
|
end
|
363
|
-
|
364
359
|
end
|
data/lib/mocha/mockery.rb
CHANGED
@@ -7,16 +7,41 @@ require 'mocha/state_machine'
|
|
7
7
|
require 'mocha/logger'
|
8
8
|
require 'mocha/configuration'
|
9
9
|
require 'mocha/stubbing_error'
|
10
|
+
require 'mocha/not_initialized_error'
|
10
11
|
require 'mocha/expectation_error_factory'
|
11
12
|
|
12
13
|
module Mocha
|
13
|
-
|
14
14
|
class Mockery
|
15
|
+
class Null < self
|
16
|
+
def add_mock(*)
|
17
|
+
raise_not_initialized_error
|
18
|
+
end
|
15
19
|
|
16
|
-
|
20
|
+
def add_state_machine(*)
|
21
|
+
raise_not_initialized_error
|
22
|
+
end
|
23
|
+
|
24
|
+
def stubba
|
25
|
+
Central::Null.new(&method(:raise_not_initialized_error))
|
26
|
+
end
|
27
|
+
|
28
|
+
private
|
17
29
|
|
30
|
+
def raise_not_initialized_error
|
31
|
+
message = 'Mocha methods cannot be used outside the context of a test'
|
32
|
+
raise NotInitializedError.new(message, caller)
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
class << self
|
18
37
|
def instance
|
19
|
-
|
38
|
+
instances.last || Null.new
|
39
|
+
end
|
40
|
+
|
41
|
+
def setup
|
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,12 +50,16 @@ module Mocha
|
|
25
50
|
|
26
51
|
def teardown
|
27
52
|
instance.teardown
|
53
|
+
ensure
|
54
|
+
@instances.pop
|
55
|
+
@instances = nil if instances.empty?
|
28
56
|
end
|
29
57
|
|
30
|
-
|
31
|
-
@instance = nil
|
32
|
-
end
|
58
|
+
private
|
33
59
|
|
60
|
+
def instances
|
61
|
+
@instances ||= []
|
62
|
+
end
|
34
63
|
end
|
35
64
|
|
36
65
|
def named_mock(name, &block)
|
@@ -56,18 +85,17 @@ module Mocha
|
|
56
85
|
def verify(assertion_counter = nil)
|
57
86
|
unless mocks.all? { |mock| mock.__verified__?(assertion_counter) }
|
58
87
|
message = "not all expectations were satisfied\n#{mocha_inspect}"
|
59
|
-
if unsatisfied_expectations.empty?
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
88
|
+
backtrace = if unsatisfied_expectations.empty?
|
89
|
+
caller
|
90
|
+
else
|
91
|
+
unsatisfied_expectations[0].backtrace
|
92
|
+
end
|
64
93
|
raise ExpectationErrorFactory.build(message, backtrace)
|
65
94
|
end
|
66
95
|
expectations.each do |e|
|
67
96
|
unless Mocha::Configuration.allow?(:stubbing_method_unnecessarily)
|
68
|
-
|
69
|
-
|
70
|
-
end
|
97
|
+
next if e.used?
|
98
|
+
on_stubbing_method_unnecessarily(e)
|
71
99
|
end
|
72
100
|
end
|
73
101
|
end
|
@@ -90,22 +118,22 @@ module Mocha
|
|
90
118
|
end
|
91
119
|
|
92
120
|
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
|
121
|
+
message = ''
|
122
|
+
message << "unsatisfied expectations:\n- #{unsatisfied_expectations.map(&:mocha_inspect).join("\n- ")}\n" unless unsatisfied_expectations.empty?
|
123
|
+
message << "satisfied expectations:\n- #{satisfied_expectations.map(&:mocha_inspect).join("\n- ")}\n" unless satisfied_expectations.empty?
|
124
|
+
message << "states:\n- #{state_machines.map(&:mocha_inspect).join("\n- ")}" unless state_machines.empty?
|
97
125
|
message
|
98
126
|
end
|
99
127
|
|
100
128
|
def on_stubbing(object, method)
|
101
129
|
method = PRE_RUBY_V19 ? method.to_s : method.to_sym
|
102
130
|
unless Mocha::Configuration.allow?(:stubbing_non_existent_method)
|
103
|
-
unless object.method_exists?(method,
|
131
|
+
unless object.method_exists?(method, true)
|
104
132
|
on_stubbing_non_existent_method(object, method)
|
105
133
|
end
|
106
134
|
end
|
107
135
|
unless Mocha::Configuration.allow?(:stubbing_non_public_method)
|
108
|
-
if object.method_exists?(method,
|
136
|
+
if object.method_exists?(method, false)
|
109
137
|
on_stubbing_non_public_method(object, method)
|
110
138
|
end
|
111
139
|
end
|
@@ -114,54 +142,48 @@ module Mocha
|
|
114
142
|
on_stubbing_method_on_nil(object, method)
|
115
143
|
end
|
116
144
|
end
|
117
|
-
|
118
|
-
|
119
|
-
end
|
145
|
+
return if Mocha::Configuration.allow?(:stubbing_method_on_non_mock_object)
|
146
|
+
on_stubbing_method_on_non_mock_object(object, method)
|
120
147
|
end
|
121
148
|
|
122
149
|
def on_stubbing_non_existent_method(object, method)
|
123
150
|
if Mocha::Configuration.prevent?(:stubbing_non_existent_method)
|
124
151
|
raise StubbingError.new("stubbing non-existent method: #{object.mocha_inspect}.#{method}", caller)
|
125
152
|
end
|
126
|
-
|
127
|
-
|
128
|
-
end
|
153
|
+
return unless Mocha::Configuration.warn_when?(:stubbing_non_existent_method)
|
154
|
+
logger.warn "stubbing non-existent method: #{object.mocha_inspect}.#{method}"
|
129
155
|
end
|
130
156
|
|
131
157
|
def on_stubbing_non_public_method(object, method)
|
132
158
|
if Mocha::Configuration.prevent?(:stubbing_non_public_method)
|
133
159
|
raise StubbingError.new("stubbing non-public method: #{object.mocha_inspect}.#{method}", caller)
|
134
160
|
end
|
135
|
-
|
136
|
-
|
137
|
-
end
|
161
|
+
return unless Mocha::Configuration.warn_when?(:stubbing_non_public_method)
|
162
|
+
logger.warn "stubbing non-public method: #{object.mocha_inspect}.#{method}"
|
138
163
|
end
|
139
164
|
|
140
165
|
def on_stubbing_method_on_nil(object, method)
|
141
166
|
if Mocha::Configuration.prevent?(:stubbing_method_on_nil)
|
142
167
|
raise StubbingError.new("stubbing method on nil: #{object.mocha_inspect}.#{method}", caller)
|
143
168
|
end
|
144
|
-
|
145
|
-
|
146
|
-
end
|
169
|
+
return unless Mocha::Configuration.warn_when?(:stubbing_method_on_nil)
|
170
|
+
logger.warn "stubbing method on nil: #{object.mocha_inspect}.#{method}"
|
147
171
|
end
|
148
172
|
|
149
173
|
def on_stubbing_method_on_non_mock_object(object, method)
|
150
174
|
if Mocha::Configuration.prevent?(:stubbing_method_on_non_mock_object)
|
151
175
|
raise StubbingError.new("stubbing method on non-mock object: #{object.mocha_inspect}.#{method}", caller)
|
152
176
|
end
|
153
|
-
|
154
|
-
|
155
|
-
end
|
177
|
+
return unless Mocha::Configuration.warn_when?(:stubbing_method_on_non_mock_object)
|
178
|
+
logger.warn "stubbing method on non-mock object: #{object.mocha_inspect}.#{method}"
|
156
179
|
end
|
157
180
|
|
158
181
|
def on_stubbing_method_unnecessarily(expectation)
|
159
182
|
if Mocha::Configuration.prevent?(:stubbing_method_unnecessarily)
|
160
183
|
raise StubbingError.new("stubbing method unnecessarily: #{expectation.method_signature}", expectation.backtrace)
|
161
184
|
end
|
162
|
-
|
163
|
-
|
164
|
-
end
|
185
|
+
return unless Mocha::Configuration.warn_when?(:stubbing_method_unnecessarily)
|
186
|
+
logger.warn "stubbing method unnecessarily: #{expectation.method_signature}"
|
165
187
|
end
|
166
188
|
|
167
189
|
attr_writer :logger
|
@@ -170,7 +192,6 @@ module Mocha
|
|
170
192
|
@logger ||= Logger.new($stderr)
|
171
193
|
end
|
172
194
|
|
173
|
-
|
174
195
|
private
|
175
196
|
|
176
197
|
def expectations
|
@@ -178,11 +199,11 @@ module Mocha
|
|
178
199
|
end
|
179
200
|
|
180
201
|
def unsatisfied_expectations
|
181
|
-
expectations.reject
|
202
|
+
expectations.reject(&:verified?)
|
182
203
|
end
|
183
204
|
|
184
205
|
def satisfied_expectations
|
185
|
-
expectations.select
|
206
|
+
expectations.select(&:verified?)
|
186
207
|
end
|
187
208
|
|
188
209
|
def add_mock(mock)
|
@@ -200,7 +221,5 @@ module Mocha
|
|
200
221
|
@mocks = nil
|
201
222
|
@state_machines = nil
|
202
223
|
end
|
203
|
-
|
204
224
|
end
|
205
|
-
|
206
225
|
end
|
data/lib/mocha/module_method.rb
CHANGED
@@ -1,16 +1,6 @@
|
|
1
1
|
require 'mocha/class_method'
|
2
2
|
|
3
3
|
module Mocha
|
4
|
-
|
5
4
|
class ModuleMethod < ClassMethod
|
6
|
-
|
7
|
-
def method_exists?(method)
|
8
|
-
return true if stubbee.public_methods(false).include?(method)
|
9
|
-
return true if stubbee.protected_methods(false).include?(method)
|
10
|
-
return true if stubbee.private_methods(false).include?(method)
|
11
|
-
return false
|
12
|
-
end
|
13
|
-
|
14
5
|
end
|
15
|
-
|
16
6
|
end
|
data/lib/mocha/module_methods.rb
CHANGED
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,11 +17,9 @@ 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
24
|
@name = name
|
31
25
|
end
|
@@ -33,11 +27,9 @@ module Mocha
|
|
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/no_yields.rb
CHANGED