mocha 1.5.0 → 1.10.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (310) hide show
  1. checksums.yaml +5 -5
  2. data/.rubocop.yml +61 -0
  3. data/.rubocop_todo.yml +27 -0
  4. data/CONTRIBUTING.md +4 -9
  5. data/README.md +66 -97
  6. data/RELEASE.md +93 -0
  7. data/Rakefile +44 -38
  8. data/bin/build-matrix +32 -20
  9. data/docs/CNAME +1 -0
  10. data/docs/Mocha.html +254 -0
  11. data/docs/Mocha/API.html +1153 -0
  12. data/docs/Mocha/ClassMethods.html +264 -0
  13. data/docs/Mocha/Configuration.html +1383 -0
  14. data/docs/Mocha/Expectation.html +2654 -0
  15. data/docs/Mocha/ExpectationError.html +152 -0
  16. data/docs/Mocha/ExpectationErrorFactory.html +260 -0
  17. data/docs/Mocha/Hooks.html +370 -0
  18. data/docs/Mocha/Integration.html +125 -0
  19. data/docs/Mocha/Integration/MiniTest.html +123 -0
  20. data/docs/Mocha/Integration/MiniTest/Adapter.html +164 -0
  21. data/docs/Mocha/Integration/TestUnit.html +123 -0
  22. data/docs/Mocha/Integration/TestUnit/Adapter.html +164 -0
  23. data/docs/Mocha/Mock.html +1237 -0
  24. data/docs/Mocha/ObjectMethods.html +765 -0
  25. data/docs/Mocha/ParameterMatchers.html +2961 -0
  26. data/docs/Mocha/ParameterMatchers/AllOf.html +153 -0
  27. data/docs/Mocha/ParameterMatchers/AnyOf.html +153 -0
  28. data/docs/Mocha/ParameterMatchers/AnyParameters.html +153 -0
  29. data/docs/Mocha/ParameterMatchers/Anything.html +153 -0
  30. data/docs/Mocha/ParameterMatchers/Base.html +441 -0
  31. data/docs/Mocha/ParameterMatchers/Equals.html +153 -0
  32. data/docs/Mocha/ParameterMatchers/EquivalentUri.html +153 -0
  33. data/docs/Mocha/ParameterMatchers/HasEntries.html +153 -0
  34. data/docs/Mocha/ParameterMatchers/HasEntry.html +153 -0
  35. data/docs/Mocha/ParameterMatchers/HasKey.html +153 -0
  36. data/docs/Mocha/ParameterMatchers/HasValue.html +153 -0
  37. data/docs/Mocha/ParameterMatchers/Includes.html +153 -0
  38. data/docs/Mocha/ParameterMatchers/InstanceOf.html +153 -0
  39. data/docs/Mocha/ParameterMatchers/IsA.html +153 -0
  40. data/docs/Mocha/ParameterMatchers/KindOf.html +153 -0
  41. data/docs/Mocha/ParameterMatchers/Not.html +153 -0
  42. data/docs/Mocha/ParameterMatchers/Optionally.html +153 -0
  43. data/docs/Mocha/ParameterMatchers/RegexpMatches.html +153 -0
  44. data/docs/Mocha/ParameterMatchers/RespondsWith.html +153 -0
  45. data/docs/Mocha/ParameterMatchers/YamlEquivalent.html +153 -0
  46. data/docs/Mocha/Sequence.html +149 -0
  47. data/docs/Mocha/StateMachine.html +527 -0
  48. data/docs/Mocha/StateMachine/State.html +140 -0
  49. data/docs/Mocha/StateMachine/StatePredicate.html +140 -0
  50. data/docs/Mocha/StubbingError.html +150 -0
  51. data/docs/_index.html +519 -0
  52. data/docs/class_list.html +51 -0
  53. data/docs/css/common.css +1 -0
  54. data/docs/css/full_list.css +58 -0
  55. data/docs/css/style.css +496 -0
  56. data/docs/file.COPYING.html +81 -0
  57. data/docs/file.MIT-LICENSE.html +85 -0
  58. data/docs/file.README.html +448 -0
  59. data/docs/file.RELEASE.html +956 -0
  60. data/docs/file_list.html +71 -0
  61. data/docs/frames.html +17 -0
  62. data/docs/index.html +448 -0
  63. data/docs/js/app.js +303 -0
  64. data/docs/js/full_list.js +216 -0
  65. data/docs/js/jquery.js +4 -0
  66. data/docs/method_list.html +627 -0
  67. data/docs/top-level-namespace.html +118 -0
  68. data/gemfiles/Gemfile.minitest.5.11.3 +7 -0
  69. data/init.rb +1 -3
  70. data/lib/mocha.rb +8 -0
  71. data/lib/mocha/any_instance_method.rb +11 -59
  72. data/lib/mocha/api.rb +65 -70
  73. data/lib/mocha/argument_iterator.rb +4 -8
  74. data/lib/mocha/backtrace_filter.rb +1 -5
  75. data/lib/mocha/cardinality.rb +43 -35
  76. data/lib/mocha/central.rb +7 -15
  77. data/lib/mocha/change_state_side_effect.rb +0 -4
  78. data/lib/mocha/class_methods.rb +19 -21
  79. data/lib/mocha/configuration.rb +305 -18
  80. data/lib/mocha/debug.rb +3 -2
  81. data/lib/mocha/deprecation.rb +4 -11
  82. data/lib/mocha/detection/mini_test.rb +0 -2
  83. data/lib/mocha/detection/test_unit.rb +3 -5
  84. data/lib/mocha/error_with_filtered_backtrace.rb +0 -4
  85. data/lib/mocha/exception_raiser.rb +4 -6
  86. data/lib/mocha/expectation.rb +62 -67
  87. data/lib/mocha/expectation_error.rb +1 -1
  88. data/lib/mocha/expectation_error_factory.rb +0 -1
  89. data/lib/mocha/expectation_list.rb +7 -11
  90. data/lib/mocha/hooks.rb +0 -1
  91. data/lib/mocha/in_state_ordering_constraint.rb +0 -4
  92. data/lib/mocha/inspect.rb +28 -28
  93. data/lib/mocha/instance_method.rb +18 -3
  94. data/lib/mocha/integration.rb +2 -5
  95. data/lib/mocha/integration/mini_test.rb +7 -0
  96. data/lib/mocha/integration/mini_test/adapter.rb +2 -4
  97. data/lib/mocha/integration/mini_test/exception_translation.rb +1 -1
  98. data/lib/mocha/integration/mini_test/nothing.rb +4 -4
  99. data/lib/mocha/integration/mini_test/version_13.rb +3 -1
  100. data/lib/mocha/integration/mini_test/version_140.rb +3 -1
  101. data/lib/mocha/integration/mini_test/version_141.rb +3 -1
  102. data/lib/mocha/integration/mini_test/version_142_to_172.rb +3 -1
  103. data/lib/mocha/integration/mini_test/version_200.rb +3 -1
  104. data/lib/mocha/integration/mini_test/version_201_to_222.rb +3 -1
  105. data/lib/mocha/integration/mini_test/version_2110_to_2111.rb +3 -1
  106. data/lib/mocha/integration/mini_test/version_2112_to_320.rb +3 -1
  107. data/lib/mocha/integration/mini_test/version_230_to_2101.rb +3 -1
  108. data/lib/mocha/integration/monkey_patcher.rb +5 -7
  109. data/lib/mocha/integration/test_unit.rb +7 -0
  110. data/lib/mocha/integration/test_unit/adapter.rb +5 -6
  111. data/lib/mocha/integration/test_unit/gem_version_200.rb +4 -2
  112. data/lib/mocha/integration/test_unit/gem_version_201_to_202.rb +4 -2
  113. data/lib/mocha/integration/test_unit/gem_version_203_to_220.rb +4 -2
  114. data/lib/mocha/integration/test_unit/gem_version_230_to_250.rb +4 -2
  115. data/lib/mocha/integration/test_unit/nothing.rb +4 -4
  116. data/lib/mocha/integration/test_unit/ruby_version_185_and_below.rb +3 -1
  117. data/lib/mocha/integration/test_unit/ruby_version_186_and_above.rb +3 -1
  118. data/lib/mocha/invocation.rb +61 -0
  119. data/lib/mocha/is_a.rb +0 -2
  120. data/lib/mocha/logger.rb +0 -4
  121. data/lib/mocha/macos_version.rb +5 -0
  122. data/lib/mocha/method_matcher.rb +1 -5
  123. data/lib/mocha/minitest.rb +7 -2
  124. data/lib/mocha/mock.rb +57 -47
  125. data/lib/mocha/mockery.rb +41 -90
  126. data/lib/mocha/multiple_yields.rb +0 -5
  127. data/lib/mocha/names.rb +2 -12
  128. data/lib/mocha/no_yields.rb +1 -7
  129. data/lib/mocha/not_initialized_error.rb +0 -2
  130. data/lib/mocha/object_methods.rb +25 -31
  131. data/lib/mocha/parameter_matchers.rb +1 -3
  132. data/lib/mocha/parameter_matchers/all_of.rb +2 -8
  133. data/lib/mocha/parameter_matchers/any_of.rb +2 -8
  134. data/lib/mocha/parameter_matchers/any_parameters.rb +3 -9
  135. data/lib/mocha/parameter_matchers/anything.rb +2 -8
  136. data/lib/mocha/parameter_matchers/base.rb +6 -12
  137. data/lib/mocha/parameter_matchers/equals.rb +0 -6
  138. data/lib/mocha/parameter_matchers/equivalent_uri.rb +3 -12
  139. data/lib/mocha/parameter_matchers/has_entries.rb +2 -6
  140. data/lib/mocha/parameter_matchers/has_entry.rb +8 -11
  141. data/lib/mocha/parameter_matchers/has_key.rb +2 -6
  142. data/lib/mocha/parameter_matchers/has_value.rb +2 -6
  143. data/lib/mocha/parameter_matchers/includes.rb +4 -6
  144. data/lib/mocha/parameter_matchers/instance_methods.rb +18 -0
  145. data/lib/mocha/parameter_matchers/instance_of.rb +0 -6
  146. data/lib/mocha/parameter_matchers/is_a.rb +2 -6
  147. data/lib/mocha/parameter_matchers/kind_of.rb +2 -6
  148. data/lib/mocha/parameter_matchers/not.rb +2 -6
  149. data/lib/mocha/parameter_matchers/optionally.rb +4 -10
  150. data/lib/mocha/parameter_matchers/regexp_matches.rb +0 -6
  151. data/lib/mocha/parameter_matchers/responds_with.rb +3 -8
  152. data/lib/mocha/parameter_matchers/yaml_equivalent.rb +2 -6
  153. data/lib/mocha/parameters_matcher.rb +6 -9
  154. data/lib/mocha/pretty_parameters.rb +0 -4
  155. data/lib/mocha/raised_exception.rb +11 -0
  156. data/lib/mocha/receivers.rb +10 -14
  157. data/lib/mocha/return_values.rb +4 -8
  158. data/lib/mocha/sequence.rb +4 -9
  159. data/lib/mocha/setup.rb +5 -0
  160. data/lib/mocha/single_return_value.rb +2 -5
  161. data/lib/mocha/single_yield.rb +0 -5
  162. data/lib/mocha/singleton_class.rb +9 -0
  163. data/lib/mocha/state_machine.rb +6 -10
  164. data/lib/mocha/stubbed_method.rb +127 -0
  165. data/lib/mocha/stubbing_error.rb +0 -2
  166. data/lib/mocha/test_unit.rb +7 -2
  167. data/lib/mocha/thrower.rb +4 -6
  168. data/lib/mocha/thrown_object.rb +12 -0
  169. data/lib/mocha/version.rb +1 -1
  170. data/lib/mocha/yield_parameters.rb +3 -7
  171. data/mocha.gemspec +33 -60
  172. data/test/acceptance/acceptance_test_helper.rb +6 -4
  173. data/test/acceptance/bug_18914_test.rb +7 -13
  174. data/test/acceptance/bug_21465_test.rb +0 -3
  175. data/test/acceptance/bug_21563_test.rb +0 -3
  176. data/test/acceptance/display_matching_invocations_alongside_expectations_test.rb +69 -0
  177. data/test/acceptance/exception_rescue_test.rb +7 -9
  178. data/test/acceptance/expectations_on_multiple_methods_test.rb +2 -2
  179. data/test/acceptance/expected_invocation_count_test.rb +27 -30
  180. data/test/acceptance/failure_messages_test.rb +3 -6
  181. data/test/acceptance/issue_272_test.rb +1 -3
  182. data/test/acceptance/issue_65_test.rb +15 -14
  183. data/test/acceptance/issue_70_test.rb +0 -2
  184. data/test/acceptance/mocha_example_test.rb +5 -7
  185. data/test/acceptance/mocha_test_result_test.rb +7 -8
  186. data/test/acceptance/mock_test.rb +48 -9
  187. data/test/acceptance/mocked_methods_dispatch_test.rb +0 -3
  188. data/test/acceptance/multiple_expectations_failure_message_test.rb +16 -18
  189. data/test/acceptance/optional_parameters_test.rb +0 -3
  190. data/test/acceptance/parameter_matcher_test.rb +2 -4
  191. data/test/acceptance/partial_mocks_test.rb +4 -7
  192. data/test/acceptance/prepend_test.rb +14 -17
  193. data/test/acceptance/prevent_use_of_mocha_outside_test_test.rb +0 -3
  194. data/test/acceptance/raise_exception_test.rb +2 -5
  195. data/test/acceptance/return_value_test.rb +0 -3
  196. data/test/acceptance/sequence_test.rb +9 -12
  197. data/test/acceptance/states_test.rb +6 -5
  198. data/test/acceptance/stub_any_instance_method_defined_on_superclass_test.rb +33 -3
  199. data/test/acceptance/stub_any_instance_method_test.rb +39 -18
  200. data/test/acceptance/stub_class_method_defined_on_active_record_association_proxy_test.rb +8 -9
  201. data/test/acceptance/stub_class_method_defined_on_class_test.rb +2 -2
  202. data/test/acceptance/stub_class_method_defined_on_module_test.rb +0 -2
  203. data/test/acceptance/stub_class_method_defined_on_superclass_test.rb +34 -2
  204. data/test/acceptance/stub_everything_test.rb +1 -4
  205. data/test/acceptance/stub_instance_method_defined_on_active_record_association_proxy_test.rb +6 -8
  206. data/test/acceptance/stub_instance_method_defined_on_class_and_aliased_test.rb +0 -2
  207. data/test/acceptance/stub_instance_method_defined_on_class_test.rb +0 -2
  208. data/test/acceptance/stub_instance_method_defined_on_kernel_module_test.rb +63 -2
  209. data/test/acceptance/stub_instance_method_defined_on_module_test.rb +0 -2
  210. data/test/acceptance/stub_instance_method_defined_on_object_class_test.rb +2 -2
  211. data/test/acceptance/stub_instance_method_defined_on_singleton_class_test.rb +0 -3
  212. data/test/acceptance/stub_instance_method_defined_on_superclass_test.rb +0 -2
  213. data/test/acceptance/stub_method_defined_on_module_and_aliased_test.rb +0 -1
  214. data/test/acceptance/stub_module_method_test.rb +13 -14
  215. data/test/acceptance/stub_test.rb +1 -4
  216. data/test/acceptance/stubba_example_test.rb +6 -15
  217. data/test/acceptance/stubba_test_result_test.rb +5 -9
  218. data/test/acceptance/stubbing_error_backtrace_test.rb +6 -7
  219. data/test/acceptance/stubbing_frozen_object_test.rb +2 -2
  220. data/test/acceptance/stubbing_method_accepting_block_parameter_test.rb +12 -8
  221. data/test/acceptance/stubbing_method_unnecessarily_test.rb +5 -7
  222. data/test/acceptance/stubbing_nil_test.rb +9 -10
  223. data/test/acceptance/stubbing_non_existent_any_instance_method_test.rb +12 -14
  224. data/test/acceptance/stubbing_non_existent_class_method_test.rb +14 -14
  225. data/test/acceptance/stubbing_non_existent_instance_method_test.rb +12 -14
  226. data/test/acceptance/stubbing_non_public_any_instance_method_test.rb +8 -10
  227. data/test/acceptance/stubbing_non_public_class_method_test.rb +12 -12
  228. data/test/acceptance/stubbing_non_public_instance_method_test.rb +10 -12
  229. data/test/acceptance/stubbing_on_non_mock_object_test.rb +9 -15
  230. data/test/acceptance/stubbing_same_class_method_on_parent_and_child_classes_test.rb +3 -5
  231. data/test/acceptance/throw_test.rb +0 -3
  232. data/test/acceptance/unexpected_invocation_test.rb +2 -4
  233. data/test/acceptance/unstubbing_test.rb +41 -15
  234. data/test/deprecation_disabler.rb +0 -1
  235. data/test/execution_point.rb +2 -4
  236. data/test/integration/mini_test_test.rb +2 -2
  237. data/test/integration/shared_tests.rb +27 -23
  238. data/test/integration/test_unit_test.rb +2 -2
  239. data/test/method_definer.rb +11 -19
  240. data/test/mini_test_result.rb +17 -11
  241. data/test/minitest_result.rb +0 -1
  242. data/test/simple_counter.rb +0 -2
  243. data/test/test_helper.rb +13 -5
  244. data/test/test_runner.rb +4 -4
  245. data/test/test_unit_result.rb +4 -2
  246. data/test/unit/any_instance_method_test.rb +74 -35
  247. data/test/unit/array_inspect_test.rb +2 -4
  248. data/test/unit/backtrace_filter_test.rb +3 -5
  249. data/test/unit/cardinality_test.rb +41 -25
  250. data/test/unit/central_test.rb +26 -28
  251. data/test/unit/change_state_side_effect_test.rb +0 -4
  252. data/test/unit/class_methods_test.rb +35 -6
  253. data/test/unit/configuration_test.rb +13 -14
  254. data/test/unit/date_time_inspect_test.rb +1 -3
  255. data/test/unit/exception_raiser_test.rb +10 -7
  256. data/test/unit/expectation_list_test.rb +13 -13
  257. data/test/unit/expectation_test.rb +110 -130
  258. data/test/unit/hash_inspect_test.rb +3 -5
  259. data/test/unit/hooks_test.rb +9 -4
  260. data/test/unit/in_state_ordering_constraint_test.rb +0 -4
  261. data/test/unit/instance_method_test.rb +282 -0
  262. data/test/unit/method_matcher_test.rb +1 -3
  263. data/test/unit/mock_test.rb +47 -25
  264. data/test/unit/mockery_test.rb +32 -33
  265. data/test/unit/module_methods_test.rb +2 -5
  266. data/test/unit/multiple_yields_test.rb +0 -2
  267. data/test/unit/no_yields_test.rb +0 -2
  268. data/test/unit/object_inspect_test.rb +26 -5
  269. data/test/unit/object_methods_test.rb +19 -8
  270. data/test/unit/parameter_matchers/all_of_test.rb +0 -2
  271. data/test/unit/parameter_matchers/any_of_test.rb +0 -2
  272. data/test/unit/parameter_matchers/anything_test.rb +2 -4
  273. data/test/unit/parameter_matchers/equals_test.rb +1 -3
  274. data/test/unit/parameter_matchers/equivalent_uri_test.rb +0 -10
  275. data/test/unit/parameter_matchers/has_entries_test.rb +3 -3
  276. data/test/unit/parameter_matchers/has_entry_test.rb +14 -15
  277. data/test/unit/parameter_matchers/has_key_test.rb +1 -2
  278. data/test/unit/parameter_matchers/has_value_test.rb +1 -3
  279. data/test/unit/parameter_matchers/includes_test.rb +9 -10
  280. data/test/unit/parameter_matchers/instance_of_test.rb +1 -3
  281. data/test/unit/parameter_matchers/is_a_test.rb +1 -3
  282. data/test/unit/parameter_matchers/kind_of_test.rb +1 -3
  283. data/test/unit/parameter_matchers/not_test.rb +0 -2
  284. data/test/unit/parameter_matchers/regexp_matches_test.rb +1 -2
  285. data/test/unit/parameter_matchers/responds_with_test.rb +10 -4
  286. data/test/unit/parameter_matchers/stub_matcher.rb +0 -4
  287. data/test/unit/parameter_matchers/yaml_equivalent_test.rb +1 -3
  288. data/test/unit/parameters_matcher_test.rb +2 -4
  289. data/test/unit/receivers_test.rb +35 -5
  290. data/test/unit/return_values_test.rb +28 -25
  291. data/test/unit/sequence_test.rb +1 -5
  292. data/test/unit/single_return_value_test.rb +6 -3
  293. data/test/unit/single_yield_test.rb +0 -2
  294. data/test/unit/state_machine_test.rb +1 -3
  295. data/test/unit/string_inspect_test.rb +2 -4
  296. data/test/unit/thrower_test.rb +7 -4
  297. data/test/unit/yield_parameters_test.rb +0 -2
  298. data/yard-templates/default/layout/html/google_analytics.erb +6 -9
  299. data/yard-templates/default/layout/html/setup.rb +2 -3
  300. metadata +81 -49
  301. data/lib/mocha/class_method.rb +0 -119
  302. data/lib/mocha/mini_test.rb +0 -5
  303. data/lib/mocha/module_method.rb +0 -16
  304. data/lib/mocha/module_methods.rb +0 -14
  305. data/lib/mocha/parameter_matchers/object.rb +0 -17
  306. data/lib/mocha/standalone.rb +0 -4
  307. data/lib/mocha/unexpected_invocation.rb +0 -26
  308. data/lib/mocha_standalone.rb +0 -4
  309. data/test/acceptance/mock_with_initializer_block_test.rb +0 -58
  310. data/test/unit/class_method_test.rb +0 -229
