mocha 1.2.1 → 1.16.1

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 (265) hide show
  1. checksums.yaml +5 -5
  2. data/.github/FUNDING.yml +1 -0
  3. data/.rubocop.yml +61 -0
  4. data/.rubocop_todo.yml +27 -0
  5. data/.yardopts +1 -0
  6. data/CONTRIBUTING.md +4 -9
  7. data/Gemfile +29 -0
  8. data/README.md +104 -106
  9. data/RELEASE.md +277 -1
  10. data/Rakefile +46 -44
  11. data/gemfiles/Gemfile.minitest.latest +1 -0
  12. data/gemfiles/Gemfile.test-unit.latest +2 -5
  13. data/init.rb +1 -3
  14. data/lib/mocha/any_instance_method.rb +9 -62
  15. data/lib/mocha/api.rb +144 -68
  16. data/lib/mocha/argument_iterator.rb +4 -8
  17. data/lib/mocha/backtrace_filter.rb +1 -5
  18. data/lib/mocha/block_matcher.rb +31 -0
  19. data/lib/mocha/cardinality.rb +60 -49
  20. data/lib/mocha/central.rb +21 -12
  21. data/lib/mocha/change_state_side_effect.rb +0 -4
  22. data/lib/mocha/class_methods.rb +19 -21
  23. data/lib/mocha/configuration.rb +372 -18
  24. data/lib/mocha/debug.rb +3 -2
  25. data/lib/mocha/deprecation.rb +8 -11
  26. data/lib/mocha/detection/mini_test.rb +0 -2
  27. data/lib/mocha/detection/test_unit.rb +3 -5
  28. data/lib/mocha/error_with_filtered_backtrace.rb +13 -0
  29. data/lib/mocha/exception_raiser.rb +4 -6
  30. data/lib/mocha/expectation.rb +125 -89
  31. data/lib/mocha/expectation_error.rb +1 -1
  32. data/lib/mocha/expectation_error_factory.rb +0 -1
  33. data/lib/mocha/expectation_list.rb +7 -11
  34. data/lib/mocha/hooks.rb +1 -3
  35. data/lib/mocha/in_state_ordering_constraint.rb +0 -4
  36. data/lib/mocha/inspect.rb +30 -38
  37. data/lib/mocha/instance_method.rb +11 -8
  38. data/lib/mocha/integration/mini_test/adapter.rb +2 -4
  39. data/lib/mocha/integration/mini_test/exception_translation.rb +1 -1
  40. data/lib/mocha/integration/mini_test/nothing.rb +4 -4
  41. data/lib/mocha/integration/mini_test/version_13.rb +4 -1
  42. data/lib/mocha/integration/mini_test/version_140.rb +4 -1
  43. data/lib/mocha/integration/mini_test/version_141.rb +4 -1
  44. data/lib/mocha/integration/mini_test/version_142_to_172.rb +4 -1
  45. data/lib/mocha/integration/mini_test/version_200.rb +4 -1
  46. data/lib/mocha/integration/mini_test/version_201_to_222.rb +4 -1
  47. data/lib/mocha/integration/mini_test/version_2110_to_2111.rb +4 -1
  48. data/lib/mocha/integration/mini_test/version_2112_to_320.rb +4 -1
  49. data/lib/mocha/integration/mini_test/version_230_to_2101.rb +4 -1
  50. data/lib/mocha/integration/mini_test.rb +7 -0
  51. data/lib/mocha/integration/monkey_patcher.rb +5 -7
  52. data/lib/mocha/integration/test_unit/adapter.rb +5 -6
  53. data/lib/mocha/integration/test_unit/gem_version_200.rb +5 -2
  54. data/lib/mocha/integration/test_unit/gem_version_201_to_202.rb +5 -2
  55. data/lib/mocha/integration/test_unit/gem_version_203_to_220.rb +5 -2
  56. data/lib/mocha/integration/test_unit/gem_version_230_to_250.rb +5 -2
  57. data/lib/mocha/integration/test_unit/nothing.rb +4 -4
  58. data/lib/mocha/integration/test_unit/ruby_version_186_and_above.rb +4 -1
  59. data/lib/mocha/integration/test_unit.rb +7 -2
  60. data/lib/mocha/integration.rb +2 -5
  61. data/lib/mocha/invocation.rb +86 -0
  62. data/lib/mocha/is_a.rb +0 -2
  63. data/lib/mocha/logger.rb +0 -4
  64. data/lib/mocha/macos_version.rb +5 -0
  65. data/lib/mocha/method_matcher.rb +1 -5
  66. data/lib/mocha/minitest.rb +9 -0
  67. data/lib/mocha/mock.rb +102 -58
  68. data/lib/mocha/mockery.rb +70 -99
  69. data/lib/mocha/names.rb +2 -12
  70. data/lib/mocha/not_initialized_error.rb +7 -0
  71. data/lib/mocha/object_methods.rb +25 -31
  72. data/lib/mocha/parameter_matchers/all_of.rb +2 -8
  73. data/lib/mocha/parameter_matchers/any_of.rb +2 -8
  74. data/lib/mocha/parameter_matchers/any_parameters.rb +3 -9
  75. data/lib/mocha/parameter_matchers/anything.rb +2 -8
  76. data/lib/mocha/parameter_matchers/base.rb +6 -12
  77. data/lib/mocha/parameter_matchers/equals.rb +0 -6
  78. data/lib/mocha/parameter_matchers/{query_string.rb → equivalent_uri.rb} +15 -15
  79. data/lib/mocha/parameter_matchers/has_entries.rb +2 -7
  80. data/lib/mocha/parameter_matchers/has_entry.rb +26 -21
  81. data/lib/mocha/parameter_matchers/has_key.rb +2 -7
  82. data/lib/mocha/parameter_matchers/has_keys.rb +53 -0
  83. data/lib/mocha/parameter_matchers/has_value.rb +2 -7
  84. data/lib/mocha/parameter_matchers/includes.rb +6 -7
  85. data/lib/mocha/parameter_matchers/instance_methods.rb +18 -0
  86. data/lib/mocha/parameter_matchers/instance_of.rb +0 -6
  87. data/lib/mocha/parameter_matchers/is_a.rb +2 -7
  88. data/lib/mocha/parameter_matchers/kind_of.rb +2 -6
  89. data/lib/mocha/parameter_matchers/not.rb +2 -7
  90. data/lib/mocha/parameter_matchers/optionally.rb +4 -10
  91. data/lib/mocha/parameter_matchers/regexp_matches.rb +0 -6
  92. data/lib/mocha/parameter_matchers/responds_with.rb +3 -8
  93. data/lib/mocha/parameter_matchers/yaml_equivalent.rb +2 -6
  94. data/lib/mocha/parameter_matchers.rb +3 -4
  95. data/lib/mocha/parameters_matcher.rb +6 -9
  96. data/lib/mocha/raised_exception.rb +11 -0
  97. data/lib/mocha/receivers.rb +10 -14
  98. data/lib/mocha/return_values.rb +4 -8
  99. data/lib/mocha/ruby_version.rb +8 -1
  100. data/lib/mocha/sequence.rb +4 -9
  101. data/lib/mocha/setup.rb +5 -0
  102. data/lib/mocha/single_return_value.rb +2 -5
  103. data/lib/mocha/state_machine.rb +33 -46
  104. data/lib/mocha/stubbed_method.rb +124 -0
  105. data/lib/mocha/stubbing_error.rb +2 -13
  106. data/lib/mocha/test_unit.rb +8 -2
  107. data/lib/mocha/thrower.rb +4 -6
  108. data/lib/mocha/thrown_object.rb +12 -0
  109. data/lib/mocha/version.rb +1 -1
  110. data/lib/mocha/yield_parameters.rb +7 -17
  111. data/mocha.gemspec +14 -65
  112. data/yard-templates/default/layout/html/google_analytics.erb +6 -9
  113. data/yard-templates/default/layout/html/setup.rb +2 -3
  114. metadata +25 -247
  115. data/bin/build-matrix +0 -70
  116. data/gemfiles/Gemfile.minitest.1.3.0 +0 -7
  117. data/gemfiles/Gemfile.minitest.1.4.0 +0 -7
  118. data/gemfiles/Gemfile.minitest.1.4.1 +0 -7
  119. data/gemfiles/Gemfile.minitest.1.4.2 +0 -7
  120. data/gemfiles/Gemfile.minitest.2.0.0 +0 -7
  121. data/gemfiles/Gemfile.minitest.2.0.1 +0 -7
  122. data/gemfiles/Gemfile.minitest.2.11.0 +0 -7
  123. data/gemfiles/Gemfile.minitest.2.11.2 +0 -7
  124. data/gemfiles/Gemfile.minitest.2.3.0 +0 -7
  125. data/gemfiles/Gemfile.test-unit.2.0.0 +0 -7
  126. data/gemfiles/Gemfile.test-unit.2.0.1 +0 -7
  127. data/gemfiles/Gemfile.test-unit.2.0.3 +0 -7
  128. data/lib/mocha/class_method.rb +0 -119
  129. data/lib/mocha/integration/test_unit/ruby_version_185_and_below.rb +0 -58
  130. data/lib/mocha/mini_test.rb +0 -3
  131. data/lib/mocha/module_method.rb +0 -16
  132. data/lib/mocha/module_methods.rb +0 -14
  133. data/lib/mocha/multiple_yields.rb +0 -20
  134. data/lib/mocha/no_yields.rb +0 -11
  135. data/lib/mocha/parameter_matchers/object.rb +0 -17
  136. data/lib/mocha/pretty_parameters.rb +0 -28
  137. data/lib/mocha/single_yield.rb +0 -18
  138. data/lib/mocha/standalone.rb +0 -4
  139. data/lib/mocha/unexpected_invocation.rb +0 -26
  140. data/lib/mocha_standalone.rb +0 -4
  141. data/test/acceptance/acceptance_test_helper.rb +0 -41
  142. data/test/acceptance/bug_18914_test.rb +0 -43
  143. data/test/acceptance/bug_21465_test.rb +0 -34
  144. data/test/acceptance/bug_21563_test.rb +0 -25
  145. data/test/acceptance/exception_rescue_test.rb +0 -55
  146. data/test/acceptance/expectations_on_multiple_methods_test.rb +0 -55
  147. data/test/acceptance/expected_invocation_count_test.rb +0 -232
  148. data/test/acceptance/failure_messages_test.rb +0 -64
  149. data/test/acceptance/issue_272_test.rb +0 -52
  150. data/test/acceptance/issue_65_test.rb +0 -63
  151. data/test/acceptance/issue_70_test.rb +0 -55
  152. data/test/acceptance/mocha_example_test.rb +0 -98
  153. data/test/acceptance/mocha_test_result_test.rb +0 -84
  154. data/test/acceptance/mock_test.rb +0 -100
  155. data/test/acceptance/mock_with_initializer_block_test.rb +0 -51
  156. data/test/acceptance/mocked_methods_dispatch_test.rb +0 -78
  157. data/test/acceptance/multiple_expectations_failure_message_test.rb +0 -68
  158. data/test/acceptance/optional_parameters_test.rb +0 -70
  159. data/test/acceptance/parameter_matcher_test.rb +0 -337
  160. data/test/acceptance/partial_mocks_test.rb +0 -47
  161. data/test/acceptance/prepend_test.rb +0 -89
  162. data/test/acceptance/raise_exception_test.rb +0 -39
  163. data/test/acceptance/return_value_test.rb +0 -52
  164. data/test/acceptance/sequence_test.rb +0 -192
  165. data/test/acceptance/states_test.rb +0 -70
  166. data/test/acceptance/stub_any_instance_method_defined_on_superclass_test.rb +0 -34
  167. data/test/acceptance/stub_any_instance_method_test.rb +0 -280
  168. data/test/acceptance/stub_class_method_defined_on_active_record_association_proxy_test.rb +0 -106
  169. data/test/acceptance/stub_class_method_defined_on_class_test.rb +0 -78
  170. data/test/acceptance/stub_class_method_defined_on_module_test.rb +0 -75
  171. data/test/acceptance/stub_class_method_defined_on_superclass_test.rb +0 -112
  172. data/test/acceptance/stub_everything_test.rb +0 -56
  173. data/test/acceptance/stub_instance_method_defined_on_active_record_association_proxy_test.rb +0 -93
  174. data/test/acceptance/stub_instance_method_defined_on_class_and_aliased_test.rb +0 -69
  175. data/test/acceptance/stub_instance_method_defined_on_class_test.rb +0 -69
  176. data/test/acceptance/stub_instance_method_defined_on_kernel_module_test.rb +0 -75
  177. data/test/acceptance/stub_instance_method_defined_on_module_test.rb +0 -78
  178. data/test/acceptance/stub_instance_method_defined_on_object_class_test.rb +0 -75
  179. data/test/acceptance/stub_instance_method_defined_on_singleton_class_test.rb +0 -70
  180. data/test/acceptance/stub_instance_method_defined_on_superclass_test.rb +0 -72
  181. data/test/acceptance/stub_method_defined_on_module_and_aliased_test.rb +0 -39
  182. data/test/acceptance/stub_module_method_test.rb +0 -163
  183. data/test/acceptance/stub_test.rb +0 -52
  184. data/test/acceptance/stubba_example_test.rb +0 -102
  185. data/test/acceptance/stubba_test_result_test.rb +0 -66
  186. data/test/acceptance/stubbing_error_backtrace_test.rb +0 -64
  187. data/test/acceptance/stubbing_frozen_object_test.rb +0 -88
  188. data/test/acceptance/stubbing_method_accepting_block_parameter_test.rb +0 -48
  189. data/test/acceptance/stubbing_method_unnecessarily_test.rb +0 -65
  190. data/test/acceptance/stubbing_nil_test.rb +0 -61
  191. data/test/acceptance/stubbing_non_existent_any_instance_method_test.rb +0 -143
  192. data/test/acceptance/stubbing_non_existent_class_method_test.rb +0 -157
  193. data/test/acceptance/stubbing_non_existent_instance_method_test.rb +0 -147
  194. data/test/acceptance/stubbing_non_public_any_instance_method_test.rb +0 -130
  195. data/test/acceptance/stubbing_non_public_class_method_test.rb +0 -163
  196. data/test/acceptance/stubbing_non_public_instance_method_test.rb +0 -143
  197. data/test/acceptance/stubbing_on_non_mock_object_test.rb +0 -64
  198. data/test/acceptance/stubbing_same_class_method_on_parent_and_child_classes_test.rb +0 -35
  199. data/test/acceptance/throw_test.rb +0 -45
  200. data/test/acceptance/unexpected_invocation_test.rb +0 -25
  201. data/test/acceptance/unstubbing_test.rb +0 -168
  202. data/test/assertions.rb +0 -8
  203. data/test/deprecation_disabler.rb +0 -15
  204. data/test/execution_point.rb +0 -36
  205. data/test/integration/mini_test_test.rb +0 -8
  206. data/test/integration/shared_tests.rb +0 -174
  207. data/test/integration/test_unit_test.rb +0 -8
  208. data/test/method_definer.rb +0 -24
  209. data/test/mini_test_result.rb +0 -90
  210. data/test/minitest_result.rb +0 -49
  211. data/test/simple_counter.rb +0 -13
  212. data/test/test_helper.rb +0 -50
  213. data/test/test_runner.rb +0 -58
  214. data/test/test_unit_result.rb +0 -20
  215. data/test/unit/any_instance_method_test.rb +0 -134
  216. data/test/unit/array_inspect_test.rb +0 -16
  217. data/test/unit/backtrace_filter_test.rb +0 -19
  218. data/test/unit/cardinality_test.rb +0 -56
  219. data/test/unit/central_test.rb +0 -100
  220. data/test/unit/change_state_side_effect_test.rb +0 -41
  221. data/test/unit/class_method_test.rb +0 -225
  222. data/test/unit/class_methods_test.rb +0 -40
  223. data/test/unit/configuration_test.rb +0 -38
  224. data/test/unit/date_time_inspect_test.rb +0 -21
  225. data/test/unit/exception_raiser_test.rb +0 -42
  226. data/test/unit/expectation_list_test.rb +0 -82
  227. data/test/unit/expectation_test.rb +0 -497
  228. data/test/unit/hash_inspect_test.rb +0 -16
  229. data/test/unit/hooks_test.rb +0 -29
  230. data/test/unit/in_state_ordering_constraint_test.rb +0 -43
  231. data/test/unit/method_matcher_test.rb +0 -28
  232. data/test/unit/mock_test.rb +0 -342
  233. data/test/unit/mockery_test.rb +0 -151
  234. data/test/unit/module_methods_test.rb +0 -19
  235. data/test/unit/multiple_yields_test.rb +0 -18
  236. data/test/unit/no_yields_test.rb +0 -18
  237. data/test/unit/object_inspect_test.rb +0 -39
  238. data/test/unit/object_methods_test.rb +0 -46
  239. data/test/unit/parameter_matchers/all_of_test.rb +0 -26
  240. data/test/unit/parameter_matchers/any_of_test.rb +0 -26
  241. data/test/unit/parameter_matchers/anything_test.rb +0 -21
  242. data/test/unit/parameter_matchers/equals_test.rb +0 -25
  243. data/test/unit/parameter_matchers/has_entries_test.rb +0 -51
  244. data/test/unit/parameter_matchers/has_entry_test.rb +0 -129
  245. data/test/unit/parameter_matchers/has_key_test.rb +0 -55
  246. data/test/unit/parameter_matchers/has_value_test.rb +0 -57
  247. data/test/unit/parameter_matchers/includes_test.rb +0 -102
  248. data/test/unit/parameter_matchers/instance_of_test.rb +0 -25
  249. data/test/unit/parameter_matchers/is_a_test.rb +0 -25
  250. data/test/unit/parameter_matchers/kind_of_test.rb +0 -25
  251. data/test/unit/parameter_matchers/not_test.rb +0 -26
  252. data/test/unit/parameter_matchers/regexp_matches_test.rb +0 -46
  253. data/test/unit/parameter_matchers/responds_with_test.rb +0 -32
  254. data/test/unit/parameter_matchers/stub_matcher.rb +0 -27
  255. data/test/unit/parameter_matchers/yaml_equivalent_test.rb +0 -25
  256. data/test/unit/parameters_matcher_test.rb +0 -121
  257. data/test/unit/receivers_test.rb +0 -66
  258. data/test/unit/return_values_test.rb +0 -63
  259. data/test/unit/sequence_test.rb +0 -104
  260. data/test/unit/single_return_value_test.rb +0 -14
  261. data/test/unit/single_yield_test.rb +0 -18
  262. data/test/unit/state_machine_test.rb +0 -98
  263. data/test/unit/string_inspect_test.rb +0 -11
  264. data/test/unit/thrower_test.rb +0 -20
  265. data/test/unit/yield_parameters_test.rb +0 -93
