mocha 1.1.0 → 1.13.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 (263) 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/README.md +114 -28
  8. data/RELEASE.md +248 -1
  9. data/Rakefile +53 -35
  10. data/gemfiles/Gemfile.test-unit.latest +5 -1
  11. data/init.rb +1 -3
  12. data/lib/mocha/any_instance_method.rb +12 -72
  13. data/lib/mocha/api.rb +121 -56
  14. data/lib/mocha/argument_iterator.rb +4 -8
  15. data/lib/mocha/backtrace_filter.rb +1 -5
  16. data/lib/mocha/block_matcher.rb +31 -0
  17. data/lib/mocha/cardinality.rb +60 -49
  18. data/lib/mocha/central.rb +21 -12
  19. data/lib/mocha/change_state_side_effect.rb +0 -4
  20. data/lib/mocha/class_methods.rb +19 -20
  21. data/lib/mocha/configuration.rb +361 -18
  22. data/lib/mocha/debug.rb +3 -2
  23. data/lib/mocha/deprecation.rb +8 -11
  24. data/lib/mocha/detection/mini_test.rb +0 -2
  25. data/lib/mocha/detection/test_unit.rb +3 -5
  26. data/lib/mocha/error_with_filtered_backtrace.rb +13 -0
  27. data/lib/mocha/exception_raiser.rb +4 -6
  28. data/lib/mocha/expectation.rb +125 -89
  29. data/lib/mocha/expectation_error.rb +1 -1
  30. data/lib/mocha/expectation_error_factory.rb +0 -1
  31. data/lib/mocha/expectation_list.rb +7 -11
  32. data/lib/mocha/hooks.rb +1 -3
  33. data/lib/mocha/in_state_ordering_constraint.rb +0 -4
  34. data/lib/mocha/inspect.rb +30 -38
  35. data/lib/mocha/instance_method.rb +15 -8
  36. data/lib/mocha/integration/mini_test/adapter.rb +2 -4
  37. data/lib/mocha/integration/mini_test/exception_translation.rb +1 -1
  38. data/lib/mocha/integration/mini_test/nothing.rb +4 -4
  39. data/lib/mocha/integration/mini_test/version_13.rb +4 -1
  40. data/lib/mocha/integration/mini_test/version_140.rb +4 -1
  41. data/lib/mocha/integration/mini_test/version_141.rb +4 -1
  42. data/lib/mocha/integration/mini_test/version_142_to_172.rb +4 -1
  43. data/lib/mocha/integration/mini_test/version_200.rb +4 -1
  44. data/lib/mocha/integration/mini_test/version_201_to_222.rb +4 -1
  45. data/lib/mocha/integration/mini_test/version_2110_to_2111.rb +4 -1
  46. data/lib/mocha/integration/mini_test/version_2112_to_320.rb +4 -1
  47. data/lib/mocha/integration/mini_test/version_230_to_2101.rb +4 -1
  48. data/lib/mocha/integration/mini_test.rb +7 -0
  49. data/lib/mocha/integration/monkey_patcher.rb +8 -2
  50. data/lib/mocha/integration/test_unit/adapter.rb +5 -6
  51. data/lib/mocha/integration/test_unit/gem_version_200.rb +5 -2
  52. data/lib/mocha/integration/test_unit/gem_version_201_to_202.rb +5 -2
  53. data/lib/mocha/integration/test_unit/gem_version_203_to_220.rb +5 -2
  54. data/lib/mocha/integration/test_unit/gem_version_230_to_250.rb +5 -2
  55. data/lib/mocha/integration/test_unit/nothing.rb +4 -4
  56. data/lib/mocha/integration/test_unit/ruby_version_185_and_below.rb +4 -1
  57. data/lib/mocha/integration/test_unit/ruby_version_186_and_above.rb +4 -1
  58. data/lib/mocha/integration/test_unit.rb +7 -0
  59. data/lib/mocha/integration.rb +2 -5
  60. data/lib/mocha/invocation.rb +77 -0
  61. data/lib/mocha/is_a.rb +0 -2
  62. data/lib/mocha/logger.rb +0 -4
  63. data/lib/mocha/macos_version.rb +5 -0
  64. data/lib/mocha/method_matcher.rb +1 -5
  65. data/lib/mocha/minitest.rb +8 -0
  66. data/lib/mocha/mock.rb +94 -46
  67. data/lib/mocha/mockery.rb +72 -98
  68. data/lib/mocha/names.rb +2 -12
  69. data/lib/mocha/not_initialized_error.rb +7 -0
  70. data/lib/mocha/object_methods.rb +25 -31
  71. data/lib/mocha/parameter_matchers/all_of.rb +2 -8
  72. data/lib/mocha/parameter_matchers/any_of.rb +2 -8
  73. data/lib/mocha/parameter_matchers/any_parameters.rb +3 -9
  74. data/lib/mocha/parameter_matchers/anything.rb +2 -8
  75. data/lib/mocha/parameter_matchers/base.rb +6 -12
  76. data/lib/mocha/parameter_matchers/equals.rb +1 -7
  77. data/lib/mocha/parameter_matchers/{query_string.rb → equivalent_uri.rb} +15 -15
  78. data/lib/mocha/parameter_matchers/has_entries.rb +2 -7
  79. data/lib/mocha/parameter_matchers/has_entry.rb +26 -21
  80. data/lib/mocha/parameter_matchers/has_key.rb +2 -7
  81. data/lib/mocha/parameter_matchers/has_keys.rb +53 -0
  82. data/lib/mocha/parameter_matchers/has_value.rb +2 -7
  83. data/lib/mocha/parameter_matchers/includes.rb +50 -8
  84. data/lib/mocha/parameter_matchers/instance_methods.rb +18 -0
  85. data/lib/mocha/parameter_matchers/instance_of.rb +0 -6
  86. data/lib/mocha/parameter_matchers/is_a.rb +2 -7
  87. data/lib/mocha/parameter_matchers/kind_of.rb +2 -6
  88. data/lib/mocha/parameter_matchers/not.rb +2 -7
  89. data/lib/mocha/parameter_matchers/optionally.rb +4 -10
  90. data/lib/mocha/parameter_matchers/regexp_matches.rb +0 -6
  91. data/lib/mocha/parameter_matchers/responds_with.rb +3 -8
  92. data/lib/mocha/parameter_matchers/yaml_equivalent.rb +2 -6
  93. data/lib/mocha/parameter_matchers.rb +3 -4
  94. data/lib/mocha/parameters_matcher.rb +6 -9
  95. data/lib/mocha/raised_exception.rb +11 -0
  96. data/lib/mocha/receivers.rb +10 -14
  97. data/lib/mocha/return_values.rb +4 -8
  98. data/lib/mocha/ruby_version.rb +4 -0
  99. data/lib/mocha/sequence.rb +4 -9
  100. data/lib/mocha/setup.rb +5 -0
  101. data/lib/mocha/single_return_value.rb +2 -5
  102. data/lib/mocha/singleton_class.rb +9 -0
  103. data/lib/mocha/state_machine.rb +33 -46
  104. data/lib/mocha/stubbed_method.rb +125 -0
  105. data/lib/mocha/stubbing_error.rb +2 -13
  106. data/lib/mocha/test_unit.rb +7 -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/lib/mocha.rb +8 -0
  112. data/mocha.gemspec +42 -40
  113. data/yard-templates/default/layout/html/google_analytics.erb +6 -9
  114. data/yard-templates/default/layout/html/setup.rb +2 -3
  115. metadata +45 -191
  116. data/bin/build-matrix +0 -71
  117. data/gemfiles/Gemfile.minitest.1.3.0 +0 -7
  118. data/gemfiles/Gemfile.minitest.1.4.0 +0 -7
  119. data/gemfiles/Gemfile.minitest.1.4.1 +0 -7
  120. data/gemfiles/Gemfile.minitest.1.4.2 +0 -7
  121. data/gemfiles/Gemfile.minitest.2.0.0 +0 -7
  122. data/gemfiles/Gemfile.minitest.2.0.1 +0 -7
  123. data/gemfiles/Gemfile.minitest.2.11.0 +0 -7
  124. data/gemfiles/Gemfile.minitest.2.11.2 +0 -7
  125. data/gemfiles/Gemfile.minitest.2.3.0 +0 -7
  126. data/gemfiles/Gemfile.test-unit.2.0.0 +0 -7
  127. data/gemfiles/Gemfile.test-unit.2.0.1 +0 -7
  128. data/gemfiles/Gemfile.test-unit.2.0.3 +0 -7
  129. data/lib/mocha/class_method.rb +0 -127
  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_65_test.rb +0 -63
  150. data/test/acceptance/issue_70_test.rb +0 -55
  151. data/test/acceptance/mocha_example_test.rb +0 -98
  152. data/test/acceptance/mocha_test_result_test.rb +0 -84
  153. data/test/acceptance/mock_test.rb +0 -100
  154. data/test/acceptance/mock_with_initializer_block_test.rb +0 -51
  155. data/test/acceptance/mocked_methods_dispatch_test.rb +0 -78
  156. data/test/acceptance/multiple_expectations_failure_message_test.rb +0 -68
  157. data/test/acceptance/optional_parameters_test.rb +0 -70
  158. data/test/acceptance/parameter_matcher_test.rb +0 -337
  159. data/test/acceptance/partial_mocks_test.rb +0 -47
  160. data/test/acceptance/prepend_test.rb +0 -88
  161. data/test/acceptance/raise_exception_test.rb +0 -39
  162. data/test/acceptance/return_value_test.rb +0 -52
  163. data/test/acceptance/sequence_test.rb +0 -192
  164. data/test/acceptance/states_test.rb +0 -70
  165. data/test/acceptance/stub_any_instance_method_defined_on_superclass_test.rb +0 -34
  166. data/test/acceptance/stub_any_instance_method_test.rb +0 -238
  167. data/test/acceptance/stub_class_method_defined_on_active_record_association_proxy_test.rb +0 -106
  168. data/test/acceptance/stub_class_method_defined_on_class_test.rb +0 -78
  169. data/test/acceptance/stub_class_method_defined_on_module_test.rb +0 -75
  170. data/test/acceptance/stub_class_method_defined_on_superclass_test.rb +0 -112
  171. data/test/acceptance/stub_everything_test.rb +0 -56
  172. data/test/acceptance/stub_instance_method_defined_on_active_record_association_proxy_test.rb +0 -93
  173. data/test/acceptance/stub_instance_method_defined_on_class_and_aliased_test.rb +0 -69
  174. data/test/acceptance/stub_instance_method_defined_on_class_test.rb +0 -69
  175. data/test/acceptance/stub_instance_method_defined_on_kernel_module_test.rb +0 -75
  176. data/test/acceptance/stub_instance_method_defined_on_module_test.rb +0 -75
  177. data/test/acceptance/stub_instance_method_defined_on_object_class_test.rb +0 -75
  178. data/test/acceptance/stub_instance_method_defined_on_singleton_class_test.rb +0 -70
  179. data/test/acceptance/stub_instance_method_defined_on_superclass_test.rb +0 -72
  180. data/test/acceptance/stub_module_method_test.rb +0 -163
  181. data/test/acceptance/stub_test.rb +0 -52
  182. data/test/acceptance/stubba_example_test.rb +0 -102
  183. data/test/acceptance/stubba_test_result_test.rb +0 -66
  184. data/test/acceptance/stubbing_error_backtrace_test.rb +0 -64
  185. data/test/acceptance/stubbing_frozen_object_test.rb +0 -88
  186. data/test/acceptance/stubbing_method_accepting_block_parameter_test.rb +0 -48
  187. data/test/acceptance/stubbing_method_unnecessarily_test.rb +0 -65
  188. data/test/acceptance/stubbing_nil_test.rb +0 -59
  189. data/test/acceptance/stubbing_non_existent_any_instance_method_test.rb +0 -130
  190. data/test/acceptance/stubbing_non_existent_class_method_test.rb +0 -157
  191. data/test/acceptance/stubbing_non_existent_instance_method_test.rb +0 -147
  192. data/test/acceptance/stubbing_non_public_any_instance_method_test.rb +0 -130
  193. data/test/acceptance/stubbing_non_public_class_method_test.rb +0 -163
  194. data/test/acceptance/stubbing_non_public_instance_method_test.rb +0 -143
  195. data/test/acceptance/stubbing_on_non_mock_object_test.rb +0 -64
  196. data/test/acceptance/stubbing_same_class_method_on_parent_and_child_classes_test.rb +0 -35
  197. data/test/acceptance/throw_test.rb +0 -45
  198. data/test/acceptance/unexpected_invocation_test.rb +0 -25
  199. data/test/acceptance/unstubbing_test.rb +0 -168
  200. data/test/assertions.rb +0 -6
  201. data/test/deprecation_disabler.rb +0 -15
  202. data/test/execution_point.rb +0 -36
  203. data/test/integration/mini_test_test.rb +0 -8
  204. data/test/integration/shared_tests.rb +0 -174
  205. data/test/integration/test_unit_test.rb +0 -8
  206. data/test/method_definer.rb +0 -24
  207. data/test/mini_test_result.rb +0 -90
  208. data/test/minitest_result.rb +0 -49
  209. data/test/simple_counter.rb +0 -13
  210. data/test/test_helper.rb +0 -50
  211. data/test/test_runner.rb +0 -58
  212. data/test/test_unit_result.rb +0 -20
  213. data/test/unit/any_instance_method_test.rb +0 -132
  214. data/test/unit/array_inspect_test.rb +0 -16
  215. data/test/unit/backtrace_filter_test.rb +0 -19
  216. data/test/unit/cardinality_test.rb +0 -56
  217. data/test/unit/central_test.rb +0 -100
  218. data/test/unit/change_state_side_effect_test.rb +0 -41
  219. data/test/unit/class_method_test.rb +0 -223
  220. data/test/unit/class_methods_test.rb +0 -40
  221. data/test/unit/configuration_test.rb +0 -38
  222. data/test/unit/date_time_inspect_test.rb +0 -21
  223. data/test/unit/exception_raiser_test.rb +0 -42
  224. data/test/unit/expectation_list_test.rb +0 -82
  225. data/test/unit/expectation_test.rb +0 -497
  226. data/test/unit/hash_inspect_test.rb +0 -16
  227. data/test/unit/hooks_test.rb +0 -29
  228. data/test/unit/in_state_ordering_constraint_test.rb +0 -43
  229. data/test/unit/method_matcher_test.rb +0 -28
  230. data/test/unit/mock_test.rb +0 -341
  231. data/test/unit/mockery_test.rb +0 -151
  232. data/test/unit/module_methods_test.rb +0 -19
  233. data/test/unit/multiple_yields_test.rb +0 -18
  234. data/test/unit/no_yields_test.rb +0 -18
  235. data/test/unit/object_inspect_test.rb +0 -38
  236. data/test/unit/object_methods_test.rb +0 -46
  237. data/test/unit/parameter_matchers/all_of_test.rb +0 -26
  238. data/test/unit/parameter_matchers/any_of_test.rb +0 -26
  239. data/test/unit/parameter_matchers/anything_test.rb +0 -21
  240. data/test/unit/parameter_matchers/equals_test.rb +0 -25
  241. data/test/unit/parameter_matchers/has_entries_test.rb +0 -51
  242. data/test/unit/parameter_matchers/has_entry_test.rb +0 -129
  243. data/test/unit/parameter_matchers/has_key_test.rb +0 -55
  244. data/test/unit/parameter_matchers/has_value_test.rb +0 -57
  245. data/test/unit/parameter_matchers/includes_test.rb +0 -59
  246. data/test/unit/parameter_matchers/instance_of_test.rb +0 -25
  247. data/test/unit/parameter_matchers/is_a_test.rb +0 -25
  248. data/test/unit/parameter_matchers/kind_of_test.rb +0 -25
  249. data/test/unit/parameter_matchers/not_test.rb +0 -26
  250. data/test/unit/parameter_matchers/regexp_matches_test.rb +0 -46
  251. data/test/unit/parameter_matchers/responds_with_test.rb +0 -32
  252. data/test/unit/parameter_matchers/stub_matcher.rb +0 -27
  253. data/test/unit/parameter_matchers/yaml_equivalent_test.rb +0 -25
  254. data/test/unit/parameters_matcher_test.rb +0 -121
  255. data/test/unit/receivers_test.rb +0 -66
  256. data/test/unit/return_values_test.rb +0 -63
  257. data/test/unit/sequence_test.rb +0 -104
  258. data/test/unit/single_return_value_test.rb +0 -14
  259. data/test/unit/single_yield_test.rb +0 -18
  260. data/test/unit/state_machine_test.rb +0 -98
  261. data/test/unit/string_inspect_test.rb +0 -11
  262. data/test/unit/thrower_test.rb +0 -20
  263. data/test/unit/yield_parameters_test.rb +0 -93