@@ -11,11 +11,8 @@ require 'mocha/not_initialized_error'
11
11
  require 'mocha/expectation_error_factory'
12
12
 
13
13
  module Mocha
14
-
15
14
  class Mockery
16
-
17
15
  class Null < self
18
-
19
16
  def add_mock(*)
20
17
  raise_not_initialized_error
21
18
  end
@@ -34,11 +31,9 @@ module Mocha
34
31
  message = 'Mocha methods cannot be used outside the context of a test'
35
32
  raise NotInitializedError.new(message, caller)
36
33
  end
37
-
38
34
  end
39
35
 
40
36
  class << self
41
-
42
37
  def instance
43
38
  instances.last || Null.new
44
39
  end
@@ -65,23 +60,22 @@ module Mocha
65
60
  def instances
66
61
  @instances ||= []
67
62
  end
68
-
69
63
  end
70
64
 
71
- def named_mock(name, &block)
72
- add_mock(Mock.new(self, Name.new(name), &block))
65
+ def named_mock(name)
66
+ add_mock(Mock.new(self, Name.new(name)))
73
67
  end
74
68
 
75
- def unnamed_mock(&block)
76
- add_mock(Mock.new(self, &block))
69
+ def unnamed_mock
70
+ add_mock(Mock.new(self))
77
71
  end