data/lib/mocha/mockery.rb CHANGED
@@ -1,4 +1,3 @@
1
- require 'mocha/ruby_version'
2
1
  require 'mocha/central'
3
2
  require 'mocha/mock'
4
3
  require 'mocha/names'
@@ -7,16 +6,42 @@ require 'mocha/state_machine'
7
6
  require 'mocha/logger'
8
7
  require 'mocha/configuration'
9
8
  require 'mocha/stubbing_error'
9
+ require 'mocha/not_initialized_error'
10
10
  require 'mocha/expectation_error_factory'
11
11
 
12
12
  module Mocha
13
-
14
13
  class Mockery
14
+ class Null < self
15
+ def add_mock(*)
16
+ raise_not_initialized_error
17
+ end
15
18
 
16
- class << self
19
+ def add_state_machine(*)
20
+ raise_not_initialized_error
21
+ end
22
+
23
+ def stubba
24
+ Central::Null.new(&method(:raise_not_initialized_error))
25
+ end
17
26
 
27
+ private
28
+
29
+ def raise_not_initialized_error
30
+ message = 'Mocha methods cannot be used outside the context of a test'
31
+ raise NotInitializedError.new(message, caller)
32
+ end
33
+ end
34
+
35
+ class << self
18
36
  def instance
19
- @instance ||= new
37
+ @instances.last || Null.new
38
+ end
39
+
40
+ def setup
41
+ @instances ||= []
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,28 +50,25 @@ module Mocha
25
50
 
