newbamboo-rspec 1.1.12

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 (324) hide show
  1. data/.autotest +4 -0
  2. data/History.txt +1263 -0
  3. data/License.txt +22 -0
  4. data/Manifest.txt +327 -0
  5. data/README.txt +57 -0
  6. data/Rakefile +104 -0
  7. data/TODO.txt +18 -0
  8. data/bin/autospec +4 -0
  9. data/bin/spec +4 -0
  10. data/examples/failing/README.txt +7 -0
  11. data/examples/failing/diffing_spec.rb +36 -0
  12. data/examples/failing/failing_autogenerated_docstrings_example.rb +19 -0
  13. data/examples/failing/failure_in_after.rb +10 -0
  14. data/examples/failing/failure_in_before.rb +10 -0
  15. data/examples/failing/mocking_example.rb +40 -0
  16. data/examples/failing/mocking_with_flexmock.rb +26 -0
  17. data/examples/failing/mocking_with_mocha.rb +25 -0
  18. data/examples/failing/mocking_with_rr.rb +27 -0
  19. data/examples/failing/partial_mock_example.rb +20 -0
  20. data/examples/failing/predicate_example.rb +34 -0
  21. data/examples/failing/raising_example.rb +47 -0
  22. data/examples/failing/spec_helper.rb +3 -0
  23. data/examples/failing/syntax_error_example.rb +7 -0
  24. data/examples/failing/team_spec.rb +44 -0
  25. data/examples/failing/timeout_behaviour.rb +7 -0
  26. data/examples/passing/autogenerated_docstrings_example.rb +25 -0
  27. data/examples/passing/before_and_after_example.rb +40 -0
  28. data/examples/passing/behave_as_example.rb +45 -0
  29. data/examples/passing/custom_expectation_matchers.rb +54 -0
  30. data/examples/passing/custom_formatter.rb +12 -0
  31. data/examples/passing/dynamic_spec.rb +9 -0
  32. data/examples/passing/file_accessor.rb +19 -0
  33. data/examples/passing/file_accessor_spec.rb +38 -0
  34. data/examples/passing/greeter_spec.rb +31 -0
  35. data/examples/passing/helper_method_example.rb +14 -0
  36. data/examples/passing/io_processor.rb +8 -0
  37. data/examples/passing/io_processor_spec.rb +21 -0
  38. data/examples/passing/legacy_spec.rb +11 -0
  39. data/examples/passing/mocking_example.rb +27 -0
  40. data/examples/passing/multi_threaded_example_group_runner.rb +26 -0
  41. data/examples/passing/nested_classes_example.rb +36 -0
  42. data/examples/passing/partial_mock_example.rb +29 -0
  43. data/examples/passing/pending_example.rb +20 -0
  44. data/examples/passing/predicate_example.rb +27 -0
  45. data/examples/passing/priority.txt +1 -0
  46. data/examples/passing/shared_example_group_example.rb +81 -0
  47. data/examples/passing/shared_stack_examples.rb +36 -0
  48. data/examples/passing/simple_matcher_example.rb +31 -0
  49. data/examples/passing/spec_helper.rb +3 -0
  50. data/examples/passing/stack.rb +36 -0
  51. data/examples/passing/stack_spec.rb +64 -0
  52. data/examples/passing/stack_spec_with_nested_example_groups.rb +67 -0
  53. data/examples/passing/stubbing_example.rb +69 -0
  54. data/examples/passing/yielding_example.rb +33 -0
  55. data/examples/ruby1.9.compatibility/access_to_constants_spec.rb +86 -0
  56. data/features/before_and_after_blocks/before_and_after_blocks.feature +168 -0
  57. data/features/example_groups/autogenerated_docstrings.feature +45 -0
  58. data/features/example_groups/example_group_with_should_methods.feature +17 -0
  59. data/features/example_groups/nested_groups.feature +17 -0
  60. data/features/example_groups/output.feature +20 -0
  61. data/features/interop/examples_and_tests_together.feature +31 -0
  62. data/features/interop/test_but_not_test_unit.feature +14 -0
  63. data/features/interop/test_case_with_should_methods.feature +17 -0
  64. data/features/mock_framework_integration/use_flexmock.feature +27 -0
  65. data/features/step_definitions/running_rspec.rb +54 -0
  66. data/features/support/env.rb +26 -0
  67. data/features/support/helpers/cmdline.rb +9 -0
  68. data/features/support/matchers/smart_match.rb +37 -0
  69. data/init.rb +9 -0
  70. data/lib/adapters/mock_frameworks/flexmock.rb +24 -0
  71. data/lib/adapters/mock_frameworks/mocha.rb +20 -0
  72. data/lib/adapters/mock_frameworks/rr.rb +22 -0
  73. data/lib/adapters/mock_frameworks/rspec.rb +20 -0
  74. data/lib/autotest/discover.rb +3 -0
  75. data/lib/autotest/rspec.rb +47 -0
  76. data/lib/spec/dsl/main.rb +87 -0
  77. data/lib/spec/dsl.rb +1 -0
  78. data/lib/spec/example/before_and_after_hooks.rb +99 -0
  79. data/lib/spec/example/errors.rb +30 -0
  80. data/lib/spec/example/example_group.rb +26 -0
  81. data/lib/spec/example/example_group_factory.rb +98 -0
  82. data/lib/spec/example/example_group_methods.rb +376 -0
  83. data/lib/spec/example/example_matcher.rb +44 -0
  84. data/lib/spec/example/example_methods.rb +137 -0
  85. data/lib/spec/example/module_reopening_fix.rb +21 -0
  86. data/lib/spec/example/pending.rb +18 -0
  87. data/lib/spec/example/shared_example_group.rb +59 -0
  88. data/lib/spec/example.rb +187 -0
  89. data/lib/spec/expectations/differs/default.rb +66 -0
  90. data/lib/spec/expectations/errors.rb +12 -0
  91. data/lib/spec/expectations/extensions/object.rb +63 -0
  92. data/lib/spec/expectations/extensions/string_and_symbol.rb +17 -0
  93. data/lib/spec/expectations/extensions.rb +2 -0
  94. data/lib/spec/expectations/handler.rb +32 -0
  95. data/lib/spec/expectations.rb +60 -0
  96. data/lib/spec/interop/test/unit/autorunner.rb +6 -0
  97. data/lib/spec/interop/test/unit/testcase.rb +73 -0
  98. data/lib/spec/interop/test/unit/testresult.rb +6 -0
  99. data/lib/spec/interop/test/unit/testsuite_adapter.rb +34 -0
  100. data/lib/spec/interop/test/unit/ui/console/testrunner.rb +61 -0
  101. data/lib/spec/interop/test.rb +12 -0
  102. data/lib/spec/matchers/be.rb +208 -0
  103. data/lib/spec/matchers/be_close.rb +21 -0
  104. data/lib/spec/matchers/change.rb +148 -0
  105. data/lib/spec/matchers/eql.rb +25 -0
  106. data/lib/spec/matchers/equal.rb +25 -0
  107. data/lib/spec/matchers/errors.rb +5 -0
  108. data/lib/spec/matchers/exist.rb +16 -0
  109. data/lib/spec/matchers/generated_descriptions.rb +48 -0
  110. data/lib/spec/matchers/has.rb +15 -0
  111. data/lib/spec/matchers/have.rb +150 -0
  112. data/lib/spec/matchers/include.rb +80 -0
  113. data/lib/spec/matchers/match.rb +22 -0
  114. data/lib/spec/matchers/match_array.rb +79 -0
  115. data/lib/spec/matchers/method_missing.rb +9 -0
  116. data/lib/spec/matchers/operator_matcher.rb +70 -0
  117. data/lib/spec/matchers/raise_error.rb +128 -0
  118. data/lib/spec/matchers/respond_to.rb +71 -0
  119. data/lib/spec/matchers/satisfy.rb +47 -0
  120. data/lib/spec/matchers/simple_matcher.rb +132 -0
  121. data/lib/spec/matchers/throw_symbol.rb +106 -0
  122. data/lib/spec/matchers/wrap_expectation.rb +55 -0
  123. data/lib/spec/matchers.rb +141 -0
  124. data/lib/spec/mocks/argument_expectation.rb +49 -0
  125. data/lib/spec/mocks/argument_matchers.rb +237 -0
  126. data/lib/spec/mocks/error_generator.rb +82 -0
  127. data/lib/spec/mocks/errors.rb +10 -0
  128. data/lib/spec/mocks/extensions/object.rb +3 -0
  129. data/lib/spec/mocks/extensions.rb +1 -0
  130. data/lib/spec/mocks/framework.rb +15 -0
  131. data/lib/spec/mocks/message_expectation.rb +331 -0
  132. data/lib/spec/mocks/methods.rb +51 -0
  133. data/lib/spec/mocks/mock.rb +55 -0
  134. data/lib/spec/mocks/order_group.rb +29 -0
  135. data/lib/spec/mocks/proxy.rb +230 -0
  136. data/lib/spec/mocks/space.rb +28 -0
  137. data/lib/spec/mocks/spec_methods.rb +55 -0
  138. data/lib/spec/mocks.rb +200 -0
  139. data/lib/spec/rake/spectask.rb +225 -0
  140. data/lib/spec/rake/verify_rcov.rb +52 -0
  141. data/lib/spec/ruby.rb +9 -0
  142. data/lib/spec/runner/backtrace_tweaker.rb +58 -0
  143. data/lib/spec/runner/class_and_arguments_parser.rb +14 -0
  144. data/lib/spec/runner/command_line.rb +35 -0
  145. data/lib/spec/runner/configuration.rb +166 -0
  146. data/lib/spec/runner/drb_command_line.rb +20 -0
  147. data/lib/spec/runner/example_group_runner.rb +70 -0
  148. data/lib/spec/runner/formatter/base_formatter.rb +79 -0
  149. data/lib/spec/runner/formatter/base_text_formatter.rb +127 -0
  150. data/lib/spec/runner/formatter/failing_example_groups_formatter.rb +27 -0
  151. data/lib/spec/runner/formatter/failing_examples_formatter.rb +20 -0
  152. data/lib/spec/runner/formatter/html_formatter.rb +340 -0
  153. data/lib/spec/runner/formatter/nested_text_formatter.rb +65 -0
  154. data/lib/spec/runner/formatter/profile_formatter.rb +51 -0
  155. data/lib/spec/runner/formatter/progress_bar_formatter.rb +34 -0
  156. data/lib/spec/runner/formatter/snippet_extractor.rb +52 -0
  157. data/lib/spec/runner/formatter/specdoc_formatter.rb +39 -0
  158. data/lib/spec/runner/formatter/text_mate_formatter.rb +16 -0
  159. data/lib/spec/runner/heckle_runner.rb +74 -0
  160. data/lib/spec/runner/heckle_runner_unsupported.rb +10 -0
  161. data/lib/spec/runner/option_parser.rb +204 -0
  162. data/lib/spec/runner/options.rb +320 -0
  163. data/lib/spec/runner/reporter.rb +167 -0
  164. data/lib/spec/runner/spec_parser.rb +73 -0
  165. data/lib/spec/runner.rb +88 -0
  166. data/lib/spec/version.rb +15 -0
  167. data/lib/spec.rb +7 -0
  168. data/resources/rake/examples.rake +7 -0
  169. data/resources/rake/examples_with_rcov.rake +9 -0
  170. data/resources/rake/failing_examples_with_html.rake +9 -0
  171. data/resources/rake/verify_rcov.rake +7 -0
  172. data/resources/spec/example_group_with_should_methods.rb +12 -0
  173. data/resources/spec/simple_spec.rb +8 -0
  174. data/resources/test/spec_and_test_together.rb +57 -0
  175. data/resources/test/spec_including_test_but_not_unit.rb +11 -0
  176. data/resources/test/test_case_with_should_methods.rb +30 -0
  177. data/rspec.gemspec +32 -0
  178. data/spec/README.jruby +15 -0
  179. data/spec/autotest/autotest_helper.rb +6 -0
  180. data/spec/autotest/autotest_matchers.rb +47 -0
  181. data/spec/autotest/discover_spec.rb +8 -0
  182. data/spec/autotest/failed_results_re_spec.rb +24 -0
  183. data/spec/autotest/rspec_spec.rb +114 -0
  184. data/spec/rspec_suite.rb +6 -0
  185. data/spec/ruby_forker.rb +13 -0
  186. data/spec/spec/dsl/main_spec.rb +88 -0
  187. data/spec/spec/example/example_group_class_definition_spec.rb +49 -0
  188. data/spec/spec/example/example_group_factory_spec.rb +224 -0
  189. data/spec/spec/example/example_group_methods_spec.rb +653 -0
  190. data/spec/spec/example/example_group_spec.rb +661 -0
  191. data/spec/spec/example/example_matcher_spec.rb +79 -0
  192. data/spec/spec/example/example_methods_spec.rb +204 -0
  193. data/spec/spec/example/helper_method_spec.rb +24 -0
  194. data/spec/spec/example/nested_example_group_spec.rb +71 -0
  195. data/spec/spec/example/pending_module_spec.rb +139 -0
  196. data/spec/spec/example/predicate_matcher_spec.rb +21 -0
  197. data/spec/spec/example/shared_example_group_spec.rb +257 -0
  198. data/spec/spec/example/subclassing_example_group_spec.rb +25 -0
  199. data/spec/spec/expectations/differs/default_spec.rb +127 -0
  200. data/spec/spec/expectations/extensions/object_spec.rb +45 -0
  201. data/spec/spec/expectations/fail_with_spec.rb +71 -0
  202. data/spec/spec/expectations/wrap_expectation_spec.rb +30 -0
  203. data/spec/spec/interop/test/unit/resources/spec_that_fails.rb +10 -0
  204. data/spec/spec/interop/test/unit/resources/spec_that_passes.rb +10 -0
  205. data/spec/spec/interop/test/unit/resources/spec_with_errors.rb +10 -0
  206. data/spec/spec/interop/test/unit/resources/spec_with_options_hash.rb +13 -0
  207. data/spec/spec/interop/test/unit/resources/test_case_that_fails.rb +10 -0
  208. data/spec/spec/interop/test/unit/resources/test_case_that_passes.rb +10 -0
  209. data/spec/spec/interop/test/unit/resources/test_case_with_errors.rb +10 -0
  210. data/spec/spec/interop/test/unit/resources/testsuite_adapter_spec_with_test_unit.rb +38 -0
  211. data/spec/spec/interop/test/unit/spec_spec.rb +48 -0
  212. data/spec/spec/interop/test/unit/test_unit_spec_helper.rb +18 -0
  213. data/spec/spec/interop/test/unit/testcase_spec.rb +49 -0
  214. data/spec/spec/interop/test/unit/testsuite_adapter_spec.rb +9 -0
  215. data/spec/spec/matchers/be_close_spec.rb +41 -0
  216. data/spec/spec/matchers/be_spec.rb +303 -0
  217. data/spec/spec/matchers/change_spec.rb +329 -0
  218. data/spec/spec/matchers/description_generation_spec.rb +172 -0
  219. data/spec/spec/matchers/eql_spec.rb +29 -0
  220. data/spec/spec/matchers/equal_spec.rb +29 -0
  221. data/spec/spec/matchers/exist_spec.rb +57 -0
  222. data/spec/spec/matchers/handler_spec.rb +111 -0
  223. data/spec/spec/matchers/has_spec.rb +63 -0
  224. data/spec/spec/matchers/have_spec.rb +399 -0
  225. data/spec/spec/matchers/include_spec.rb +88 -0
  226. data/spec/spec/matchers/match_array_spec.rb +83 -0
  227. data/spec/spec/matchers/match_spec.rb +37 -0
  228. data/spec/spec/matchers/matcher_methods_spec.rb +66 -0
  229. data/spec/spec/matchers/operator_matcher_spec.rb +191 -0
  230. data/spec/spec/matchers/raise_error_spec.rb +333 -0
  231. data/spec/spec/matchers/respond_to_spec.rb +116 -0
  232. data/spec/spec/matchers/satisfy_spec.rb +36 -0
  233. data/spec/spec/matchers/simple_matcher_spec.rb +93 -0
  234. data/spec/spec/matchers/throw_symbol_spec.rb +96 -0
  235. data/spec/spec/mocks/any_number_of_times_spec.rb +36 -0
  236. data/spec/spec/mocks/argument_expectation_spec.rb +23 -0
  237. data/spec/spec/mocks/at_least_spec.rb +97 -0
  238. data/spec/spec/mocks/at_most_spec.rb +93 -0
  239. data/spec/spec/mocks/bug_report_10260_spec.rb +8 -0
  240. data/spec/spec/mocks/bug_report_10263_spec.rb +24 -0
  241. data/spec/spec/mocks/bug_report_11545_spec.rb +32 -0
  242. data/spec/spec/mocks/bug_report_15719_spec.rb +30 -0
  243. data/spec/spec/mocks/bug_report_496.rb +19 -0
  244. data/spec/spec/mocks/bug_report_600_spec.rb +22 -0
  245. data/spec/spec/mocks/bug_report_7611_spec.rb +19 -0
  246. data/spec/spec/mocks/bug_report_7805_spec.rb +22 -0
  247. data/spec/spec/mocks/bug_report_8165_spec.rb +31 -0
  248. data/spec/spec/mocks/bug_report_8302_spec.rb +26 -0
  249. data/spec/spec/mocks/failing_argument_matchers_spec.rb +95 -0
  250. data/spec/spec/mocks/hash_including_matcher_spec.rb +90 -0
  251. data/spec/spec/mocks/hash_not_including_matcher_spec.rb +67 -0
  252. data/spec/spec/mocks/mock_ordering_spec.rb +84 -0
  253. data/spec/spec/mocks/mock_space_spec.rb +54 -0
  254. data/spec/spec/mocks/mock_spec.rb +579 -0
  255. data/spec/spec/mocks/multiple_return_value_spec.rb +113 -0
  256. data/spec/spec/mocks/nil_expectation_warning_spec.rb +53 -0
  257. data/spec/spec/mocks/null_object_mock_spec.rb +54 -0
  258. data/spec/spec/mocks/once_counts_spec.rb +53 -0
  259. data/spec/spec/mocks/options_hash_spec.rb +35 -0
  260. data/spec/spec/mocks/partial_mock_spec.rb +149 -0
  261. data/spec/spec/mocks/partial_mock_using_mocks_directly_spec.rb +66 -0
  262. data/spec/spec/mocks/passing_argument_matchers_spec.rb +145 -0
  263. data/spec/spec/mocks/precise_counts_spec.rb +52 -0
  264. data/spec/spec/mocks/record_messages_spec.rb +26 -0
  265. data/spec/spec/mocks/stub_spec.rb +194 -0
  266. data/spec/spec/mocks/stubbed_message_expectations_spec.rb +14 -0
  267. data/spec/spec/mocks/twice_counts_spec.rb +67 -0
  268. data/spec/spec/package/bin_spec_spec.rb +22 -0
  269. data/spec/spec/runner/class_and_argument_parser_spec.rb +23 -0
  270. data/spec/spec/runner/command_line_spec.rb +141 -0
  271. data/spec/spec/runner/configuration_spec.rb +301 -0
  272. data/spec/spec/runner/drb_command_line_spec.rb +97 -0
  273. data/spec/spec/runner/empty_file.txt +0 -0
  274. data/spec/spec/runner/example_group_runner_spec.rb +33 -0
  275. data/spec/spec/runner/examples.txt +2 -0
  276. data/spec/spec/runner/failed.txt +3 -0
  277. data/spec/spec/runner/formatter/base_formatter_spec.rb +23 -0
  278. data/spec/spec/runner/formatter/base_text_formatter_spec.rb +23 -0
  279. data/spec/spec/runner/formatter/failing_example_groups_formatter_spec.rb +45 -0
  280. data/spec/spec/runner/formatter/failing_examples_formatter_spec.rb +33 -0
  281. data/spec/spec/runner/formatter/html_formatted-1.8.4.html +365 -0
  282. data/spec/spec/runner/formatter/html_formatted-1.8.5-jruby.html +387 -0
  283. data/spec/spec/runner/formatter/html_formatted-1.8.5.html +371 -0
  284. data/spec/spec/runner/formatter/html_formatted-1.8.6-jruby.html +381 -0
  285. data/spec/spec/runner/formatter/html_formatted-1.8.6.html +379 -0
  286. data/spec/spec/runner/formatter/html_formatted-1.8.7.html +379 -0
  287. data/spec/spec/runner/formatter/html_formatted-1.9.1.html +379 -0
  288. data/spec/spec/runner/formatter/html_formatter_spec.rb +62 -0
  289. data/spec/spec/runner/formatter/nested_text_formatter_spec.rb +318 -0
  290. data/spec/spec/runner/formatter/profile_formatter_spec.rb +65 -0
  291. data/spec/spec/runner/formatter/progress_bar_formatter_spec.rb +145 -0
  292. data/spec/spec/runner/formatter/snippet_extractor_spec.rb +18 -0
  293. data/spec/spec/runner/formatter/spec_mate_formatter_spec.rb +104 -0
  294. data/spec/spec/runner/formatter/specdoc_formatter_spec.rb +159 -0
  295. data/spec/spec/runner/formatter/text_mate_formatted-1.8.4.html +365 -0
  296. data/spec/spec/runner/formatter/text_mate_formatted-1.8.6.html +373 -0
  297. data/spec/spec/runner/formatter/text_mate_formatted-1.8.7.html +373 -0
  298. data/spec/spec/runner/formatter/text_mate_formatted-1.9.1.html +373 -0
  299. data/spec/spec/runner/heckle_runner_spec.rb +78 -0
  300. data/spec/spec/runner/heckler_spec.rb +20 -0
  301. data/spec/spec/runner/noisy_backtrace_tweaker_spec.rb +45 -0
  302. data/spec/spec/runner/option_parser_spec.rb +396 -0
  303. data/spec/spec/runner/options_spec.rb +469 -0
  304. data/spec/spec/runner/output_one_time_fixture.rb +7 -0
  305. data/spec/spec/runner/output_one_time_fixture_runner.rb +8 -0
  306. data/spec/spec/runner/output_one_time_spec.rb +16 -0
  307. data/spec/spec/runner/quiet_backtrace_tweaker_spec.rb +62 -0
  308. data/spec/spec/runner/reporter_spec.rb +238 -0
  309. data/spec/spec/runner/resources/a_bar.rb +0 -0
  310. data/spec/spec/runner/resources/a_foo.rb +0 -0
  311. data/spec/spec/runner/resources/a_spec.rb +1 -0
  312. data/spec/spec/runner/resources/custom_example_group_runner.rb +14 -0
  313. data/spec/spec/runner/resources/utf8_encoded.rb +7 -0
  314. data/spec/spec/runner/spec.opts +2 -0
  315. data/spec/spec/runner/spec_drb.opts +1 -0
  316. data/spec/spec/runner/spec_parser/spec_parser_fixture.rb +70 -0
  317. data/spec/spec/runner/spec_parser_spec.rb +91 -0
  318. data/spec/spec/runner/spec_spaced.opts +2 -0
  319. data/spec/spec/runner_spec.rb +11 -0
  320. data/spec/spec/spec_classes.rb +133 -0
  321. data/spec/spec/spec_spec.rb +21 -0
  322. data/spec/spec.opts +6 -0
  323. data/spec/spec_helper.rb +107 -0
  324. metadata +388 -0