78
72
 
79
- def mock_impersonating(object, &block)
80
- add_mock(Mock.new(self, ImpersonatingName.new(object), ObjectReceiver.new(object), &block))
73
+ def mock_impersonating(object)
74
+ add_mock(Mock.new(self, ImpersonatingName.new(object), ObjectReceiver.new(object)))
81
75
  end
82
76
 
83
- def mock_impersonating_any_instance_of(klass, &block)
84
- add_mock(Mock.new(self, ImpersonatingAnyInstanceName.new(klass), AnyInstanceReceiver.new(klass), &block))
77
+ def mock_impersonating_any_instance_of(klass)
78
+ add_mock(Mock.new(self, ImpersonatingAnyInstanceName.new(klass), AnyInstanceReceiver.new(klass)))
85
79
  end
86
80
 
87
81
  def new_state_machine(name)
@@ -91,18 +85,17 @@ module Mocha
91
85
  def verify(assertion_counter = nil)
92
86
  unless mocks.all? { |mock| mock.__verified__?(assertion_counter) }
93
87
  message = "not all expectations were satisfied\n#{mocha_inspect}"
94
- if unsatisfied_expectations.empty?
95
- backtrace = caller
96
- else
97
- backtrace = unsatisfied_expectations[0].backtrace
98
- end
88
+ backtrace = if unsatisfied_expectations.empty?
89
+ caller
90
+ else
91
+ unsatisfied_expectations[0].backtrace
92
+ end
99
93
  raise ExpectationErrorFactory.build(message, backtrace)