26
51
  def teardown
27
52
  instance.teardown
53
+ ensure
54
+ @instances.pop
28
55
  end
29
-
30
- def reset_instance
31
- @instance = nil
32
- end
33
-
34
56
  end
35
57
 
36
- def named_mock(name, &block)
37
- add_mock(Mock.new(self, Name.new(name), &block))
58
+ def named_mock(name)
59
+ add_mock(Mock.new(self, Name.new(name)))
38
60
  end
39
61
 
40
- def unnamed_mock(&block)
41
- add_mock(Mock.new(self, &block))
62
+ def unnamed_mock
63
+ add_mock(Mock.new(self))
42
64
  end
43
65
 
44
- def mock_impersonating(object, &block)
45
- add_mock(Mock.new(self, ImpersonatingName.new(object), ObjectReceiver.new(object), &block))
66
+ def mock_impersonating(object)
67
+ add_mock(Mock.new(self, ImpersonatingName.new(object), ObjectReceiver.new(object)))
46
68
  end
47
69
 
48
- def mock_impersonating_any_instance_of(klass, &block)
49
- add_mock(Mock.new(self, ImpersonatingAnyInstanceName.new(klass), AnyInstanceReceiver.new(klass), &block))
70
+ def mock_impersonating_any_instance_of(klass)
71
+ add_mock(Mock.new(self, ImpersonatingAnyInstanceName.new(klass), AnyInstanceReceiver.new(klass)))
50
72
  end