data/Rakefile CHANGED
@@ -1,15 +1,15 @@
1
- require "bundler"
1
+ require 'bundler'
2
2
  Bundler::GemHelper.install_tasks
3
- require "bundler/setup"
3
+ require 'bundler/setup'
4
4
 
5
5
  require 'rake/testtask'
6
6
 
7
- desc "Run all tests"
7
+ desc 'Run all tests'
8
8
  task 'default' => ['test', 'test:performance']
9
9
 
10
- desc "Run tests"
10
+ desc 'Run tests'
11
11
  task 'test' do
12
- if test_library = ENV['MOCHA_RUN_INTEGRATION_TESTS']
12
+ if (test_library = ENV['MOCHA_RUN_INTEGRATION_TESTS'])
13
13
  Rake::Task["test:integration:#{test_library}"].invoke
14
14
  else
15
15
  Rake::Task['test:units'].invoke
@@ -17,14 +17,13 @@ task 'test' do
17
17
  end
18
18
  end
19
19
 
20
- namespace 'test' do
21
-
20
+ namespace 'test' do # rubocop:disable Metrics/BlockLength
22
21
  unit_tests = FileList['test/unit/**/*_test.rb']
23
22
  all_acceptance_tests = FileList['test/acceptance/*_test.rb']
24
23
  ruby186_incompatible_acceptance_tests = FileList['test/acceptance/stub_class_method_defined_on_*_test.rb'] + FileList['test/acceptance/stub_instance_method_defined_on_*_test.rb']