100
94
  end
101
95
  expectations.each do |e|
102
- unless Mocha::Configuration.allow?(:stubbing_method_unnecessarily)
103
- unless e.used?
104
- on_stubbing_method_unnecessarily(e)
105
- end
96
+ unless Mocha.configuration.stubbing_method_unnecessarily == :allow
97
+ next if e.used?
98
+ on_stubbing_method_unnecessarily(e)
106
99
  end
107
100
  end
108
101
  end
@@ -125,78 +118,28 @@ module Mocha
125
118
  end
126
119
 
127
120
  def mocha_inspect
128
- message = ""
129
- message << "unsatisfied expectations:\n- #{unsatisfied_expectations.map { |e| e.mocha_inspect }.join("\n- ")}\n" unless unsatisfied_expectations.empty?
130
- message << "satisfied expectations:\n- #{satisfied_expectations.map { |e| e.mocha_inspect }.join("\n- ")}\n" unless satisfied_expectations.empty?
131
- 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?
132
125
  message
133
126
  end
134
127
 
135
128
  def on_stubbing(object, method)
136
129
  method = PRE_RUBY_V19 ? method.to_s : method.to_sym
137
- unless Mocha::Configuration.allow?(:stubbing_non_existent_method)
138
- unless object.method_exists?(method, include_public_methods = true)
139
- on_stubbing_non_existent_method(object, method)
140
- end
141
- end
142
- unless Mocha::Configuration.allow?(:stubbing_non_public_method)
143
- if object.method_exists?(method, include_public_methods = false)
144
- on_stubbing_non_public_method(object, method)
145
- end
146
- end
147
- unless Mocha::Configuration.allow?(:stubbing_method_on_nil)
148
- if object.nil?
149
- on_stubbing_method_on_nil(object, method)
150
- end
151
- end
152
- unless Mocha::Configuration.allow?(:stubbing_method_on_non_mock_object)
153
- on_stubbing_method_on_non_mock_object(object, method)
154
- end
155
- end
156
-
157
- def on_stubbing_non_existent_method(object, method)
158
- if Mocha::Configuration.prevent?(:stubbing_non_existent_method)
159
- raise StubbingError.new("stubbing non-existent method: #{object.mocha_inspect}.#{method}", caller)
160
- end
161
- if Mocha::Configuration.warn_when?(:stubbing_non_existent_method)
162
- logger.warn "stubbing non-existent method: #{object.mocha_inspect}.#{method}"
163
- end
164
- end
165
-
166
- def on_stubbing_non_public_method(object, method)
167
- if Mocha::Configuration.prevent?(:stubbing_non_public_method)
168
- raise StubbingError.new("stubbing non-public method: #{object.mocha_inspect}.#{method}", caller)
169
- end
170
- if Mocha::Configuration.warn_when?(:stubbing_non_public_method)
171
- logger.warn "stubbing non-public method: #{object.mocha_inspect}.#{method}"
172
- end
173
- end
174
-
175
- def on_stubbing_method_on_nil(object, method)
176
- if Mocha::Configuration.prevent?(:stubbing_method_on_nil)
177
- raise StubbingError.new("stubbing method on nil: #{object.mocha_inspect}.#{method}", caller)
178
- end
179
- if Mocha::Configuration.warn_when?(:stubbing_method_on_nil)
180
- logger.warn "stubbing method on nil: #{object.mocha_inspect}.#{method}"
181
- end
182
- end
183
-
184
- def on_stubbing_method_on_non_mock_object(object, method)
185
- if Mocha::Configuration.prevent?(:stubbing_method_on_non_mock_object)
186
- raise StubbingError.new("stubbing method on non-mock object: #{object.mocha_inspect}.#{method}", caller)
130
+ method_signature = "#{object.mocha_inspect}.#{method}"
131
+ check(:stubbing_non_existent_method, 'non-existent method', method_signature) do
132
+ !(object.stubba_class.__method_exists__?(method, true) || object.respond_to?(method.to_sym))
187
133
  end