51
73
 
52
74
  def new_state_machine(name)
@@ -56,24 +78,22 @@ module Mocha
56
78
  def verify(assertion_counter = nil)
57
79
  unless mocks.all? { |mock| mock.__verified__?(assertion_counter) }
58
80
  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
81
+ backtrace = if unsatisfied_expectations.empty?
82
+ caller
83
+ else
84
+ unsatisfied_expectations[0].backtrace
85
+ end
64
86
  raise ExpectationErrorFactory.build(message, backtrace)
65
87
  end
66
- expectations.each do |e|
67
- unless Mocha::Configuration.allow?(:stubbing_method_unnecessarily)
68
- unless e.used?
69
- on_stubbing_method_unnecessarily(e)
70
- end
71
- end
88
+ expectations.reject(&:used?).each do |expectation|
89
+ signature_proc = lambda { expectation.method_signature }
90
+ check(:stubbing_method_unnecessarily, 'method unnecessarily', signature_proc, expectation.backtrace)
72
91
  end
73
92
  end
74
93
 
75
94
  def teardown
76
95
  stubba.unstub_all
96
+ mocks.each(&:__expire__)
77
97
  reset
78
98
  end
79
99
 
@@ -90,78 +110,23 @@ module Mocha
90
110
  end
91
111
 