25
24
  ruby186_compatible_acceptance_tests = all_acceptance_tests - ruby186_incompatible_acceptance_tests
26
25
 
27
- desc "Run unit tests"
26
+ desc 'Run unit tests'
28
27
  Rake::TestTask.new('units') do |t|
29
28
  t.libs << 'test'
30
29
  t.test_files = unit_tests
@@ -32,20 +31,20 @@ namespace 'test' do
32
31
  t.warning = true
33
32
  end
34
33
 
35
- desc "Run acceptance tests"
34
+ desc 'Run acceptance tests'
36
35
  Rake::TestTask.new('acceptance') do |t|
37
36
  t.libs << 'test'
38
- if defined?(RUBY_VERSION) && (RUBY_VERSION >= "1.8.7")
39
- t.test_files = all_acceptance_tests
40
- else
41
- t.test_files = ruby186_compatible_acceptance_tests
42
- end
37
+ t.test_files = if defined?(RUBY_VERSION) && (RUBY_VERSION >= '1.8.7')
38
+ all_acceptance_tests
39
+ else
40
+ ruby186_compatible_acceptance_tests
41
+ end
43
42
  t.verbose = true
44
43
  t.warning = true
45
44
  end
46
45
 
47
46
  namespace 'integration' do
48
- desc "Run MiniTest integration tests (intended to be run in its own process)"
47
+ desc 'Run MiniTest integration tests (intended to be run in its own process)'
49
48
  Rake::TestTask.new('minitest') do |t|