@@ -0,0 +1,579 @@
1
+ require File.dirname(__FILE__) + '/../../spec_helper'
2
+
3
+ module Spec
4
+ module Mocks
5
+ describe Mock do
6
+ before(:each) do
7
+ @mock = mock("test mock")
8
+ end
9
+
10
+ after(:each) do
11
+ @mock.rspec_reset
12
+ end
13
+
14
+ describe "deprecated #stub_everything method" do
15
+ before(:each) do
16
+ Kernel.stub!(:warn)
17
+ end
18
+
19
+ it "creates a mock that behaves as a null object" do
20
+ stub_everything.should be_null_object
21
+ end
22
+
23
+ it "provides deprecation warning" do
24
+ Kernel.should_receive(:warn).with(/DEPRECATION: stub_everything.* is deprecated./)
25
+ stub_everything
26
+ end
27
+ end
28
+
29
+ it "should report line number of expectation of unreceived message" do
30
+ expected_error_line = __LINE__; @mock.should_receive(:wont_happen).with("x", 3)
31
+ begin
32
+ @mock.rspec_verify
33
+ violated
34
+ rescue MockExpectationError => e
35
+ # NOTE - this regexp ended w/ $, but jruby adds extra info at the end of the line
36
+ e.backtrace[0].should match(/#{File.basename(__FILE__)}:#{expected_error_line}/)
37
+ end
38
+ end
39
+
40
+ it "should report line number of expectation of unreceived message after #should_receive after similar stub" do
41
+ @mock.stub!(:wont_happen)
42
+ expected_error_line = __LINE__; @mock.should_receive(:wont_happen).with("x", 3)
43
+ begin
44
+ @mock.rspec_verify
45
+ violated
46
+ rescue MockExpectationError => e
47
+ # NOTE - this regexp ended w/ $, but jruby adds extra info at the end of the line
48
+ e.backtrace[0].should match(/#{File.basename(__FILE__)}:#{expected_error_line}/)
49
+ end
50
+ end
51
+
52
+ it "should pass when not receiving message specified as not to be received" do
53
+ @mock.should_not_receive(:not_expected)
54
+ @mock.rspec_verify
55
+ end
56
+
57
+ it "should pass when receiving message specified as not to be received with different args" do
58
+ @mock.should_not_receive(:message).with("unwanted text")
59
+ @mock.should_receive(:message).with("other text")
60
+ @mock.message "other text"
61
+ @mock.rspec_verify
62
+ end
63
+
64
+ it "should fail when receiving message specified as not to be received" do
65
+ @mock.should_not_receive(:not_expected)
66
+ lambda {
67
+ @mock.not_expected
68
+ violated
69
+ }.should raise_error(MockExpectationError, "Mock 'test mock' expected :not_expected with (no args) 0 times, but received it once")
70
+ end
71
+
72
+ it "should fail when receiving message specified as not to be received with args" do
73
+ @mock.should_not_receive(:not_expected).with("unexpected text")
74
+ lambda {
75
+ @mock.not_expected("unexpected text")
76
+ violated
77
+ }.should raise_error(MockExpectationError, "Mock 'test mock' expected :not_expected with (\"unexpected text\") 0 times, but received it once")
78
+ end
79
+
80
+ it "should pass when receiving message specified as not to be received with wrong args" do
81
+ @mock.should_not_receive(:not_expected).with("unexpected text")
82
+ @mock.not_expected "really unexpected text"
83
+ @mock.rspec_verify
84
+ end
85
+
86
+ it "should allow block to calculate return values" do
87
+ @mock.should_receive(:something).with("a","b","c").and_return { |a,b,c| c+b+a }
88
+ @mock.something("a","b","c").should == "cba"
89
+ @mock.rspec_verify
90
+ end
91
+
92
+ it "should allow parameter as return value" do
93
+ @mock.should_receive(:something).with("a","b","c").and_return("booh")
94
+ @mock.something("a","b","c").should == "booh"
95
+ @mock.rspec_verify
96
+ end
97
+
98
+ it "should return nil if no return value set" do
99
+ @mock.should_receive(:something).with("a","b","c")
100
+ @mock.something("a","b","c").should be_nil
101
+ @mock.rspec_verify
102
+ end
103
+
104
+ it "should raise exception if args don't match when method called" do
105
+ @mock.should_receive(:something).with("a","b","c").and_return("booh")
106
+ lambda {
107
+ @mock.something("a","d","c")
108
+ violated
109
+ }.should raise_error(MockExpectationError, "Mock 'test mock' expected :something with (\"a\", \"b\", \"c\") but received it with (\"a\", \"d\", \"c\")")
110
+ end
111
+
112
+ it "should raise exception if args don't match when method called even when the method is stubbed" do
113
+ @mock.stub!(:something)
114
+ @mock.should_receive(:something).with("a","b","c")
115
+ lambda {
116
+ @mock.something("a","d","c")
117
+ @mock.rspec_verify
118
+ }.should raise_error(MockExpectationError, "Mock 'test mock' expected :something with (\"a\", \"b\", \"c\") but received it with (\"a\", \"d\", \"c\")")
119
+ end
120
+
121
+ it "should raise exception if args don't match when method called even when using null_object" do
122
+ @mock = mock("test mock", :null_object => true)
123
+ @mock.should_receive(:something).with("a","b","c")
124
+ lambda {
125
+ @mock.something("a","d","c")
126
+ @mock.rspec_verify
127
+ }.should raise_error(MockExpectationError, "Mock 'test mock' expected :something with (\"a\", \"b\", \"c\") but received it with (\"a\", \"d\", \"c\")")
128
+ end
129
+
130
+ it "should fail if unexpected method called" do
131
+ lambda {
132
+ @mock.something("a","b","c")
133
+ violated
134
+ }.should raise_error(MockExpectationError, "Mock 'test mock' received unexpected message :something with (\"a\", \"b\", \"c\")")
135
+ end
136
+
137
+ it "should use block for expectation if provided" do
138
+ @mock.should_receive(:something) do | a, b |
139
+ a.should == "a"
140
+ b.should == "b"
141
+ "booh"
142
+ end
143
+ @mock.something("a", "b").should == "booh"
144
+ @mock.rspec_verify
145
+ end
146
+
147
+ it "should fail if expectation block fails" do
148
+ @mock.should_receive(:something) {| bool | bool.should be_true}
149
+ lambda {
150
+ @mock.something false
151
+ }.should raise_error(MockExpectationError, /Mock 'test mock' received :something but passed block failed with: expected true, got false/)
152
+ end
153
+
154
+ it "should fail right away when method defined as never is received" do
155
+ @mock.should_receive(:not_expected).never
156
+ lambda {
157
+ @mock.not_expected
158
+ }.should raise_error(MockExpectationError, "Mock 'test mock' expected :not_expected with (no args) 0 times, but received it once")
159
+ end
160
+
161
+ it "should eventually fail when method defined as never is received" do
162
+ @mock.should_receive(:not_expected).never
163
+ lambda {
164
+ @mock.not_expected
165
+ }.should raise_error(MockExpectationError, "Mock 'test mock' expected :not_expected with (no args) 0 times, but received it once")
166
+ end
167
+
168
+ it "should raise when told to" do
169
+ @mock.should_receive(:something).and_raise(RuntimeError)
170
+ lambda do
171
+ @mock.something
172
+ end.should raise_error(RuntimeError)
173
+ end
174
+
175
+ it "should raise passed an Exception instance" do
176
+ error = RuntimeError.new("error message")
177
+ @mock.should_receive(:something).and_raise(error)
178
+ lambda {
179
+ @mock.something
180
+ }.should raise_error(RuntimeError, "error message")
181
+ end
182
+
183
+ it "should raise RuntimeError with passed message" do
184
+ @mock.should_receive(:something).and_raise("error message")
185
+ lambda {
186
+ @mock.something
187
+ }.should raise_error(RuntimeError, "error message")
188
+ end
189
+
190
+ it "should not raise when told to if args dont match" do
191
+ @mock.should_receive(:something).with(2).and_raise(RuntimeError)
192
+ lambda {
193
+ @mock.something 1
194
+ }.should raise_error(MockExpectationError)
195
+ end
196
+
197
+ it "should throw when told to" do
198
+ @mock.should_receive(:something).and_throw(:blech)
199
+ lambda {
200
+ @mock.something
201
+ }.should throw_symbol(:blech)
202
+ end
203
+
204
+ it "should raise when explicit return and block constrained" do
205
+ lambda {
206
+ @mock.should_receive(:fruit) do |colour|
207
+ :strawberry
208
+ end.and_return :apple
209
+ }.should raise_error(AmbiguousReturnError)
210
+ end
211
+
212
+ it "should ignore args on any args" do
213
+ @mock.should_receive(:something).at_least(:once).with(any_args)
214
+ @mock.something
215
+ @mock.something 1
216
+ @mock.something "a", 2
217
+ @mock.something [], {}, "joe", 7
218
+ @mock.rspec_verify
219
+ end
220
+
221
+ it "should fail on no args if any args received" do
222
+ @mock.should_receive(:something).with(no_args())
223
+ lambda {
224
+ @mock.something 1
225
+ }.should raise_error(MockExpectationError, "Mock 'test mock' expected :something with (no args) but received it with (1)")
226
+ end
227
+
228
+ it "should fail when args are expected but none are received" do
229
+ @mock.should_receive(:something).with(1)
230
+ lambda {
231
+ @mock.something
232
+ }.should raise_error(MockExpectationError, "Mock 'test mock' expected :something with (1) but received it with (no args)")
233
+ end
234
+
235
+ it "should return value from block by default" do
236
+ @mock.stub!(:method_that_yields).and_yield
237
+ @mock.method_that_yields { :returned_obj }.should == :returned_obj
238
+ @mock.rspec_verify
239
+ end
240
+
241
+ it "should yield 0 args to blocks that take a variable number of arguments" do
242
+ @mock.should_receive(:yield_back).with(no_args()).once.and_yield
243
+ a = nil
244
+ @mock.yield_back {|*x| a = x}
245
+ a.should == []
246
+ @mock.rspec_verify
247
+ end
248
+
249
+ it "should yield 0 args multiple times to blocks that take a variable number of arguments" do
250
+ @mock.should_receive(:yield_back).once.with(no_args()).once.and_yield.
251
+ and_yield
252
+ a = nil
253
+ b = []
254
+ @mock.yield_back {|*a| b << a}
255
+ b.should == [ [], [] ]
256
+ @mock.rspec_verify
257
+ end
258
+
259
+ it "should yield one arg to blocks that take a variable number of arguments" do
260
+ @mock.should_receive(:yield_back).with(no_args()).once.and_yield(99)
261
+ a = nil
262
+ @mock.yield_back {|*x| a = x}
263
+ a.should == [99]
264
+ @mock.rspec_verify
265
+ end
266
+
267
+ it "should yield one arg 3 times consecutively to blocks that take a variable number of arguments" do
268
+ @mock.should_receive(:yield_back).once.with(no_args()).once.and_yield(99).
269
+ and_yield(43).
270
+ and_yield("something fruity")
271
+ a = nil
272
+ b = []
273
+ @mock.yield_back {|*a| b << a}
274
+ b.should == [[99], [43], ["something fruity"]]
275
+ @mock.rspec_verify
276
+ end
277
+
278
+ it "should yield many args to blocks that take a variable number of arguments" do
279
+ @mock.should_receive(:yield_back).with(no_args()).once.and_yield(99, 27, "go")
280
+ a = nil
281
+ @mock.yield_back {|*x| a = x}
282
+ a.should == [99, 27, "go"]
283
+ @mock.rspec_verify
284
+ end
285
+
286
+ it "should yield many args 3 times consecutively to blocks that take a variable number of arguments" do
287
+ @mock.should_receive(:yield_back).once.with(no_args()).once.and_yield(99, :green, "go").
288
+ and_yield("wait", :amber).
289
+ and_yield("stop", 12, :red)
290
+ a = nil
291
+ b = []
292
+ @mock.yield_back {|*a| b << a}
293
+ b.should == [[99, :green, "go"], ["wait", :amber], ["stop", 12, :red]]
294
+ @mock.rspec_verify
295
+ end
296
+
297
+ it "should yield single value" do
298
+ @mock.should_receive(:yield_back).with(no_args()).once.and_yield(99)
299
+ a = nil
300
+ @mock.yield_back {|x| a = x}
301
+ a.should == 99
302
+ @mock.rspec_verify
303
+ end
304
+
305
+ it "should yield single value 3 times consecutively" do
306
+ @mock.should_receive(:yield_back).once.with(no_args()).once.and_yield(99).
307
+ and_yield(43).
308
+ and_yield("something fruity")
309
+ a = nil
310
+ b = []
311
+ @mock.yield_back {|a| b << a}
312
+ b.should == [99, 43, "something fruity"]
313
+ @mock.rspec_verify
314
+ end
315
+
316
+ it "should yield two values" do
317
+ @mock.should_receive(:yield_back).with(no_args()).once.and_yield('wha', 'zup')
318
+ a, b = nil
319
+ @mock.yield_back {|x,y| a=x; b=y}
320
+ a.should == 'wha'
321
+ b.should == 'zup'
322
+ @mock.rspec_verify
323
+ end
324
+
325
+ it "should yield two values 3 times consecutively" do
326
+ @mock.should_receive(:yield_back).once.with(no_args()).once.and_yield('wha', 'zup').
327
+ and_yield('not', 'down').
328
+ and_yield(14, 65)
329
+ a, b = nil
330
+ c = []
331
+ @mock.yield_back {|a,b| c << [a, b]}
332
+ c.should == [['wha', 'zup'], ['not', 'down'], [14, 65]]
333
+ @mock.rspec_verify
334
+ end
335
+
336
+ it "should fail when calling yielding method with wrong arity" do
337
+ @mock.should_receive(:yield_back).with(no_args()).once.and_yield('wha', 'zup')
338
+ lambda {
339
+ @mock.yield_back {|a|}
340
+ }.should raise_error(MockExpectationError, "Mock 'test mock' yielded |\"wha\", \"zup\"| to block with arity of 1")
341
+ end
342
+
343
+ it "should fail when calling yielding method consecutively with wrong arity" do
344
+ @mock.should_receive(:yield_back).once.with(no_args()).once.and_yield('wha', 'zup').
345
+ and_yield('down').
346
+ and_yield(14, 65)
347
+ lambda {
348
+ a, b = nil
349
+ c = []
350
+ @mock.yield_back {|a,b| c << [a, b]}
351
+ }.should raise_error(MockExpectationError, "Mock 'test mock' yielded |\"down\"| to block with arity of 2")
352
+ end
353
+
354
+ it "should fail when calling yielding method without block" do
355
+ @mock.should_receive(:yield_back).with(no_args()).once.and_yield('wha', 'zup')
356
+ lambda {
357
+ @mock.yield_back
358
+ }.should raise_error(MockExpectationError, "Mock 'test mock' asked to yield |[\"wha\", \"zup\"]| but no block was passed")
359
+ end
360
+
361
+ it "should be able to mock send" do
362
+ @mock.should_receive(:send).with(any_args)
363
+ @mock.send 'hi'
364
+ @mock.rspec_verify
365
+ end
366
+
367
+ it "should be able to raise from method calling yielding mock" do
368
+ @mock.should_receive(:yield_me).and_yield 44
369
+
370
+ lambda {
371
+ @mock.yield_me do |x|
372
+ raise "Bang"
373
+ end
374
+ }.should raise_error(StandardError, "Bang")
375
+
376
+ @mock.rspec_verify
377
+ end
378
+
379
+ it "should clear expectations after verify" do
380
+ @mock.should_receive(:foobar)
381
+ @mock.foobar
382
+ @mock.rspec_verify
383
+ lambda {
384
+ @mock.foobar
385
+ }.should raise_error(MockExpectationError, "Mock 'test mock' received unexpected message :foobar with (no args)")
386
+ end
387
+
388
+ it "should restore objects to their original state on rspec_reset" do
389
+ mock = mock("this is a mock")
390
+ mock.should_receive(:blah)
391
+ mock.rspec_reset
392
+ mock.rspec_verify #should throw if reset didn't work
393
+ end
394
+
395
+ it "should work even after method_missing starts raising NameErrors instead of NoMethodErrors" do
396
+ # Object#method_missing throws either NameErrors or NoMethodErrors.
397
+ #
398
+ # On a fresh ruby program Object#method_missing:
399
+ # * raises a NoMethodError when called directly
400
+ # * raises a NameError when called indirectly
401
+ #
402
+ # Once Object#method_missing has been called at least once (on any object)
403
+ # it starts behaving differently:
404
+ # * raises a NameError when called directly
405
+ # * raises a NameError when called indirectly
406
+ #
407
+ # There was a bug in Mock#method_missing that relied on the fact
408
+ # that calling Object#method_missing directly raises a NoMethodError.
409
+ # This example tests that the bug doesn't exist anymore.
410
+
411
+
412
+ # Ensures that method_missing always raises NameErrors.
413
+ a_method_that_doesnt_exist rescue
414
+
415
+
416
+ @mock.should_receive(:foobar)
417
+ @mock.foobar
418
+ @mock.rspec_verify
419
+
420
+ lambda { @mock.foobar }.should_not raise_error(NameError)
421
+ lambda { @mock.foobar }.should raise_error(MockExpectationError)
422
+ end
423
+
424
+ it "should temporarily replace a method stub on a mock" do
425
+ @mock.stub!(:msg).and_return(:stub_value)
426
+ @mock.should_receive(:msg).with(:arg).and_return(:mock_value)
427
+ @mock.msg(:arg).should equal(:mock_value)
428
+ @mock.msg.should equal(:stub_value)
429
+ @mock.msg.should equal(:stub_value)
430
+ @mock.rspec_verify
431
+ end
432
+
433
+ it "should not require a different signature to replace a method stub" do
434
+ @mock.stub!(:msg).and_return(:stub_value)
435
+ @mock.should_receive(:msg).and_return(:mock_value)
436
+ @mock.msg(:arg).should equal(:mock_value)
437
+ @mock.msg.should equal(:stub_value)
438
+ @mock.msg.should equal(:stub_value)
439
+ @mock.rspec_verify
440
+ end
441
+
442
+ it "should raise an error when a previously stubbed method has a negative expectation" do
443
+ @mock.stub!(:msg).and_return(:stub_value)
444
+ @mock.should_not_receive(:msg).and_return(:mock_value)
445
+ lambda {@mock.msg(:arg)}.should raise_error(MockExpectationError)
446
+ end
447
+
448
+ it "should temporarily replace a method stub on a non-mock" do
449
+ non_mock = Object.new
450
+ non_mock.stub!(:msg).and_return(:stub_value)
451
+ non_mock.should_receive(:msg).with(:arg).and_return(:mock_value)
452
+ non_mock.msg(:arg).should equal(:mock_value)
453
+ non_mock.msg.should equal(:stub_value)
454
+ non_mock.msg.should equal(:stub_value)
455
+ non_mock.rspec_verify
456
+ end
457
+
458
+ it "should return the stubbed value when no new value specified" do
459
+ @mock.stub!(:msg).and_return(:stub_value)
460
+ @mock.should_receive(:msg)
461
+ @mock.msg.should equal(:stub_value)
462
+ @mock.rspec_verify
463
+ end
464
+
465
+ it "should not mess with the stub's yielded values when also mocked" do
466
+ @mock.stub!(:yield_back).and_yield(:stub_value)
467
+ @mock.should_receive(:yield_back).and_yield(:mock_value)
468
+ @mock.yield_back{|v| v.should == :mock_value }
469
+ @mock.yield_back{|v| v.should == :stub_value }
470
+ @mock.rspec_verify
471
+ end
472
+
473
+ it "should yield multiple values after a similar stub" do
474
+ File.stub!(:open).and_yield(:stub_value)
475
+ File.should_receive(:open).and_yield(:first_call).and_yield(:second_call)
476
+ yielded_args = []
477
+ File.open {|v| yielded_args << v }
478
+ yielded_args.should == [:first_call, :second_call]
479
+ File.open {|v| v.should == :stub_value }
480
+ File.rspec_verify
481
+ end
482
+
483
+ it "should assign stub return values" do
484
+ mock = Mock.new('name', :message => :response)
485
+ mock.message.should == :response
486
+ end
487
+
488
+ end
489
+
490
+ describe "a mock message receiving a block" do
491
+ before(:each) do
492
+ @mock = mock("mock")
493
+ @calls = 0
494
+ end
495
+
496
+ def add_call
497
+ @calls = @calls + 1
498
+ end
499
+
500
+ it "should call the block after #should_receive" do
501
+ @mock.should_receive(:foo) { add_call }
502
+
503
+ @mock.foo
504
+
505
+ @calls.should == 1
506
+ end
507
+
508
+ it "should call the block after #should_receive after a similar stub" do
509
+ @mock.stub!(:foo).and_return(:bar)
510
+ @mock.should_receive(:foo) { add_call }
511
+
512
+ @mock.foo
513
+
514
+ @calls.should == 1
515
+ end
516
+
517
+ it "should call the block after #once" do
518
+ @mock.should_receive(:foo).once { add_call }
519
+
520
+ @mock.foo
521
+
522
+ @calls.should == 1
523
+ end
524
+
525
+ it "should call the block after #twice" do
526
+ @mock.should_receive(:foo).twice { add_call }
527
+
528
+ @mock.foo
529
+ @mock.foo
530
+
531
+ @calls.should == 2
532
+ end
533
+
534
+ it "should call the block after #times" do
535
+ @mock.should_receive(:foo).exactly(10).times { add_call }
536
+
537
+ (1..10).each { @mock.foo }
538
+
539
+ @calls.should == 10
540
+ end
541
+
542
+ it "should call the block after #any_number_of_times" do
543
+ @mock.should_receive(:foo).any_number_of_times { add_call }
544
+
545
+ (1..7).each { @mock.foo }
546
+
547
+ @calls.should == 7
548
+ end
549
+
550
+ it "should call the block after #ordered" do
551
+ @mock.should_receive(:foo).ordered { add_call }
552
+ @mock.should_receive(:bar).ordered { add_call }
553
+
554
+ @mock.foo
555
+ @mock.bar
556
+
557
+ @calls.should == 2
558
+ end
559
+ end
560
+
561
+ describe 'string representation generated by #to_s' do
562
+ it 'should not contain < because that might lead to invalid HTML in some situations' do
563
+ mock = mock("Dog")
564
+ valid_html_str = "#{mock}"
565
+ valid_html_str.should_not include('<')
566
+ end
567
+ end
568
+
569
+ describe "==" do
570
+ it "sends '== self' to the comparison object" do
571
+ first = mock('first')
572
+ second = mock('second')
573
+
574
+ first.should_receive(:==).with(second)
575
+ second == first
576
+ end
577
+ end
578
+ end
579
+ end
@@ -0,0 +1,113 @@
1
+ require File.dirname(__FILE__) + '/../../spec_helper'
2
+
3
+ module Spec
4
+ module Mocks
5
+ describe "a Mock expectation with multiple return values and no specified count" do
6
+ before(:each) do
7
+ @mock = Mock.new("mock")
8
+ @return_values = ["1",2,Object.new]
9
+ @mock.should_receive(:message).and_return(@return_values[0],@return_values[1],@return_values[2])
10
+ end
11
+
12
+ it "should return values in order to consecutive calls" do
13
+ @mock.message.should == @return_values[0]
14
+ @mock.message.should == @return_values[1]
15
+ @mock.message.should == @return_values[2]
16
+ @mock.rspec_verify
17
+ end
18
+
19
+ it "should complain when there are too few calls" do
20
+ third = Object.new
21
+ @mock.message.should == @return_values[0]
22
+ @mock.message.should == @return_values[1]
23
+ lambda { @mock.rspec_verify }.should raise_error(MockExpectationError, "Mock 'mock' expected :message with (any args) 3 times, but received it twice")
24
+ end
25
+
26
+ it "should complain when there are too many calls" do
27
+ third = Object.new
28
+ @mock.message.should == @return_values[0]
29
+ @mock.message.should == @return_values[1]
30
+ @mock.message.should == @return_values[2]
31
+ @mock.message.should == @return_values[2]
32
+ lambda { @mock.rspec_verify }.should raise_error(MockExpectationError, "Mock 'mock' expected :message with (any args) 3 times, but received it 4 times")
33
+ end
34
+ end
35
+
36
+ describe "a Mock expectation with multiple return values with a specified count equal to the number of values" do
37
+ before(:each) do
38
+ @mock = Mock.new("mock")
39
+ @return_values = ["1",2,Object.new]
40
+ @mock.should_receive(:message).exactly(3).times.and_return(@return_values[0],@return_values[1],@return_values[2])
41
+ end
42
+
43
+ it "should return values in order to consecutive calls" do
44
+ @mock.message.should == @return_values[0]
45
+ @mock.message.should == @return_values[1]
46
+ @mock.message.should == @return_values[2]
47
+ @mock.rspec_verify
48
+ end
49
+
50
+ it "should complain when there are too few calls" do
51
+ third = Object.new
52
+ @mock.message.should == @return_values[0]
53
+ @mock.message.should == @return_values[1]
54
+ lambda { @mock.rspec_verify }.should raise_error(MockExpectationError, "Mock 'mock' expected :message with (any args) 3 times, but received it twice")
55
+ end
56
+
57
+ it "should complain when there are too many calls" do
58
+ third = Object.new
59
+ @mock.message.should == @return_values[0]
60
+ @mock.message.should == @return_values[1]
61
+ @mock.message.should == @return_values[2]
62
+ @mock.message.should == @return_values[2]
63
+ lambda { @mock.rspec_verify }.should raise_error(MockExpectationError, "Mock 'mock' expected :message with (any args) 3 times, but received it 4 times")
64
+ end
65
+ end
66
+
67
+ describe "a Mock expectation with multiple return values specifying at_least less than the number of values" do
68
+ before(:each) do
69
+ @mock = Mock.new("mock")
70
+ @mock.should_receive(:message).at_least(:twice).with(no_args).and_return(11, 22)
71
+ end
72
+
73
+ it "should use last return value for subsequent calls" do
74
+ @mock.message.should equal(11)
75
+ @mock.message.should equal(22)
76
+ @mock.message.should equal(22)
77
+ @mock.rspec_verify
78
+ end
79
+
80
+ it "should fail when called less than the specified number" do
81
+ @mock.message.should equal(11)
82
+ lambda { @mock.rspec_verify }.should raise_error(MockExpectationError, "Mock 'mock' expected :message with (no args) twice, but received it once")
83
+ end
84
+ end
85
+ describe "a Mock expectation with multiple return values with a specified count larger than the number of values" do
86
+ before(:each) do
87
+ @mock = Mock.new("mock")
88
+ @mock.should_receive(:message).exactly(3).times.and_return(11, 22)
89
+ end
90
+
91
+ it "should use last return value for subsequent calls" do
92
+ @mock.message.should equal(11)
93
+ @mock.message.should equal(22)
94
+ @mock.message.should equal(22)
95
+ @mock.rspec_verify
96
+ end
97
+
98
+ it "should fail when called less than the specified number" do
99
+ @mock.message.should equal(11)
100
+ lambda { @mock.rspec_verify }.should raise_error(MockExpectationError, "Mock 'mock' expected :message with (any args) 3 times, but received it once")
101
+ end
102
+
103
+ it "should fail when called greater than the specified number" do
104
+ @mock.message.should equal(11)
105
+ @mock.message.should equal(22)
106
+ @mock.message.should equal(22)
107
+ @mock.message.should equal(22)
108
+ lambda { @mock.rspec_verify }.should raise_error(MockExpectationError, "Mock 'mock' expected :message with (any args) 3 times, but received it 4 times")
109
+ end
110
+ end
111
+ end
112
+ end
113
+