92
112
  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?
113
+ message = ''
114
+ message << "unsatisfied expectations:\n- #{unsatisfied_expectations.map(&:mocha_inspect).join("\n- ")}\n" if unsatisfied_expectations.any?
115
+ message << "satisfied expectations:\n- #{satisfied_expectations.map(&:mocha_inspect).join("\n- ")}\n" if satisfied_expectations.any?
116
+ message << "states:\n- #{state_machines.map(&:mocha_inspect).join("\n- ")}\n" if state_machines.any?
97
117
  message
98
118
  end
99
119
 
100
120
  def on_stubbing(object, method)
101
- method = PRE_RUBY_V19 ? method.to_s : method.to_sym
102
- unless Mocha::Configuration.allow?(:stubbing_non_existent_method)
103
- unless object.method_exists?(method, include_public_methods = true)
104
- on_stubbing_non_existent_method(object, method)
105
- end
106
- end
107
- unless Mocha::Configuration.allow?(:stubbing_non_public_method)
108
- if object.method_exists?(method, include_public_methods = false)
109
- on_stubbing_non_public_method(object, method)
110
- end
111
- end
112
- unless Mocha::Configuration.allow?(:stubbing_method_on_nil)
113
- if object.nil?
114
- on_stubbing_method_on_nil(object, method)
115
- end
116
- end
117
- unless Mocha::Configuration.allow?(:stubbing_method_on_non_mock_object)
118
- on_stubbing_method_on_non_mock_object(object, method)
119
- end
120
- end
121
-
122
- def on_stubbing_non_existent_method(object, method)
123
- if Mocha::Configuration.prevent?(:stubbing_non_existent_method)
124
- raise StubbingError.new("stubbing non-existent method: #{object.mocha_inspect}.#{method}", caller)
121
+ signature_proc = lambda { "#{object.mocha_inspect}.#{method}" }
122
+ check(:stubbing_non_existent_method, 'non-existent method', signature_proc) do
123
+ !(object.stubba_class.__method_exists__?(method, true) || object.respond_to?(method))
125
124
  end
