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.
Files changed (230) hide show
  1. checksums.yaml +5 -5
  2. data/.rubocop.yml +58 -0
  3. data/.rubocop_todo.yml +50 -0
  4. data/README.md +12 -71
  5. data/RELEASE.md +19 -0
  6. data/Rakefile +35 -28
  7. data/bin/build-matrix +17 -18
  8. data/lib/mocha/any_instance_method.rb +19 -25
  9. data/lib/mocha/api.rb +1 -5
  10. data/lib/mocha/argument_iterator.rb +4 -8
  11. data/lib/mocha/backtrace_filter.rb +1 -5
  12. data/lib/mocha/cardinality.rb +20 -27
  13. data/lib/mocha/central.rb +21 -12
  14. data/lib/mocha/change_state_side_effect.rb +0 -4
  15. data/lib/mocha/class_method.rb +31 -37
  16. data/lib/mocha/class_methods.rb +11 -15
  17. data/lib/mocha/configuration.rb +69 -10
  18. data/lib/mocha/debug.rb +3 -2
  19. data/lib/mocha/deprecation.rb +4 -11
  20. data/lib/mocha/detection/mini_test.rb +0 -2
  21. data/lib/mocha/detection/test_unit.rb +4 -4
  22. data/lib/mocha/error_with_filtered_backtrace.rb +13 -0
  23. data/lib/mocha/exception_raiser.rb +2 -5
  24. data/lib/mocha/expectation.rb +15 -18
  25. data/lib/mocha/expectation_error.rb +2 -0
  26. data/lib/mocha/expectation_error_factory.rb +0 -1
  27. data/lib/mocha/expectation_list.rb +2 -6
  28. data/lib/mocha/hooks.rb +1 -3
  29. data/lib/mocha/in_state_ordering_constraint.rb +0 -4
  30. data/lib/mocha/inspect.rb +3 -5
  31. data/lib/mocha/instance_method.rb +0 -2
  32. data/lib/mocha/integration/mini_test/adapter.rb +2 -4
  33. data/lib/mocha/integration/mini_test/exception_translation.rb +1 -1
  34. data/lib/mocha/integration/mini_test/nothing.rb +4 -4
  35. data/lib/mocha/integration/mini_test/version_13.rb +4 -1
  36. data/lib/mocha/integration/mini_test/version_140.rb +4 -1
  37. data/lib/mocha/integration/mini_test/version_141.rb +4 -1
  38. data/lib/mocha/integration/mini_test/version_142_to_172.rb +4 -1
  39. data/lib/mocha/integration/mini_test/version_200.rb +4 -1
  40. data/lib/mocha/integration/mini_test/version_201_to_222.rb +4 -1
  41. data/lib/mocha/integration/mini_test/version_2110_to_2111.rb +4 -1
  42. data/lib/mocha/integration/mini_test/version_2112_to_320.rb +4 -1
  43. data/lib/mocha/integration/mini_test/version_230_to_2101.rb +4 -1
  44. data/lib/mocha/integration/monkey_patcher.rb +5 -7
  45. data/lib/mocha/integration/test_unit/adapter.rb +5 -6
  46. data/lib/mocha/integration/test_unit/gem_version_200.rb +5 -2
  47. data/lib/mocha/integration/test_unit/gem_version_201_to_202.rb +5 -2
  48. data/lib/mocha/integration/test_unit/gem_version_203_to_220.rb +5 -2
  49. data/lib/mocha/integration/test_unit/gem_version_230_to_250.rb +5 -2
  50. data/lib/mocha/integration/test_unit/nothing.rb +4 -4
  51. data/lib/mocha/integration/test_unit/ruby_version_185_and_below.rb +4 -1
  52. data/lib/mocha/integration/test_unit/ruby_version_186_and_above.rb +4 -1
  53. data/lib/mocha/integration.rb +3 -4
  54. data/lib/mocha/is_a.rb +0 -2
  55. data/lib/mocha/logger.rb +0 -4
  56. data/lib/mocha/method_matcher.rb +1 -5
  57. data/lib/mocha/minitest.rb +1 -1
  58. data/lib/mocha/mock.rb +25 -30
  59. data/lib/mocha/mockery.rb +62 -43
  60. data/lib/mocha/module_method.rb +0 -10
  61. data/lib/mocha/module_methods.rb +0 -4
  62. data/lib/mocha/multiple_yields.rb +0 -5
  63. data/lib/mocha/names.rb +1 -11
  64. data/lib/mocha/no_yields.rb +1 -7
  65. data/lib/mocha/not_initialized_error.rb +7 -0
  66. data/lib/mocha/object_methods.rb +16 -16
  67. data/lib/mocha/parameter_matchers/all_of.rb +1 -7
  68. data/lib/mocha/parameter_matchers/any_of.rb +1 -7
  69. data/lib/mocha/parameter_matchers/any_parameters.rb +3 -9
  70. data/lib/mocha/parameter_matchers/anything.rb +2 -8
  71. data/lib/mocha/parameter_matchers/base.rb +6 -12
  72. data/lib/mocha/parameter_matchers/equals.rb +0 -6
  73. data/lib/mocha/parameter_matchers/equivalent_uri.rb +6 -6
  74. data/lib/mocha/parameter_matchers/has_entries.rb +2 -6
  75. data/lib/mocha/parameter_matchers/has_entry.rb +8 -11
  76. data/lib/mocha/parameter_matchers/has_key.rb +2 -6
  77. data/lib/mocha/parameter_matchers/has_value.rb +2 -6
  78. data/lib/mocha/parameter_matchers/includes.rb +2 -6
  79. data/lib/mocha/parameter_matchers/instance_of.rb +0 -6
  80. data/lib/mocha/parameter_matchers/is_a.rb +2 -6
  81. data/lib/mocha/parameter_matchers/kind_of.rb +2 -6
  82. data/lib/mocha/parameter_matchers/not.rb +2 -6
  83. data/lib/mocha/parameter_matchers/object.rb +0 -2
  84. data/lib/mocha/parameter_matchers/optionally.rb +4 -10
  85. data/lib/mocha/parameter_matchers/regexp_matches.rb +0 -6
  86. data/lib/mocha/parameter_matchers/responds_with.rb +3 -8
  87. data/lib/mocha/parameter_matchers/yaml_equivalent.rb +2 -6
  88. data/lib/mocha/parameter_matchers.rb +0 -2
  89. data/lib/mocha/parameters_matcher.rb +6 -9
  90. data/lib/mocha/pretty_parameters.rb +0 -4
  91. data/lib/mocha/receivers.rb +10 -14
  92. data/lib/mocha/return_values.rb +3 -7
  93. data/lib/mocha/sequence.rb +4 -9
  94. data/lib/mocha/single_return_value.rb +0 -4
  95. data/lib/mocha/single_yield.rb +0 -5
  96. data/lib/mocha/state_machine.rb +6 -10
  97. data/lib/mocha/stubbing_error.rb +2 -13
  98. data/lib/mocha/test_unit.rb +1 -1
  99. data/lib/mocha/thrower.rb +2 -5
  100. data/lib/mocha/unexpected_invocation.rb +3 -5
  101. data/lib/mocha/version.rb +1 -1
  102. data/lib/mocha/yield_parameters.rb +3 -7
  103. data/mocha.gemspec +34 -58
  104. data/test/acceptance/acceptance_test_helper.rb +0 -6
  105. data/test/acceptance/bug_18914_test.rb +7 -12
  106. data/test/acceptance/bug_21465_test.rb +0 -2
  107. data/test/acceptance/bug_21563_test.rb +0 -2
  108. data/test/acceptance/exception_rescue_test.rb +7 -8
  109. data/test/acceptance/expectations_on_multiple_methods_test.rb +2 -1
  110. data/test/acceptance/expected_invocation_count_test.rb +27 -29
  111. data/test/acceptance/failure_messages_test.rb +3 -5
  112. data/test/acceptance/issue_272_test.rb +0 -1
  113. data/test/acceptance/issue_65_test.rb +15 -13
  114. data/test/acceptance/issue_70_test.rb +0 -1
  115. data/test/acceptance/mocha_example_test.rb +5 -6
  116. data/test/acceptance/mocha_test_result_test.rb +7 -7
  117. data/test/acceptance/mock_test.rb +2 -4
  118. data/test/acceptance/mock_with_initializer_block_test.rb +0 -2
  119. data/test/acceptance/mocked_methods_dispatch_test.rb +0 -2
  120. data/test/acceptance/multiple_expectations_failure_message_test.rb +16 -17
  121. data/test/acceptance/optional_parameters_test.rb +0 -2
  122. data/test/acceptance/parameter_matcher_test.rb +2 -3
  123. data/test/acceptance/partial_mocks_test.rb +4 -6
  124. data/test/acceptance/prepend_test.rb +14 -16
  125. data/test/acceptance/prevent_use_of_mocha_outside_test_test.rb +77 -0
  126. data/test/acceptance/raise_exception_test.rb +2 -4
  127. data/test/acceptance/return_value_test.rb +0 -2
  128. data/test/acceptance/sequence_test.rb +9 -11
  129. data/test/acceptance/states_test.rb +6 -4
  130. data/test/acceptance/stub_any_instance_method_defined_on_superclass_test.rb +33 -2
  131. data/test/acceptance/stub_any_instance_method_test.rb +19 -17
  132. data/test/acceptance/stub_class_method_defined_on_active_record_association_proxy_test.rb +8 -8
  133. data/test/acceptance/stub_class_method_defined_on_class_test.rb +2 -1
  134. data/test/acceptance/stub_class_method_defined_on_module_test.rb +0 -1
  135. data/test/acceptance/stub_class_method_defined_on_superclass_test.rb +34 -1
  136. data/test/acceptance/stub_everything_test.rb +1 -3
  137. data/test/acceptance/stub_instance_method_defined_on_active_record_association_proxy_test.rb +6 -7
  138. data/test/acceptance/stub_instance_method_defined_on_class_and_aliased_test.rb +0 -1
  139. data/test/acceptance/stub_instance_method_defined_on_class_test.rb +0 -1
  140. data/test/acceptance/stub_instance_method_defined_on_kernel_module_test.rb +63 -1
  141. data/test/acceptance/stub_instance_method_defined_on_module_test.rb +0 -1
  142. data/test/acceptance/stub_instance_method_defined_on_object_class_test.rb +2 -1
  143. data/test/acceptance/stub_instance_method_defined_on_singleton_class_test.rb +0 -2
  144. data/test/acceptance/stub_instance_method_defined_on_superclass_test.rb +0 -1
  145. data/test/acceptance/stub_module_method_test.rb +13 -13
  146. data/test/acceptance/stub_test.rb +1 -3
  147. data/test/acceptance/stubba_example_test.rb +6 -14
  148. data/test/acceptance/stubba_test_result_test.rb +5 -8
  149. data/test/acceptance/stubbing_error_backtrace_test.rb +2 -2
  150. data/test/acceptance/stubbing_frozen_object_test.rb +2 -1
  151. data/test/acceptance/stubbing_method_accepting_block_parameter_test.rb +12 -7
  152. data/test/acceptance/stubbing_method_unnecessarily_test.rb +0 -2
  153. data/test/acceptance/stubbing_nil_test.rb +4 -5
  154. data/test/acceptance/stubbing_non_existent_any_instance_method_test.rb +1 -3
  155. data/test/acceptance/stubbing_non_existent_class_method_test.rb +3 -3
  156. data/test/acceptance/stubbing_non_existent_instance_method_test.rb +1 -3
  157. data/test/acceptance/stubbing_non_public_any_instance_method_test.rb +0 -2
  158. data/test/acceptance/stubbing_non_public_class_method_test.rb +3 -3
  159. data/test/acceptance/stubbing_non_public_instance_method_test.rb +1 -3
  160. data/test/acceptance/stubbing_on_non_mock_object_test.rb +4 -10
  161. data/test/acceptance/stubbing_same_class_method_on_parent_and_child_classes_test.rb +3 -4
  162. data/test/acceptance/throw_test.rb +0 -2
  163. data/test/acceptance/unexpected_invocation_test.rb +2 -3
  164. data/test/acceptance/unstubbing_test.rb +41 -14
  165. data/test/deprecation_disabler.rb +0 -1
  166. data/test/execution_point.rb +2 -4
  167. data/test/integration/mini_test_test.rb +2 -2
  168. data/test/integration/shared_tests.rb +24 -22
  169. data/test/integration/test_unit_test.rb +2 -2
  170. data/test/method_definer.rb +1 -3
  171. data/test/mini_test_result.rb +17 -11
  172. data/test/minitest_result.rb +0 -1
  173. data/test/simple_counter.rb +0 -2
  174. data/test/test_helper.rb +13 -5
  175. data/test/test_runner.rb +2 -4
  176. data/test/test_unit_result.rb +4 -2
  177. data/test/unit/any_instance_method_test.rb +31 -17
  178. data/test/unit/array_inspect_test.rb +2 -4
  179. data/test/unit/backtrace_filter_test.rb +3 -5
  180. data/test/unit/cardinality_test.rb +0 -2
  181. data/test/unit/central_test.rb +26 -27
  182. data/test/unit/change_state_side_effect_test.rb +0 -4
  183. data/test/unit/class_method_test.rb +59 -34
  184. data/test/unit/class_methods_test.rb +34 -5
  185. data/test/unit/configuration_test.rb +1 -2
  186. data/test/unit/date_time_inspect_test.rb +1 -3
  187. data/test/unit/exception_raiser_test.rb +0 -2
  188. data/test/unit/expectation_list_test.rb +0 -2
  189. data/test/unit/expectation_test.rb +41 -46
  190. data/test/unit/hash_inspect_test.rb +3 -5
  191. data/test/unit/hooks_test.rb +14 -8
  192. data/test/unit/in_state_ordering_constraint_test.rb +0 -4
  193. data/test/unit/method_matcher_test.rb +1 -3
  194. data/test/unit/mock_test.rb +35 -22
  195. data/test/unit/mockery_test.rb +45 -28
  196. data/test/unit/module_methods_test.rb +0 -2
  197. data/test/unit/multiple_yields_test.rb +0 -2
  198. data/test/unit/no_yields_test.rb +0 -2
  199. data/test/unit/object_inspect_test.rb +16 -7
  200. data/test/unit/object_methods_test.rb +22 -6
  201. data/test/unit/parameter_matchers/all_of_test.rb +0 -2
  202. data/test/unit/parameter_matchers/any_of_test.rb +0 -2
  203. data/test/unit/parameter_matchers/anything_test.rb +2 -4
  204. data/test/unit/parameter_matchers/equals_test.rb +1 -3
  205. data/test/unit/parameter_matchers/equivalent_uri_test.rb +0 -1
  206. data/test/unit/parameter_matchers/has_entries_test.rb +2 -2
  207. data/test/unit/parameter_matchers/has_entry_test.rb +13 -14
  208. data/test/unit/parameter_matchers/has_key_test.rb +0 -1
  209. data/test/unit/parameter_matchers/has_value_test.rb +0 -2
  210. data/test/unit/parameter_matchers/includes_test.rb +8 -9
  211. data/test/unit/parameter_matchers/instance_of_test.rb +1 -3
  212. data/test/unit/parameter_matchers/is_a_test.rb +1 -3
  213. data/test/unit/parameter_matchers/kind_of_test.rb +1 -3
  214. data/test/unit/parameter_matchers/not_test.rb +0 -2
  215. data/test/unit/parameter_matchers/regexp_matches_test.rb +1 -2
  216. data/test/unit/parameter_matchers/responds_with_test.rb +9 -3
  217. data/test/unit/parameter_matchers/stub_matcher.rb +0 -4
  218. data/test/unit/parameter_matchers/yaml_equivalent_test.rb +1 -3
  219. data/test/unit/parameters_matcher_test.rb +2 -4
  220. data/test/unit/receivers_test.rb +35 -5
  221. data/test/unit/return_values_test.rb +3 -5
  222. data/test/unit/sequence_test.rb +1 -5
  223. data/test/unit/single_return_value_test.rb +0 -2
  224. data/test/unit/single_yield_test.rb +0 -2
  225. data/test/unit/state_machine_test.rb +1 -3
  226. data/test/unit/string_inspect_test.rb +2 -4
  227. data/test/unit/thrower_test.rb +0 -2
  228. data/test/unit/yield_parameters_test.rb +0 -2
  229. data/yard-templates/default/layout/html/setup.rb +2 -3
  230. 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, ruby_version = nil)
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
- "monkey patch for Test::Unit gem >= v2.3.0 and <= v2.5.0"
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?(test_unit_version, ruby_version = nil)
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
- "nothing (no Test::Unit integration available)"
10
+ 'nothing (no Test::Unit integration available)'
11
11
  end