50
49
  t.libs << 'test'
51
50
  t.test_files = FileList['test/integration/mini_test_test.rb']
@@ -53,7 +52,7 @@ namespace 'test' do
53
52
  t.warning = true
54
53
  end
55
54
 
56
- desc "Run Test::Unit integration tests (intended to be run in its own process)"
55
+ desc 'Run Test::Unit integration tests (intended to be run in its own process)'
57
56
  Rake::TestTask.new('test-unit') do |t|
58
57
  t.libs << 'test'
59
58
  t.test_files = FileList['test/integration/test_unit_test.rb']
@@ -72,7 +71,7 @@ namespace 'test' do
72
71
  # t.rcov_opts << '--xref'
73
72
  # end
74
73
 
75
- desc "Run performance tests"
74
+ desc 'Run performance tests'
76
75
  task 'performance' do
77
76
  require File.join(File.dirname(__FILE__), 'test', 'acceptance', 'stubba_example_test')
78
77
  require File.join(File.dirname(__FILE__), 'test', 'acceptance', 'mocha_example_test')
@@ -82,35 +81,53 @@ namespace 'test' do
82
81
  puts "#{test_case}: #{benchmark_test_case(test_case, iterations)} seconds."
83
82
  end
84
83
  end
84
+ end
85
85
 
86
+ begin
87
+ require 'rubocop/rake_task'
88
+ if RUBY_VERSION >= '2.2.0' && (defined?(RUBY_ENGINE) && RUBY_ENGINE == 'ruby') && ENV['MOCHA_RUN_INTEGRATION_TESTS'].nil?
89
+ RuboCop::RakeTask.new
90
+ task 'test' => 'rubocop'
91
+ end
92
+ rescue LoadError # rubocop:disable Lint/HandleExceptions
86
93
  end
87
94
 
95
+ # rubocop:disable Metrics/CyclomaticComplexity,Metrics/PerceivedComplexity
88
96
  def benchmark_test_case(klass, iterations)
89
97
  require 'benchmark'
98
+ require 'mocha/detection/mini_test'
90
99
 
91
100
  if defined?(MiniTest)
92
- MiniTest::Unit.output = StringIO.new
93
- Benchmark.realtime { iterations.times { |i| MiniTest::Unit.new.run([klass]) } }
101
+ minitest_version = Gem::Version.new(Mocha::Detection::MiniTest.version)
102
+ if Gem::Requirement.new('>= 5.0.0').satisfied_by?(minitest_version)
103
+ result = Benchmark.realtime { iterations.times { |_i| klass.run(MiniTest::CompositeReporter.new) } }
104
+ MiniTest::Runnable.runnables.delete(klass)
105
+ result
106
+ else
107
+ MiniTest::Unit.output = StringIO.new
108
+ Benchmark.realtime { iterations.times { |_i| MiniTest::Unit.new.run([klass]) } }
109
+ end
94
110
  else