126
- if Mocha::Configuration.warn_when?(:stubbing_non_existent_method)
127
- logger.warn "stubbing non-existent method: #{object.mocha_inspect}.#{method}"
128
- end
129
- end
130
-
131
- def on_stubbing_non_public_method(object, method)
132
- if Mocha::Configuration.prevent?(:stubbing_non_public_method)
133
- raise StubbingError.new("stubbing non-public method: #{object.mocha_inspect}.#{method}", caller)
134
- end
135
- if Mocha::Configuration.warn_when?(:stubbing_non_public_method)
136
- logger.warn "stubbing non-public method: #{object.mocha_inspect}.#{method}"
137
- end
138
- end
139
-
140
- def on_stubbing_method_on_nil(object, method)
141
- if Mocha::Configuration.prevent?(:stubbing_method_on_nil)
142
- raise StubbingError.new("stubbing method on nil: #{object.mocha_inspect}.#{method}", caller)
143
- end
144
- if Mocha::Configuration.warn_when?(:stubbing_method_on_nil)
145
- logger.warn "stubbing method on nil: #{object.mocha_inspect}.#{method}"
146
- end
147
- end
148
-
149
- def on_stubbing_method_on_non_mock_object(object, method)
150
- if Mocha::Configuration.prevent?(:stubbing_method_on_non_mock_object)
151
- raise StubbingError.new("stubbing method on non-mock object: #{object.mocha_inspect}.#{method}", caller)
152
- 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
156
- end
157
-
158
- def on_stubbing_method_unnecessarily(expectation)
159
- if Mocha::Configuration.prevent?(:stubbing_method_unnecessarily)
160
- raise StubbingError.new("stubbing method unnecessarily: #{expectation.method_signature}", expectation.backtrace)
161
- end
162
- if Mocha::Configuration.warn_when?(:stubbing_method_unnecessarily)
163
- logger.warn "stubbing method unnecessarily: #{expectation.method_signature}"
125
+ check(:stubbing_non_public_method, 'non-public method', signature_proc) do
126
+ object.stubba_class.__method_exists__?(method, false)
164
127
  end