188
- if Mocha::Configuration.warn_when?(:stubbing_method_on_non_mock_object)
189
- logger.warn "stubbing method on non-mock object: #{object.mocha_inspect}.#{method}"
134
+ check(:stubbing_non_public_method, 'non-public method', method_signature) do
135
+ object.stubba_class.__method_exists__?(method, false)
190
136
  end
137
+ check(:stubbing_method_on_nil, 'method on nil', method_signature) { object.nil? }
138
+ check(:stubbing_method_on_non_mock_object, 'method on non-mock object', method_signature)
191
139
  end
192
140
 
193
141
  def on_stubbing_method_unnecessarily(expectation)
194
- if Mocha::Configuration.prevent?(:stubbing_method_unnecessarily)
195
- raise StubbingError.new("stubbing method unnecessarily: #{expectation.method_signature}", expectation.backtrace)
196
- end
197
- if Mocha::Configuration.warn_when?(:stubbing_method_unnecessarily)
198
- logger.warn "stubbing method unnecessarily: #{expectation.method_signature}"
199
- end
142
+ check(:stubbing_method_unnecessarily, 'method unnecessarily', expectation.method_signature, expectation.backtrace)
200
143
  end
201
144
 
202
145
  attr_writer :logger
@@ -205,19 +148,29 @@ module Mocha
205
148
  @logger ||= Logger.new($stderr)