95
111
  load 'test/unit/ui/console/testrunner.rb' unless defined?(Test::Unit::UI::Console::TestRunner)
96
- unless $silent_option
112
+ unless @silent_option
97
113
  begin
98
114
  load 'test/unit/ui/console/outputlevel.rb' unless defined?(Test::Unit::UI::Console::OutputLevel::SILENT)
99
- $silent_option = { :output_level => Test::Unit::UI::Console::OutputLevel::SILENT }
115
+ @silent_option = { :output_level => Test::Unit::UI::Console::OutputLevel::SILENT }
100
116
  rescue LoadError
101
- $silent_option = Test::Unit::UI::SILENT
117
+ @silent_option = Test::Unit::UI::SILENT
102
118
  end
103
119
  end
104
- Benchmark.realtime { iterations.times { Test::Unit::UI::Console::TestRunner.run(klass, $silent_option) } }
120
+ Benchmark.realtime { iterations.times { Test::Unit::UI::Console::TestRunner.run(klass, @silent_option) } }
105
121
  end
106
122
  end
123
+ # rubocop:enable Metrics/CyclomaticComplexity,Metrics/PerceivedComplexity
107
124
 
108
- unless ENV["MOCHA_NO_DOCS"]
125
+ if ENV['MOCHA_GENERATE_DOCS']
109
126
  require 'yard'
110
127
 
111
128
  desc 'Remove generated documentation'
112
129
  task 'clobber_yardoc' do
113
- `rm -rf ./doc`
130
+ `rm -rf ./docs`
114
131
  end
115
132
 
116
133
  task 'docs_environment' do
@@ -121,19 +138,20 @@ unless ENV["MOCHA_NO_DOCS"]
121
138
 
122
139
  desc 'Generate documentation'
123
140
  YARD::Rake::YardocTask.new('yardoc' => 'docs_environment') do |task|
124
- task.options = ["--title", "Mocha #{Mocha::VERSION}"]
141
+ task.options = ['--title', "Mocha #{Mocha::VERSION}", '--fail-on-warning']
125
142
  end
126
143
 
127
- desc "Generate documentation"
128
- task 'generate_docs' => ['clobber_yardoc', 'yardoc']
144
+ task 'checkout_docs_cname' do
145
+ `git checkout docs/CNAME`
146
+ end
129
147
 