128
+ check(:stubbing_method_on_nil, 'method on nil', signature_proc) { object.nil? }
129
+ check(:stubbing_method_on_non_mock_object, 'method on non-mock object', signature_proc)
165
130
  end
166
131
 
167
132
  attr_writer :logger
@@ -170,19 +135,27 @@ module Mocha
170
135
  @logger ||= Logger.new($stderr)
171
136
  end
172
137
 
173
-
174
138
  private
175
139
 
140
+ def check(action, description, signature_proc, backtrace = caller)
141
+ treatment = Mocha.configuration.send(action)
142
+ return if (treatment == :allow) || (block_given? && !yield)
143
+ method_signature = signature_proc.call
144
+ message = "stubbing #{description}: #{method_signature}"
145
+ raise StubbingError.new(message, backtrace) if treatment == :prevent
146
+ logger.warn(message) if treatment == :warn
147
+ end
148
+
176
149
  def expectations
177
150
  mocks.map { |mock| mock.__expectations__.to_a }.flatten
178
151
  end
179
152
 
180
153
  def unsatisfied_expectations
181
- expectations.reject { |e| e.verified? }
154
+ expectations.reject(&:verified?)
182
155
  end
183
156
 
184
157
  def satisfied_expectations
185
- expectations.select { |e| e.verified? }
158
+ expectations.select(&:verified?)
186
159
  end
187
160
 
188
161
  def add_mock(mock)
@@ -200,7 +173,5 @@ module Mocha
200
173
  @mocks = nil
201
174
  @state_machines = nil
202
175
  end
203
-
204
176
  end
205
-
206
177
  end
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,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
@@ -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
@@ -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,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
@@ -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 any +matchers+ match.
8
6
  #
9
- # @param [*Array<Base>] parameter_matchers parameter matchers.
7
+ # @param [*Array<Base>] matchers parameter matchers.
10
8
  # @return [AnyOf] parameter matcher.
11
9
  #
12
10
  # @see Expectation#with
@@ -34,7 +32,6 @@ module Mocha
34
32
 
35
33
  # Parameter matcher which combines a number of other matchers using a logical OR.
36
34
  class AnyOf < Base
37
-
38
35
  # @private
39
36
  def initialize(*matchers)
40
37
  @matchers = matchers
@@ -48,11 +45,8 @@ module Mocha
48
45
 
49
46
  # @private
50
47
  def mocha_inspect
51
- "any_of(#{@matchers.map { |matcher| matcher.mocha_inspect }.join(", ") })"
48
+ "any_of(#{@matchers.map(&:mocha_inspect).join(', ')})"
52
49
  end
53
-
54
50
  end
55
-
56
51
  end
57
-
58
52
  end
@@ -1,9 +1,7 @@
1
1
  require 'mocha/parameter_matchers/base'
2
2
 
3
3
  module Mocha
4
-
5
4
  module ParameterMatchers
6
-
7
5
  # Matches any parameters. This is used as the default for a newly built expectation.
8
6
  #
9
7
  # @return [AnyParameters] parameter matcher.
@@ -26,22 +24,18 @@ module Mocha
26
24
 