206
149
  end
207
150
 
208
-
209
151
  private
210
152
 
153
+ def check(action, description, method_signature, backtrace = caller)
154
+ return if block_given? && !yield
155
+ message = "stubbing #{description}: #{method_signature}"
156
+ case Mocha.configuration.send(action)
157
+ when :warn
158
+ logger.warn(message)
159
+ when :prevent
160
+ raise StubbingError.new(message, backtrace)
161
+ end
162
+ end
163
+
211
164
  def expectations
212
165
  mocks.map { |mock| mock.__expectations__.to_a }.flatten
213
166
  end
214
167
 
215
168
  def unsatisfied_expectations
216
- expectations.reject { |e| e.verified? }
169
+ expectations.reject(&:verified?)
217
170
  end
218
171
 
219
172
  def satisfied_expectations
220
- expectations.select { |e| e.verified? }
173
+ expectations.select(&:verified?)
221
174
  end
222
175
 
223
176
  def add_mock(mock)
@@ -235,7 +188,5 @@ module Mocha
235
188
  @mocks = nil
236
189
  @state_machines = nil
237
190
  end
238
-
239
191
  end
240
-
241
192
  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
-
@@ -1,7 +1,5 @@
1
1
  module Mocha
2
-
3
2
  class ImpersonatingName