12
12
 
13
- def self.included(mod)
14
- raise "No Test::Unit integration available"
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
- "monkey patch for standard library in Ruby <= v1.8.5"
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
- "monkey patch for standard library Test::Unit in Ruby >= v1.8.6"
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
@@ -5,10 +5,9 @@ require 'mocha/integration/mini_test'
5
5
  module Mocha
6
6
  module Integration
7
7
  def self.activate
8
- if [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'`.")
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
@@ -1,9 +1,7 @@
1
1
  class Object
2
-
3
2
  # :stopdoc:
4
3
 
5
4
  alias_method :__is_a__, :is_a?
6
5
 
7
6
  # :startdoc:
8
-
9
7
  end
data/lib/mocha/logger.rb CHANGED
@@ -1,7 +1,5 @@
1
1
  module Mocha
2
-
3
2
  class Logger
4
-
5
3
  def initialize(io)
6
4
  @io = io
7
5
  end
@@ -9,7 +7,5 @@ module Mocha
9
7
  def warn(message)
10
8
  @io.puts "WARNING: #{message}"
11
9
  end
12
-
13
10
  end
14
-
15
11
  end
@@ -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
- "#{@expected_method_name}"
14
+ @expected_method_name.to_s
17
15
  end
18
-
19
16
  end
20
-
21
17
  end
@@ -1,3 +1,3 @@
1
- require "mocha/integration/mini_test"
1
+ require 'mocha/integration/mini_test'
2
2
 
3
3
  Mocha::Integration::MiniTest.activate
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 { |*args|
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) if args.length > 0
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 { |*args|
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) if args.length > 0
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
- if block
265
- Deprecation.warning('Passing a block is deprecated. Use Object#tap or define stubs/expectations with an explicit receiver instead.')
266
- instance_eval(&block)
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 and not @responder.respond_to?(symbol)
298
- raise NoMethodError, "undefined method `#{symbol}' for #{self.mocha_inspect} which responds like #{@responder.mocha_inspect}"
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
- else
303
- if (matching_expectation = all_expectations.match(symbol, *arguments)) || (!matching_expectation && !@everything_stubbed)
304
- if @unexpected_invocation.nil?
305
- @unexpected_invocation = UnexpectedInvocation.new(self, symbol, *arguments)
306
- matching_expectation.invoke(&block) if matching_expectation
307
- message = @unexpected_invocation.full_description
308
- message << @mockery.mocha_inspect
309
- else
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 then
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
- self.__metaclass__.send(:undef_method, method_name) if self.__metaclass__.method_defined?(method_name) || self.__metaclass__.private_method_defined?(method_name)
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
- class << self
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
- @instance ||= new
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
- def reset_instance
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
- backtrace = caller
61
- else
62
- backtrace = unsatisfied_expectations[0].backtrace
63
- end
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
- unless e.used?
69
- on_stubbing_method_unnecessarily(e)
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 { |e| e.mocha_inspect }.join("\n- ")}\n" unless unsatisfied_expectations.empty?
95
- message << "satisfied expectations:\n- #{satisfied_expectations.map { |e| e.mocha_inspect }.join("\n- ")}\n" unless satisfied_expectations.empty?
96
- message << "states:\n- #{state_machines.map { |sm| sm.mocha_inspect }.join("\n- ")}" unless state_machines.empty?
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, include_public_methods = true)
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, include_public_methods = false)
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
- unless Mocha::Configuration.allow?(:stubbing_method_on_non_mock_object)
118
- on_stubbing_method_on_non_mock_object(object, method)
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
- if Mocha::Configuration.warn_when?(:stubbing_non_existent_method)
127
- logger.warn "stubbing non-existent method: #{object.mocha_inspect}.#{method}"
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
- if Mocha::Configuration.warn_when?(:stubbing_non_public_method)
136
- logger.warn "stubbing non-public method: #{object.mocha_inspect}.#{method}"
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
- if Mocha::Configuration.warn_when?(:stubbing_method_on_nil)
145
- logger.warn "stubbing method on nil: #{object.mocha_inspect}.#{method}"
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
- 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
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
- if Mocha::Configuration.warn_when?(:stubbing_method_unnecessarily)
163
- logger.warn "stubbing method unnecessarily: #{expectation.method_signature}"
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 { |e| e.verified? }
202
+ expectations.reject(&:verified?)
182
203
  end