27
25
  # Parameter matcher which always matches whatever the parameters.
28
26
  class AnyParameters < Base
29
-
30
27
  # @private
31
28
  def matches?(available_parameters)
32
- while available_parameters.length > 0 do
29
+ until available_parameters.empty?
33
30
  available_parameters.shift
34
31
  end
35
- return true
32
+ true
36
33
  end
37
34
 
38
35
  # @private
39
36
  def mocha_inspect
40
- "any_parameters"
37
+ 'any_parameters'
41
38
  end
42
-
43
39
  end
44
-
45
40
  end
46
-
47
41
  end
@@ -1,9 +1,7 @@
1
1
  require 'mocha/parameter_matchers/base'
2
2
 
3
3
  module Mocha
4
-
5
4
  module ParameterMatchers
6
-
7
5
  # Matches any object.
8
6
  #
9
7
  # @return [Anything] parameter matcher.
@@ -23,20 +21,16 @@ module Mocha
23
21
 
24
22
  # Parameter matcher which always matches a single parameter.
25
23
  class Anything < Base
26
-
27
24
  # @private
28
25
  def matches?(available_parameters)
29
26
  available_parameters.shift
30
- return true
27
+ true
31
28
  end
32
29
 
33
30
  # @private
34
31
  def mocha_inspect
35
- "anything"
32
+ 'anything'
36
33
  end
37
-
38
34
  end
39
-
40
35
  end
41
-
42
36
  end
@@ -1,10 +1,7 @@
1
1
  module Mocha
2
-
3
2
  module ParameterMatchers
4
-
5
3
  # @abstract Subclass and implement +#matches?+ and +#mocha_inspect+ to define a custom matcher. Also add a suitably named instance method to {ParameterMatchers} to build an instance of the new matcher c.f. {#equals}.
6
4
  class Base
7
-
8
5
  # @private
9
6
  def to_matcher
10
7
  self
@@ -16,7 +13,7 @@ module Mocha
16
13
  #
17
14
  # This shorthand will not work with an implicit equals match. Instead, an explicit {Equals} matcher should be used.
18
15
  #
19
- # @param [Base] matcher parameter matcher.
16
+ # @param [Base] other parameter matcher.
20
17
  # @return [AllOf] parameter matcher.
21
18
  #
22
19
  # @see Expectation#with
@@ -30,8 +27,8 @@ module Mocha
30
27
  #
31
28
  # object.expects(:run).with(has_key(:foo) & has_key(:bar))
32
29
  # object.run(:foo => 'foovalue', :bar => 'barvalue)
33
- def &(matcher)
34
- AllOf.new(self, matcher)
30
+ def &(other)
31
+ AllOf.new(self, other)
35
32
  end
36
33
 
37
34
  # A shorthand way of combining two matchers when at least one must match.
@@ -40,7 +37,7 @@ module Mocha
40
37
  #
41
38
  # This shorthand will not work with an implicit equals match. Instead, an explicit {Equals} matcher should be used.
42
39
  #
43
- # @param [Base] matcher parameter matcher.
40
+ # @param [Base] other parameter matcher.
44
41
  # @return [AnyOf] parameter matcher.
45
42
  #
46
43
  # @see Expectation#with
@@ -60,12 +57,9 @@ module Mocha
60
57
  # object.run(1) # passes
61
58
  # object.run(2) # passes
62
59
  # object.run(3) # fails
63
- def |(matcher)
64
- AnyOf.new(self, matcher)
60
+ def |(other)
61
+ AnyOf.new(self, other)
65
62
  end
66
-
67
63
  end
68
-
69
64
  end
70
-
71
65
  end
@@ -1,9 +1,7 @@
1
1
  require 'mocha/parameter_matchers/base'
2
2
 
3
3
  module Mocha
4
-
5
4
  module ParameterMatchers
6
-
7
5
  # Matches any +Object+ equalling +value+.
8
6
  #
9
7
  # @param [Object] value expected value.
@@ -29,7 +27,6 @@ module Mocha
29
27
 
30
28
  # Parameter matcher which matches when actual parameter equals expected value.
31
29
  class Equals < Base
32
-
33
30
  # @private
34
31
  def initialize(value)
35
32
  @value = value
@@ -45,9 +42,6 @@ module Mocha
45
42
  def mocha_inspect
46
43
  @value.mocha_inspect
47
44
  end
48
-
49
45
  end
50
-
51
46
  end
52
-
53
47
  end