4
-
5
3
  def initialize(object)
6
4
  @object = object
7
5
  end
@@ -9,11 +7,9 @@ module Mocha
9
7
  def mocha_inspect
10
8
  @object.mocha_inspect
11
9
  end
12
-
13
10
  end
14
11
 
15
12
  class ImpersonatingAnyInstanceName
16
-
17
13
  def initialize(klass)
18
14
  @klass = klass
19
15
  end
@@ -21,23 +17,19 @@ module Mocha
21
17
  def mocha_inspect
22
18
  "#<AnyInstance:#{@klass.mocha_inspect}>"
23
19
  end
24
-
25
20
  end
26
21
 
27
22
  class Name
28
-
29
23
  def initialize(name)
30
- @name = name
24
+ @name = name.to_s
31
25
  end
32
26
 
33
27
  def mocha_inspect
34
28
  "#<Mock:#{@name}>"
35
29
  end
36
-
37
30
  end
38
31
 
39
32
  class DefaultName
40
-
41
33
  def initialize(mock)
42
34
  @mock = mock
43
35
  end
@@ -45,9 +37,7 @@ module Mocha
45
37
  def mocha_inspect
46
38
  address = @mock.__id__ * 2
47
39
  address += 0x100000000 if address < 0
48
- "#<Mock:0x#{'%x' % 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
-
@@ -1,9 +1,7 @@
1
1
  require 'mocha/error_with_filtered_backtrace'
2
2
 
3
3
  module Mocha
4
-
5
4
  # Exception raised when Mocha has not been initialized, e.g. outside the
6
5
  # context of a test.
7
6
  class NotInitializedError < ErrorWithFilteredBacktrace; end
8
-
9
7
  end
@@ -4,18 +4,20 @@ require 'mocha/argument_iterator'
4
4
  require 'mocha/expectation_error_factory'
5
5
 
6
6
  module Mocha
7
-
8
7
  # Methods added to all objects to allow mocking and stubbing on real (i.e. non-mock) objects.
9
8
  #
10
9
  # Both {#expects} and {#stubs} return an {Expectation} which can be further modified by methods on {Expectation}.
11
10
  module ObjectMethods
12
-
13
11
  # @private
14
12
  alias_method :_method, :method
15
13
 
16
14
  # @private
17
- def mocha
18
- @mocha ||= Mocha::Mockery.instance.mock_impersonating(self)
15
+ def mocha(instantiate = true)
16
+ if instantiate
17
+ @mocha ||= Mocha::Mockery.instance.mock_impersonating(self)
18
+ else
19
+ defined?(@mocha) ? @mocha : nil
20
+ end
19
21
  end
20
22
 
21
23
  # @private
@@ -33,17 +35,22 @@ module Mocha
33
35
  self
34
36
  end
35
37
 
38
+ # @private
39
+ def stubba_class
40
+ singleton_class
41
+ end
42
+
36
43
  # Adds an expectation that the specified method must be called exactly once with any parameters.
37
44
  #
38
45
  # The original implementation of the method is replaced during the test and then restored at the end of the test. The temporary replacement method has the same visibility as the original method.
39
46
  #
40
- # @param [Symbol,String] method_name name of expected method
41
- # @param [Hash] expected_methods_vs_return_values expected method name symbols as keys and corresponding return values as values - these expectations are setup as if {#expects} were called multiple times.
47
+ # @return [Expectation] last-built expectation which can be further modified by methods on {Expectation}.
48
+ # @raise [StubbingError] if attempting to stub method which is not allowed.
42
49
  #
43
50
  # @overload def expects(method_name)
51
+ # @param [Symbol,String] method_name name of expected method
44
52
  # @overload def expects(expected_methods_vs_return_values)
45
- # @return [Expectation] last-built expectation which can be further modified by methods on {Expectation}.
46
- # @raise [StubbingError] if attempting to stub method which is not allowed.
53
+ # @param [Hash] expected_methods_vs_return_values expected method name symbols as keys and corresponding return values as values - these expectations are setup as if {#expects} were called multiple times.
47
54
  #
48
55
  # @example Setting up an expectation on a non-mock object.
49
56
  # product = Product.new
@@ -71,14 +78,14 @@ module Mocha
71
78
  expectation = nil