130
- desc "Publish docs to gofreerange.com/docs/mocha"
131
- task 'publish_docs' => 'generate_docs' do
132
- path = "/home/freerange/docs/mocha"
133
- system %{ssh gofreerange.com "sudo rm -fr #{path} && mkdir -p #{path}" && scp -r doc/* gofreerange.com:#{path}}
148
+ task 'checkout_docs_js' do
149
+ `git checkout docs/js/app.js`
150
+ `git checkout docs/js/jquery.js`
134
151
  end
135
- end
136
152
 
137
- task 'release' => 'default' do
138
- Rake::Task['publish_docs'].invoke
153
+ desc 'Generate documentation'
154
+ task 'generate_docs' => %w[clobber_yardoc yardoc checkout_docs_cname checkout_docs_js]
139
155
  end
156
+
157
+ task 'release' => 'default'
@@ -3,5 +3,9 @@ source 'https://rubygems.org'
3
3
  gemspec :path=>"../"
4
4
 
5
5
  group :development do
6
- gem "test-unit"
6
+ if RUBY_VERSION < '1.9'
7
+ gem "test-unit", "~> 2"
8
+ else
9
+ gem "test-unit"
10
+ end
7
11
  end
data/init.rb CHANGED
@@ -1,3 +1 @@
1
- # Mocha should no longer be loaded at plugin load time
2
- # You should explicitly load Mocha *after* Test::Unit or MiniTest have been loaded
3
- # e.g. by adding "require 'mocha'" at the bottom of test/test_helper.rb
1
+ warn 'Mocha deprecation warning: The old-style Rails plugin will not be supported in future versions of Mocha.'
@@ -1,84 +1,24 @@
1
- require 'mocha/class_method'
1
+ require 'mocha/ruby_version'
2
+ require 'mocha/stubbed_method'
2
3
 
3
4
  module Mocha
5
+ class AnyInstanceMethod < StubbedMethod
6
+ private
4
7
 
5
- class AnyInstanceMethod < ClassMethod
6
-
7
- def mock
8
- stubbee.any_instance.mocha
9
- end
10
-
11
- def reset_mocha
12
- stubbee.any_instance.reset_mocha
13
- end
14
-
15
- def hide_original_method
16
- if method_exists?(method)
17
- begin
18
- @original_method = stubbee.instance_method(method)
19
- if @original_method && @original_method.owner == stubbee
20
- @original_visibility = :public
21
- if stubbee.protected_instance_methods.include?(method)
22
- @original_visibility = :protected
23
- elsif stubbee.private_instance_methods.include?(method)
24
- @original_visibility = :private
25
- end
26
- stubbee.send(:remove_method, method)
27
- end
28
-
29
- include_prepended_module if RUBY_VERSION >= '2.0'
30
- rescue NameError
31
- # deal with nasties like ActiveRecord::Associations::AssociationProxy
32
- end
33
- end
34
- end
35
-
36
- def define_new_method
37
- definition_target.class_eval(<<-CODE, __FILE__, __LINE__ + 1)
38
- def #{method}(*args, &block)
39
- self.class.any_instance.mocha.method_missing(:#{method}, *args, &block)
40
- end
41
- CODE
42
- if @original_visibility
43
- Module.instance_method(@original_visibility).bind(definition_target).call(method)
44
- end
45
- end
46
-
47
- def remove_new_method
48
- definition_target.send(:remove_method, method)
8
+ def mock_owner
9
+ stubbee.any_instance
49
10
  end
50
11
 
51
- def restore_original_method
52
- if @original_method && @original_method.owner == stubbee
53
- stubbee.send(:define_method, method, @original_method)
54
- Module.instance_method(@original_visibility).bind(stubbee).call(method)
55
- end
12
+ def method_body(method)
13
+ method
56
14
  end
57
15
 
58
- def method_exists?(method)
59
- return true if stubbee.public_instance_methods(false).include?(method)
60
- return true if stubbee.protected_instance_methods(false).include?(method)
61
- return true if stubbee.private_instance_methods(false).include?(method)
62
- return false
16
+ def stubbee_method(method_name)
17
+ stubbee.instance_method(method_name)
63
18
  end
64
19
 
65
- private
66
-
67
- def include_prepended_module
68
- possible_prepended_modules = stubbee.ancestors.take_while do |mod|
69
- !(Class === mod)
70
- end
71
-
72
- if possible_prepended_modules.any?
73
- @definition_target = PrependedModule.new
74
- stubbee.__send__ :prepend, @definition_target
75
- end
20
+ def original_method_owner
21
+ stubbee
76
22
  end
77
-
78
- def definition_target
79
- @definition_target ||= stubbee
80
- end
81
-
82
23
  end
83
-
84
24
  end
data/lib/mocha/api.rb CHANGED
@@ -3,34 +3,60 @@ require 'mocha/hooks'
3
3
  require 'mocha/mockery'
4
4
  require 'mocha/sequence'
5
5
  require 'mocha/object_methods'
6
- require 'mocha/module_methods'
7
6
  require 'mocha/class_methods'
8
7
 
9
8
  module Mocha
10
-
11
9
  # Methods added to +Test::Unit::TestCase+, +MiniTest::Unit::TestCase+ or equivalent.
10
+ # The mock creation methods are {#mock}, {#stub} and {#stub_everything}, all of which return a #{Mock}
11
+ # which can be further modified by {Mock#responds_like} and {Mock#responds_like_instance_of} methods,
12
+ # both of which return a {Mock}, too, and can therefore, be chained to the original creation methods.
13
+ #
14
+ # {Mock#responds_like} and {Mock#responds_like_instance_of} force the mock to indicate what it is
15
+ # supposed to be mocking, thus making it a safer verifying mock. They check that the underlying +responder+
16
+ # will actually respond to the methods being stubbed, throwing a +NoMethodError+ upon invocation otherwise.
17
+ #
18
+ # @example Verifying mock using {Mock#responds_like_instance_of}
19
+ # class Sheep
20
+ # def initialize
21
+ # raise "some awkward code we don't want to call"
22
+ # end
23
+ # def chew(grass); end
24
+ # end
25
+ #
26
+ # sheep = mock('sheep').responds_like_instance_of(Sheep)
27
+ # sheep.expects(:chew)
28
+ # sheep.expects(:foo)
29
+ # sheep.respond_to?(:chew) # => true
30
+ # sheep.respond_to?(:foo) # => false
31
+ # sheep.chew
32
+ # sheep.foo # => raises NoMethodError exception
12
33
  module API
13
-
14
34
  include ParameterMatchers
15
35
  include Hooks
16
36
 
17
37
  # @private
18
- def self.included(mod)
38
+ def self.included(_mod)
19
39
  Object.send(:include, Mocha::ObjectMethods)
20
- Module.send(:include, Mocha::ModuleMethods)
21
40
  Class.send(:include, Mocha::ClassMethods)
22
41
  end
23
42
 
43
+ # @private
44
+ def self.extended(mod)
45
+ included(mod)
46
+ end
47
+
24
48
  # Builds a new mock object
25
49
  #
26
- # @param [String] name identifies mock object in error messages.
27
- # @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 {Mock#expects} were called multiple times.
28
- # @yield optional block to be evaluated against the mock object instance, giving an alternative way to setup expectations.
29
50
  # @return [Mock] a new mock object
30
51
  #
31
- # @overload def mock(name, &block)
32
- # @overload def mock(expected_methods_vs_return_values = {}, &block)
33
- # @overload def mock(name, expected_methods_vs_return_values = {}, &block)
52
+ # @overload def mock(name)
53
+ # @param [String, Symbol] name identifies mock object in error messages.
54
+ # @note Prior to v1.10.0 when +name+ was a +Symbol+, this method returned an unnamed +Mock+ that expected the method identified by +name+. This was undocumented behaviour and it will be removed in the future, but for the moment it can be reinstated using {Configuration#reinstate_undocumented_behaviour_from_v1_9=}.
55
+ # @overload def mock(expected_methods_vs_return_values = {})
56
+ # @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 {Mock#expects} were called multiple times.
57
+ # @overload def mock(name, expected_methods_vs_return_values = {})
58
+ # @param [String, Symbol] name identifies mock object in error messages.
59
+ # @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 {Mock#expects} were called multiple times.
34
60
  #
35
61
  # @example Using expected_methods_vs_return_values Hash to setup expectations.
36
62
  # def test_motor_starts_and_stops
@@ -39,71 +65,92 @@ module Mocha
39
65
  # assert motor.stop
40
66
  # # an error will be raised unless both Motor#start and Motor#stop have been called
41
67
  # end
42
- # @example Using the optional block to setup expectations & stubbed methods.
43
- # def test_motor_starts_and_stops
44
- # motor = mock('motor') do
45
- # expects(:start).with(100.rpm).returns(true)
46
- # stubs(:stop).returns(true)
47
- # end
48
- # assert motor.start(100.rpm)
49
- # assert motor.stop
50
- # # an error will only be raised if Motor#start(100.rpm) has not been called
51
- # end
52
- def mock(*arguments, &block)
53
- name = arguments.shift if arguments.first.is_a?(String)
68
+ #
69
+ def mock(*arguments) # rubocop:disable Metrics/CyclomaticComplexity,Metrics/PerceivedComplexity
70
+ if Mocha.configuration.reinstate_undocumented_behaviour_from_v1_9?
71
+ if arguments.first.is_a?(Symbol)
72
+ method_name = arguments[0]
73
+ Deprecation.warning(
74
+ "Explicitly include `#{method_name}` in Hash of expected methods vs return values,",
75
+ " e.g. `mock(:#{method_name} => nil)`."
76
+ )
77
+ if arguments[1]
78
+ Deprecation.warning(
79
+ "In this case the 2nd argument for `mock(:##{method_name}, ...)` is ignored,",
80
+ ' but in the future a Hash of expected methods vs return values will be respected.'
81
+ )
82
+ end
83
+ elsif arguments.first.is_a?(String)
84
+ name = arguments.shift
85
+ end
86
+ elsif arguments.first.is_a?(String) || arguments.first.is_a?(Symbol)
87
+ name = arguments.shift
88
+ end
54
89
  expectations = arguments.shift || {}
55
- mock = name ? Mockery.instance.named_mock(name, &block) : Mockery.instance.unnamed_mock(&block)
90
+ mock = name ? Mockery.instance.named_mock(name) : Mockery.instance.unnamed_mock
56
91
  mock.expects(expectations)
57
92
  mock
58
93
  end
59
94
 
60
95
  # Builds a new mock object
61
96
  #
62
- # @param [String] name identifies mock object in error messages.
63
- # @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 {Mock#stubs} were called multiple times.
64
- # @yield optional block to be evaluated against the mock object instance, giving an alternative way to setup stubbed methods.
65
97
  # @return [Mock] a new mock object
66
98
  #
67
- # @overload def stub(name, &block)
68
- # @overload def stub(stubbed_methods_vs_return_values = {}, &block)
69
- # @overload def stub(name, stubbed_methods_vs_return_values = {}, &block)
99
+ # @overload def stub(name)
100
+ # @param [String, Symbol] name identifies mock object in error messages.
101
+ # @note Prior to v1.10.0 when +name+ was a +Symbol+, this method returned an unnamed +Mock+ that stubbed the method identified by +name+. This was undocumented behaviour and it will be removed in the future, but for the moment it can be reinstated using {Configuration#reinstate_undocumented_behaviour_from_v1_9=}.
102
+ # @overload def stub(stubbed_methods_vs_return_values = {})
103
+ # @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 {Mock#stubs} were called multiple times.
104
+ # @overload def stub(name, stubbed_methods_vs_return_values = {})
105
+ # @param [String, Symbol] name identifies mock object in error messages.
70
106
  #
71
107
  # @example Using stubbed_methods_vs_return_values Hash to setup stubbed methods.
72
108
  # def test_motor_starts_and_stops
73
- # motor = mock('motor', :start => true, :stop => true)
109
+ # motor = stub('motor', :start => true, :stop => true)
74
110
  # assert motor.start
75
111
  # assert motor.stop
76
112
  # # an error will not be raised even if either Motor#start or Motor#stop has not been called
77
113
  # end
78
- #
79
- # @example Using the optional block to setup expectations & stubbed methods.
80
- # def test_motor_starts_and_stops
81
- # motor = mock('motor') do
82
- # expects(:start).with(100.rpm).returns(true)
83
- # stubs(:stop).returns(true)
84
- # end
85
- # assert motor.start(100.rpm)
86
- # assert motor.stop
87
- # # an error will only be raised if Motor#start(100.rpm) has not been called
88
- # end
89
- def stub(*arguments, &block)
90
- name = arguments.shift if arguments.first.is_a?(String)
114
+ # rubocop:disable Metrics/CyclomaticComplexity,Metrics/PerceivedComplexity
115
+ def stub(*arguments)
116
+ if Mocha.configuration.reinstate_undocumented_behaviour_from_v1_9?
117
+ if arguments.first.is_a?(Symbol)
118
+ method_name = arguments[0]
119
+ Deprecation.warning(
120
+ "Explicitly include `#{method_name}` in Hash of stubbed methods vs return values,",
121
+ " e.g. `stub(:#{method_name} => nil)`."
122
+ )
123
+ if arguments[1]
124
+ Deprecation.warning(
125
+ "In this case the 2nd argument for `stub(:##{method_name}, ...)` is ignored,",
126
+ ' but in the future a Hash of stubbed methods vs return values will be respected.'
127
+ )
128
+ end
129
+ elsif arguments.first.is_a?(String)
130
+ name = arguments.shift
131
+ end
132
+ elsif arguments.first.is_a?(String) || arguments.first.is_a?(Symbol)
133
+ name = arguments.shift
134
+ end
91
135
  expectations = arguments.shift || {}
92
- stub = name ? Mockery.instance.named_mock(name, &block) : Mockery.instance.unnamed_mock(&block)
136
+ stub = name ? Mockery.instance.named_mock(name) : Mockery.instance.unnamed_mock
93
137
  stub.stubs(expectations)
94
138
  stub
95
139
  end
140
+ # rubocop:enable Metrics/CyclomaticComplexity,Metrics/PerceivedComplexity
96
141
 
97
142
  # Builds a mock object that accepts calls to any method. By default it will return +nil+ for any method call.
98
143
  #
99
- # @param [String] name identifies mock object in error messages.
100
- # @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 {Mock#stubs} were called multiple times.
101
- # @yield optional block to be evaluated against the mock object instance, giving an alternative way to setup stubbed methods.
102
144
  # @return [Mock] a new mock object
103
145
  #
104
- # @overload def stub_everything(name, &block)
105
- # @overload def stub_everything(stubbed_methods_vs_return_values = {}, &block)
106
- # @overload def stub_everything(name, stubbed_methods_vs_return_values = {}, &block)
146
+ # @overload def stub_everything(name)
147
+ # @param [String, Symbol] name identifies mock object in error messages.
148
+ # @note Prior to v1.10.0 when +name+ was a +Symbol+, this method returned an unnamed +Mock+ that stubbed the method identified by +name+. This was undocumented behaviour and it will be removed in the future, but for the moment it can be reinstated using {Configuration#reinstate_undocumented_behaviour_from_v1_9=}.
149
+ # @overload def stub_everything(stubbed_methods_vs_return_values = {})
150
+ # @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 {Mock#stubs} were called multiple times.
151
+ # @overload def stub_everything(name, stubbed_methods_vs_return_values = {})
152
+ # @param [String, Symbol] name identifies mock object in error messages.
153
+ # @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 {Mock#stubs} were called multiple times.
107
154
  #
108
155
  # @example Ignore invocations of irrelevant methods.
109
156
  # def test_motor_stops
@@ -112,14 +159,34 @@ module Mocha
112
159
  # assert_nil motor.irrelevant_method_2 # => no error raised
113
160
  # assert motor.stop
114
161
  # end
115
- def stub_everything(*arguments, &block)
116
- name = arguments.shift if arguments.first.is_a?(String)
162
+ # rubocop:disable Metrics/CyclomaticComplexity,Metrics/PerceivedComplexity
163
+ def stub_everything(*arguments)
164
+ if Mocha.configuration.reinstate_undocumented_behaviour_from_v1_9?
165
+ if arguments.first.is_a?(Symbol)
166
+ method_name = arguments[0]
167
+ Deprecation.warning(
168
+ "Explicitly include `#{method_name}` in Hash of stubbed methods vs return values,",
169
+ " e.g. `stub_everything(:#{method_name} => nil)`."
170
+ )
171
+ if arguments[1]
172
+ Deprecation.warning(
173
+ "In this case the 2nd argument for `stub_everything(:##{method_name}, ...)` is ignored,",
174
+ ' but in the future a Hash of stubbed methods vs return values will be respected.'
175
+ )
176
+ end
177
+ elsif arguments.first.is_a?(String)
178
+ name = arguments.shift
179
+ end
180
+ elsif arguments.first.is_a?(String) || arguments.first.is_a?(Symbol)
181
+ name = arguments.shift
182
+ end
117
183
  expectations = arguments.shift || {}
118
- stub = name ? Mockery.instance.named_mock(name, &block) : Mockery.instance.unnamed_mock(&block)
184
+ stub = name ? Mockery.instance.named_mock(name) : Mockery.instance.unnamed_mock
119
185
  stub.stub_everything
120
186
  stub.stubs(expectations)
121
187
  stub
122
188
  end
189
+ # rubocop:enable Metrics/CyclomaticComplexity,Metrics/PerceivedComplexity
123
190
 
124
191
  # Builds a new sequence which can be used to constrain the order in which expectations can occur.
125
192
  #
@@ -170,7 +237,5 @@ module Mocha
170
237
  def states(name)
171
238
  Mockery.instance.new_state_machine(name)
172
239
  end
173
-
174
240
  end
175
-
176
241
  end
@@ -1,21 +1,17 @@
1
1
  module Mocha
2
-
3
2
  class ArgumentIterator
4
-
5
3
  def initialize(argument)
6
4
  @argument = argument
7
5
  end
8
6
 
9
- def each(&block)
10
- if @argument.is_a?(Hash) then
7
+ def each
8
+ if @argument.is_a?(Hash)
11
9
  @argument.each do |method_name, return_value|
12
- block.call(method_name, return_value)
10
+ yield method_name, return_value
13
11
  end
14
12
  else
15
- block.call(@argument)
13
+ yield @argument
16
14
  end
17
15
  end
18
-
19
16
  end
20
-
21
17
  end
@@ -1,8 +1,6 @@
1
1
  module Mocha
2
-
3
2
  class BacktraceFilter
4
-
5
- LIB_DIRECTORY = File.expand_path(File.join(File.dirname(__FILE__), "..")) + File::SEPARATOR
3
+ LIB_DIRECTORY = File.expand_path(File.join(File.dirname(__FILE__), '..')) + File::SEPARATOR
6
4
 
7
5
  def initialize(lib_directory = LIB_DIRECTORY)
8
6
  @path_pattern = Regexp.new(lib_directory)
@@ -11,7 +9,5 @@ module Mocha
11
9
  def filtered(backtrace)
12
10
  backtrace.reject { |location| @path_pattern.match(File.expand_path(location)) }
13
11
  end
14
-
15
12
  end
16
-
17
13
  end
@@ -0,0 +1,31 @@
1
+ module Mocha
2
+ module BlockMatchers
3
+ class OptionalBlock
4
+ def match?(_actual_block)
5
+ true
6
+ end
7
+
8
+ def mocha_inspect; end
9
+ end
10
+
11
+ class BlockGiven
12
+ def match?(actual_block)
13
+ !actual_block.nil?
14
+ end
15
+
16
+ def mocha_inspect
17
+ 'with block given'
18
+ end
19
+ end
20
+
21
+ class NoBlockGiven
22
+ def match?(actual_block)
23
+ actual_block.nil?
24
+ end
25
+
26
+ def mocha_inspect
27
+ 'with no block given'
28
+ end
29
+ end
30
+ end
31
+ end