183
204
 
184
205
  def satisfied_expectations
185
- expectations.select { |e| e.verified? }
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
@@ -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
@@ -1,14 +1,10 @@
1
1
  require 'mocha/module_method'
2
2
 
3
3
  module Mocha
4
-
5
4
  # @private
6
5
  module ModuleMethods
7
-
8
6
  def stubba_method
9
7
  Mocha::ModuleMethod
10
8
  end
11
-
12
9
  end
13
-
14
10
  end
@@ -1,7 +1,5 @@
1
1
  module Mocha
2
-
3
2
  class MultipleYields
4
-
5
3
  attr_reader :parameter_groups
6
4
 
7
5
  def initialize(*parameter_groups)
@@ -13,8 +11,5 @@ module Mocha
13
11
  yield(parameter_group)
14
12
  end
15
13
  end
16
-
17
14
  end
18
-
19
15
  end
20
-
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' % address}>"
40
+ "#<Mock:0x#{format('%x', address)}>"
49
41
  end
50
-
51
42
  end
52
-
53
43
  end
@@ -1,11 +1,5 @@
1
1
  module Mocha
2
-
3
2
  class NoYields
4
-
5
- def each
6
- end
7
-
3
+ def each; end
8
4
  end
9
-
10
5
  end
11
-
@@ -0,0 +1,7 @@
1
+ require 'mocha/error_with_filtered_backtrace'
2
+
3
+ module Mocha
4
+ # Exception raised when Mocha has not been initialized, e.g. outside the
5
+ # context of a test.
6
+ class NotInitializedError < ErrorWithFilteredBacktrace; end
7
+ end