72
79
  mockery = Mocha::Mockery.instance
73
80
  iterator = ArgumentIterator.new(expected_methods_vs_return_values)
74
- iterator.each { |*args|
81
+ iterator.each do |*args|
75
82
  method_name = args.shift
76
83
  mockery.on_stubbing(self, method_name)
77
84
  method = stubba_method.new(stubba_object, method_name)
78
85
  mockery.stubba.stub(method)
79
86
  expectation = mocha.expects(method_name, caller)
80
- expectation.returns(args.shift) if args.length > 0
81
- }
87
+ expectation.returns(args.shift) unless args.empty?
88
+ end
82
89
  expectation
83
90
  end
84
91
 
@@ -86,13 +93,13 @@ module Mocha
86
93
  #
87
94
  # The original implementation of the method is replaced during the test and then restored at the end of the test. The temporary replacement method has the same visibility as the original method.
88
95
  #
89
- # @param [Symbol,String] method_name name of stubbed method
90
- # @param [Hash] stubbed_methods_vs_return_values stubbed method name symbols as keys and corresponding return values as values - these stubbed methods are setup as if {#stubs} were called multiple times.
96
+ # @return [Expectation] last-built expectation which can be further modified by methods on {Expectation}.
97
+ # @raise [StubbingError] if attempting to stub method which is not allowed.
91
98
  #
92
99
  # @overload def stubs(method_name)
100
+ # @param [Symbol,String] method_name name of stubbed method
93
101
  # @overload def stubs(stubbed_methods_vs_return_values)
94
- # @return [Expectation] last-built expectation which can be further modified by methods on {Expectation}.
95
- # @raise [StubbingError] if attempting to stub method which is not allowed.
102
+ # @param [Hash] stubbed_methods_vs_return_values stubbed method name symbols as keys and corresponding return values as values - these stubbed methods are setup as if {#stubs} were called multiple times.
96
103
  #
97
104
  # @example Setting up a stubbed methods on a non-mock object.
98
105
  # product = Product.new
@@ -117,14 +124,14 @@ module Mocha
117
124
  expectation = nil
118
125
  mockery = Mocha::Mockery.instance
119
126
  iterator = ArgumentIterator.new(stubbed_methods_vs_return_values)
120
- iterator.each { |*args|
127
+ iterator.each do |*args|
121
128
  method_name = args.shift
122
129
  mockery.on_stubbing(self, method_name)
123
130
  method = stubba_method.new(stubba_object, method_name)
124
131
  mockery.stubba.stub(method)
125
132
  expectation = mocha.stubs(method_name, caller)
126
- expectation.returns(args.shift) if args.length > 0
127
- }
133
+ expectation.returns(args.shift) unless args.empty?
134
+ end
128
135
  expectation
129
136
  end
130
137
 
@@ -158,18 +165,5 @@ module Mocha
158
165
  mockery.stubba.unstub(method)
159
166
  end
160
167
  end
161
-
162
- # @private
163
- def method_exists?(method, include_public_methods = true)
164
- if include_public_methods
165
- return true if public_methods(include_superclass_methods = true).include?(method)
166
- return true if respond_to?(method.to_sym)
167
- end
168
- return true if protected_methods(include_superclass_methods = true).include?(method)
169
- return true if private_methods(include_superclass_methods = true).include?(method)
170
- return false
171
- end
172
-
173
168
  end
174
-
175
169
  end
@@ -1,11 +1,9 @@
1
1
  module Mocha
2
-
3
2
  # Used as parameters for {Expectation#with} to restrict the parameter values which will match the expectation. Can be nested.
4
3
  module ParameterMatchers; end
5
-
6
4
  end
7
5
 
8
- require 'mocha/parameter_matchers/object'
6
+ require 'mocha/parameter_matchers/instance_methods'
9
7
 
10
8
  require 'mocha/parameter_matchers/all_of'
11
9
  require 'mocha/parameter_matchers/any_of'
@@ -1,12 +1,10 @@
1
1
  require 'mocha/parameter_matchers/base'
2
2
 
3
3
  module Mocha
4
-
5
4
  module ParameterMatchers
6
-
7
5
  # Matches if all +matchers+ match.
8
6
  #
9
- # @param [*Array<Base>] parameter_matchers parameter matchers.
7
+ # @param [*Array<Base>] matchers parameter matchers.
10
8
  # @return [AllOf] parameter matcher.
11
9
  #
12
10
  # @see Expectation#with
@@ -28,7 +26,6 @@ module Mocha
28
26
 
29
27
  # Parameter matcher which combines a number of other matchers using a logical AND.
30
28
  class AllOf < Base
31
-
32
29
  # @private
33
30
  def initialize(*matchers)
34
31
  @matchers = matchers
@@ -42,11 +39,8 @@ module Mocha
42
39
 
43
40
  # @private
44
41
  def mocha_inspect
45
- "all_of(#{@matchers.map { |matcher| matcher.mocha_inspect }.join(", ") })"
42
+ "all_of(#{@matchers.map(&:mocha_inspect).join(', ')})"
46
43
  end
47
-
48
44
  end
49
-
50
45
  end
51
-
52
46
  end