rr 1.1.1 → 3.0.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 (223) hide show
  1. checksums.yaml +5 -5
  2. data/Appraisals +6 -0
  3. data/CHANGES.md +102 -1
  4. data/CREDITS.md +5 -0
  5. data/Gemfile +3 -0
  6. data/README.md +91 -110
  7. data/Rakefile +43 -0
  8. data/doc/02_syntax_comparison.md +1 -0
  9. data/gemfiles/ruby_19_rspec_2.gemfile +14 -0
  10. data/gemfiles/ruby_19_rspec_2.gemfile.lock +49 -0
  11. data/gemfiles/ruby_19_rspec_2_rails_4.gemfile +15 -0
  12. data/gemfiles/ruby_19_rspec_2_rails_4.gemfile.lock +119 -0
  13. data/lib/rr/class_instance_method_defined.rb +1 -1
  14. data/lib/rr/core_ext/array.rb +2 -0
  15. data/lib/rr/core_ext/hash.rb +2 -0
  16. data/lib/rr/deprecations.rb +97 -0
  17. data/lib/rr/double.rb +28 -10
  18. data/lib/rr/double_definitions/double_definition.rb +39 -16
  19. data/lib/rr/double_definitions/double_definition_create.rb +5 -5
  20. data/lib/rr/double_definitions/double_definition_create_blank_slate.rb +10 -4
  21. data/lib/rr/double_definitions/double_injections/any_instance_of.rb +1 -1
  22. data/lib/rr/double_definitions/double_injections/instance.rb +2 -2
  23. data/lib/rr/double_definitions/strategies/strategy.rb +27 -8
  24. data/lib/rr/double_definitions/strategies/verification/mock.rb +8 -2
  25. data/lib/rr/double_matches.rb +4 -3
  26. data/lib/rr/dsl.rb +152 -0
  27. data/lib/rr/expectations/any_argument_expectation.rb +4 -4
  28. data/lib/rr/expectations/argument_equality_expectation.rb +43 -5
  29. data/lib/rr/injections/double_injection.rb +67 -19
  30. data/lib/rr/injections/method_missing_injection.rb +37 -6
  31. data/lib/rr/integrations.rb +13 -12
  32. data/lib/rr/integrations/decorator.rb +4 -1
  33. data/lib/rr/integrations/minitest_4.rb +1 -1
  34. data/lib/rr/integrations/minitest_4_active_support.rb +1 -1
  35. data/lib/rr/integrations/rspec/invocation_matcher.rb +0 -8
  36. data/lib/rr/integrations/rspec_2.rb +28 -3
  37. data/lib/rr/keyword_arguments.rb +15 -0
  38. data/lib/rr/method_dispatches/base_method_dispatch.rb +22 -5
  39. data/lib/rr/method_dispatches/method_dispatch.rb +21 -10
  40. data/lib/rr/method_dispatches/method_missing_dispatch.rb +14 -5
  41. data/lib/rr/recorded_call.rb +35 -0
  42. data/lib/rr/recorded_calls.rb +23 -9
  43. data/lib/rr/space.rb +15 -5
  44. data/lib/rr/spy_verification.rb +13 -5
  45. data/lib/rr/version.rb +1 -2
  46. data/lib/rr/wildcard_matchers.rb +10 -10
  47. data/lib/rr/without_autohook.rb +7 -14
  48. data/rr.gemspec +14 -5
  49. data/spec/custom_formatter_for_rspec.rb +18 -0
  50. data/spec/custom_formatter_for_rspec_2.rb +40 -0
  51. data/spec/defines_spec_suite_tasks.rb +57 -0
  52. data/spec/fixtures/rubygems_patch_for_187.rb +598 -0
  53. data/spec/global_helper.rb +38 -0
  54. data/spec/spec.opts +3 -0
  55. data/spec/spec_suite_configuration.rb +126 -0
  56. data/spec/spec_suite_runner.rb +47 -0
  57. data/spec/suites.yml +10 -0
  58. data/spec/suites/rspec_2/functional/any_instance_of_spec.rb +147 -0
  59. data/spec/suites/rspec_2/functional/dont_allow_spec.rb +17 -0
  60. data/spec/suites/rspec_2/functional/mock_bang_spec.rb +20 -0
  61. data/spec/suites/rspec_2/functional/mock_instance_of_spec.rb +14 -0
  62. data/spec/suites/rspec_2/functional/mock_instance_of_strong_spec.rb +15 -0
  63. data/spec/suites/rspec_2/functional/mock_proxy_instance_of_spec.rb +15 -0
  64. data/spec/suites/rspec_2/functional/mock_proxy_spec.rb +14 -0
  65. data/spec/suites/rspec_2/functional/mock_spec.rb +17 -0
  66. data/spec/suites/rspec_2/functional/mock_strong_spec.rb +14 -0
  67. data/spec/suites/rspec_2/functional/received_spec.rb +16 -0
  68. data/spec/suites/rspec_2/functional/spy_spec.rb +102 -0
  69. data/spec/suites/rspec_2/functional/stub_bang_spec.rb +20 -0
  70. data/spec/suites/rspec_2/functional/stub_instance_of_spec.rb +15 -0
  71. data/spec/suites/rspec_2/functional/stub_instance_of_strong_spec.rb +15 -0
  72. data/spec/suites/rspec_2/functional/stub_proxy_instance_of_spec.rb +16 -0
  73. data/spec/suites/rspec_2/functional/stub_proxy_spec.rb +45 -0
  74. data/spec/suites/rspec_2/functional/stub_spec.rb +71 -0
  75. data/spec/suites/rspec_2/functional/stub_strong_spec.rb +15 -0
  76. data/spec/suites/rspec_2/functional/wildcard_matchers_spec.rb +128 -0
  77. data/spec/suites/rspec_2/helper.rb +28 -0
  78. data/spec/suites/rspec_2/integration/minitest_4_spec.rb +109 -0
  79. data/spec/suites/rspec_2/integration/minitest_spec.rb +109 -0
  80. data/spec/suites/rspec_2/spec_helper.rb +3 -0
  81. data/spec/suites/rspec_2/support/matchers/wildcard_matcher_matchers.rb +32 -0
  82. data/spec/suites/rspec_2/support/mixins/double_definition_creator_helpers.rb +173 -0
  83. data/spec/suites/rspec_2/support/mixins/mock_definition_creator_helpers.rb +45 -0
  84. data/spec/suites/rspec_2/support/mixins/proxy_definition_creator_helpers.rb +33 -0
  85. data/spec/suites/rspec_2/support/mixins/stub_creator_helpers.rb +43 -0
  86. data/spec/suites/rspec_2/support/mixins/stub_definition_creator_helpers.rb +45 -0
  87. data/spec/suites/rspec_2/support/shared_contexts/double_definition_creators/argument_expectations_with_never_called_qualifier.rb +39 -0
  88. data/spec/suites/rspec_2/support/shared_contexts/double_definition_creators/argument_expectations_with_times_called_qualifier.rb +50 -0
  89. data/spec/suites/rspec_2/support/shared_contexts/double_definition_creators/argument_expectations_without_qualifiers.rb +131 -0
  90. data/spec/suites/rspec_2/support/shared_contexts/double_definition_creators/dont_allow.rb +148 -0
  91. data/spec/suites/rspec_2/support/shared_contexts/double_definition_creators/mock_instance_of.rb +26 -0
  92. data/spec/suites/rspec_2/support/shared_contexts/double_definition_creators/mock_instance_of_strong.rb +28 -0
  93. data/spec/suites/rspec_2/support/shared_contexts/double_definition_creators/mock_proxy.rb +11 -0
  94. data/spec/suites/rspec_2/support/shared_contexts/double_definition_creators/mock_strong.rb +37 -0
  95. data/spec/suites/rspec_2/support/shared_contexts/double_definition_creators/mocking.rb +107 -0
  96. data/spec/suites/rspec_2/support/shared_contexts/double_definition_creators/stub_instance_of.rb +32 -0
  97. data/spec/suites/rspec_2/support/shared_contexts/double_definition_creators/stub_instance_of_strong.rb +39 -0
  98. data/spec/suites/rspec_2/support/shared_contexts/double_definition_creators/stub_proxy.rb +11 -0
  99. data/spec/suites/rspec_2/support/shared_contexts/double_definition_creators/stub_strong.rb +37 -0
  100. data/spec/suites/rspec_2/support/shared_contexts/double_definition_creators/stubbing.rb +57 -0
  101. data/spec/suites/rspec_2/support/shared_examples/double_definition_creators/array_flatten_bug.rb +35 -0
  102. data/spec/suites/rspec_2/support/shared_examples/double_definition_creators/block_form.rb +31 -0
  103. data/spec/suites/rspec_2/support/shared_examples/double_definition_creators/comparing_arity.rb +63 -0
  104. data/spec/suites/rspec_2/support/shared_examples/double_definition_creators/object_is_proxy.rb +43 -0
  105. data/spec/suites/rspec_2/support/shared_examples/double_definition_creators/sequential_invocations.rb +26 -0
  106. data/spec/suites/rspec_2/support/shared_examples/double_definition_creators/setting_implementation.rb +51 -0
  107. data/spec/suites/rspec_2/support/shared_examples/double_definition_creators/yields.rb +81 -0
  108. data/spec/suites/rspec_2/support/shared_examples/space.rb +13 -0
  109. data/spec/suites/rspec_2/support/shared_examples/times_called_expectation.rb +9 -0
  110. data/spec/suites/rspec_2/unit/core_ext/array_spec.rb +39 -0
  111. data/spec/suites/rspec_2/unit/core_ext/enumerable_spec.rb +53 -0
  112. data/spec/suites/rspec_2/unit/core_ext/hash_spec.rb +55 -0
  113. data/spec/suites/rspec_2/unit/core_ext/range_spec.rb +41 -0
  114. data/spec/suites/rspec_2/unit/core_ext/regexp_spec.rb +41 -0
  115. data/spec/suites/rspec_2/unit/deprecations_spec.rb +27 -0
  116. data/spec/suites/rspec_2/unit/double_definitions/child_double_definition_create_spec.rb +114 -0
  117. data/spec/suites/rspec_2/unit/double_definitions/double_definition_create_blank_slate_spec.rb +93 -0
  118. data/spec/suites/rspec_2/unit/double_definitions/double_definition_create_spec.rb +446 -0
  119. data/spec/suites/rspec_2/unit/dsl/double_creators_spec.rb +133 -0
  120. data/spec/suites/rspec_2/unit/dsl/space_spec.rb +99 -0
  121. data/spec/suites/rspec_2/unit/dsl/wildcard_matchers_spec.rb +67 -0
  122. data/spec/suites/rspec_2/unit/errors/rr_error_spec.rb +67 -0
  123. data/spec/suites/rspec_2/unit/expectations/any_argument_expectation_spec.rb +48 -0
  124. data/spec/suites/rspec_2/unit/expectations/anything_argument_equality_expectation_spec.rb +14 -0
  125. data/spec/suites/rspec_2/unit/expectations/argument_equality_expectation_spec.rb +135 -0
  126. data/spec/suites/rspec_2/unit/expectations/boolean_argument_equality_expectation_spec.rb +30 -0
  127. data/spec/suites/rspec_2/unit/expectations/hash_including_argument_equality_expectation_spec.rb +92 -0
  128. data/spec/suites/rspec_2/unit/expectations/satisfy_argument_equality_expectation_spec.rb +61 -0
  129. data/spec/suites/rspec_2/unit/expectations/times_called_expectation/any_times_matcher_spec.rb +22 -0
  130. data/spec/suites/rspec_2/unit/expectations/times_called_expectation/at_least_matcher_spec.rb +37 -0
  131. data/spec/suites/rspec_2/unit/expectations/times_called_expectation/at_most_matcher_spec.rb +43 -0
  132. data/spec/suites/rspec_2/unit/expectations/times_called_expectation/integer_matcher_spec.rb +58 -0
  133. data/spec/suites/rspec_2/unit/expectations/times_called_expectation/proc_matcher_spec.rb +35 -0
  134. data/spec/suites/rspec_2/unit/expectations/times_called_expectation/range_matcher_spec.rb +39 -0
  135. data/spec/suites/rspec_2/unit/hash_with_object_id_key_spec.rb +88 -0
  136. data/spec/suites/rspec_2/unit/injections/double_injection/double_injection_spec.rb +533 -0
  137. data/spec/suites/rspec_2/unit/injections/double_injection/double_injection_verify_spec.rb +32 -0
  138. data/spec/suites/rspec_2/unit/integrations/rspec/invocation_matcher_spec.rb +297 -0
  139. data/spec/suites/rspec_2/unit/integrations/rspec_spec.rb +70 -0
  140. data/spec/suites/rspec_2/unit/rr_spec.rb +28 -0
  141. data/spec/suites/rspec_2/unit/space_spec.rb +598 -0
  142. data/spec/suites/rspec_2/unit/spy_verification_spec.rb +133 -0
  143. data/spec/suites/rspec_2/unit/times_called_matchers/any_times_matcher_spec.rb +46 -0
  144. data/spec/suites/rspec_2/unit/times_called_matchers/at_least_matcher_spec.rb +54 -0
  145. data/spec/suites/rspec_2/unit/times_called_matchers/at_most_matcher_spec.rb +69 -0
  146. data/spec/suites/rspec_2/unit/times_called_matchers/integer_matcher_spec.rb +69 -0
  147. data/spec/suites/rspec_2/unit/times_called_matchers/proc_matcher_spec.rb +54 -0
  148. data/spec/suites/rspec_2/unit/times_called_matchers/range_matcher_spec.rb +75 -0
  149. data/spec/suites/rspec_2/unit/times_called_matchers/times_called_matcher_spec.rb +117 -0
  150. data/spec/suites/rspec_2/unit/wildcard_matchers/anything_spec.rb +33 -0
  151. data/spec/suites/rspec_2/unit/wildcard_matchers/boolean_spec.rb +45 -0
  152. data/spec/suites/rspec_2/unit/wildcard_matchers/duck_type_spec.rb +64 -0
  153. data/spec/suites/rspec_2/unit/wildcard_matchers/hash_including_spec.rb +64 -0
  154. data/spec/suites/rspec_2/unit/wildcard_matchers/is_a_spec.rb +55 -0
  155. data/spec/suites/rspec_2/unit/wildcard_matchers/numeric_spec.rb +46 -0
  156. data/spec/suites/rspec_2/unit/wildcard_matchers/satisfy_spec.rb +57 -0
  157. data/spec/support/adapter.rb +22 -0
  158. data/spec/support/adapter_tests/base.rb +45 -0
  159. data/spec/support/adapter_tests/minitest.rb +7 -0
  160. data/spec/support/adapter_tests/rspec.rb +70 -0
  161. data/spec/support/adapter_tests/test_unit.rb +47 -0
  162. data/spec/support/command_runner.rb +105 -0
  163. data/spec/support/generator.rb +56 -0
  164. data/spec/support/integration_tests/base.rb +64 -0
  165. data/spec/support/integration_tests/rails.rb +60 -0
  166. data/spec/support/integration_tests/rails_minitest.rb +13 -0
  167. data/spec/support/integration_tests/rails_rspec.rb +13 -0
  168. data/spec/support/integration_tests/rails_test_unit.rb +13 -0
  169. data/spec/support/integration_tests/rails_test_unit_like.rb +13 -0
  170. data/spec/support/integration_tests/ruby.rb +7 -0
  171. data/spec/support/integration_tests/ruby_minitest.rb +13 -0
  172. data/spec/support/integration_tests/ruby_rspec.rb +13 -0
  173. data/spec/support/integration_tests/ruby_test_unit.rb +13 -0
  174. data/spec/support/matchers/be_a_subset_of_matcher.rb +24 -0
  175. data/spec/support/project/cucumber.rb +50 -0
  176. data/spec/support/project/generator.rb +348 -0
  177. data/spec/support/project/minitest.rb +39 -0
  178. data/spec/support/project/rails.rb +199 -0
  179. data/spec/support/project/rails_minitest.rb +17 -0
  180. data/spec/support/project/rails_rspec.rb +50 -0
  181. data/spec/support/project/rails_test_unit.rb +17 -0
  182. data/spec/support/project/rails_test_unit_like.rb +17 -0
  183. data/spec/support/project/rspec.rb +69 -0
  184. data/spec/support/project/ruby.rb +34 -0
  185. data/spec/support/project/ruby_minitest.rb +11 -0
  186. data/spec/support/project/ruby_rspec.rb +29 -0
  187. data/spec/support/project/ruby_test_unit.rb +11 -0
  188. data/spec/support/project/ruby_test_unit_like.rb +21 -0
  189. data/spec/support/project/test_unit.rb +29 -0
  190. data/spec/support/project/test_unit_like.rb +7 -0
  191. data/spec/support/project/tests_runner.rb +22 -0
  192. data/spec/support/test.sqlite3 +0 -0
  193. data/spec/support/test_case/generator.rb +53 -0
  194. data/spec/support/test_case/minitest.rb +13 -0
  195. data/spec/support/test_case/rspec.rb +19 -0
  196. data/spec/support/test_case/test_unit.rb +21 -0
  197. data/spec/support/test_file/generator.rb +120 -0
  198. data/spec/support/test_file/minitest.rb +19 -0
  199. data/spec/support/test_file/rails_minitest.rb +7 -0
  200. data/spec/support/test_file/rails_rspec.rb +12 -0
  201. data/spec/support/test_file/rails_test_unit.rb +25 -0
  202. data/spec/support/test_file/rspec.rb +33 -0
  203. data/spec/support/test_file/test_unit.rb +36 -0
  204. data/spec/support/test_helper/generator.rb +27 -0
  205. data/spec/support/test_helper/minitest.rb +7 -0
  206. data/spec/support/test_helper/rails.rb +31 -0
  207. data/spec/support/test_helper/rails_minitest.rb +7 -0
  208. data/spec/support/test_helper/rails_rspec.rb +25 -0
  209. data/spec/support/test_helper/rails_test_unit.rb +23 -0
  210. data/spec/support/test_helper/rspec.rb +7 -0
  211. data/spec/support/test_helper/ruby.rb +31 -0
  212. data/spec/support/test_helper/test_unit.rb +7 -0
  213. metadata +240 -19
  214. data/VERSION +0 -1
  215. data/lib/rr/adapters.rb +0 -44
  216. data/lib/rr/adapters/rr_methods.rb +0 -142
  217. data/lib/rr/integrations/rspec_1.rb +0 -46
  218. data/lib/rr/integrations/test_unit_1.rb +0 -63
  219. data/lib/rr/integrations/test_unit_2.rb +0 -15
  220. data/lib/rr/integrations/test_unit_200.rb +0 -27
  221. data/lib/rr/integrations/test_unit_200_active_support.rb +0 -25
  222. data/lib/rr/integrations/test_unit_2_active_support.rb +0 -38
  223. data/lib/rr/proc_from_block.rb +0 -11
@@ -0,0 +1,45 @@
1
+ module MockDefinitionCreatorHelpers
2
+ include DoubleDefinitionCreatorHelpers
3
+
4
+ def expect_that_double_can_be_defined_without_block
5
+ _, _, return_value =
6
+ build_object_with_doubled_method_which_is_called('value')
7
+ expect(return_value).to eq nil
8
+ end
9
+
10
+ def expect_that_double_sets_implementation(&block)
11
+ _, _, return_value =
12
+ build_object_with_doubled_method_which_is_called('old value', -> { 'new value' }, &block)
13
+ expect(return_value).to eq 'new value'
14
+ end
15
+
16
+ def expect_that_double_sets_implementation_and_resets(&block)
17
+ object, method_name, return_value =
18
+ build_object_with_doubled_method_which_is_reset_and_called('old value', -> { 'new value' }, &block)
19
+
20
+ if methods_being_doubled_exist_already?
21
+ # This doesn't work quite yet - see btakita#44
22
+ #expect(object).not_to respond_to(method_name)
23
+ else
24
+ expect(return_value).to eq 'old value'
25
+ end
26
+ end
27
+
28
+ def expect_that_double_sets_value(&block)
29
+ _, _, return_value =
30
+ build_object_with_doubled_method_which_is_called('old value', 'new value', &block)
31
+ expect(return_value).to eq 'new value'
32
+ end
33
+
34
+ def expect_that_double_sets_value_and_resets(&block)
35
+ _, _, return_value =
36
+ build_object_with_doubled_method_which_is_reset_and_called('old value', 'new value', &block)
37
+
38
+ if methods_being_doubled_exist_already?
39
+ # This doesn't work quite yet - see btakita#44
40
+ #expect(object).not_to respond_to(method_name)
41
+ else
42
+ expect(return_value).to eq 'old value'
43
+ end
44
+ end
45
+ end
@@ -0,0 +1,33 @@
1
+ module ProxyDefinitionCreatorHelpers
2
+ include DoubleDefinitionCreatorHelpers
3
+
4
+ def expect_that_double_can_be_defined_without_block
5
+ _, _, return_value =
6
+ build_object_with_doubled_method_which_is_called('value', nil)
7
+ expect(return_value).to eq 'value'
8
+ end
9
+
10
+ def expect_that_double_sets_implementation(&block)
11
+ _, _, return_value =
12
+ build_object_with_doubled_method_which_is_called('value', ->(v) { v.upcase }, &block)
13
+ expect(return_value).to eq 'VALUE'
14
+ end
15
+
16
+ def expect_that_double_sets_implementation_and_resets(&block)
17
+ _, _, return_value =
18
+ build_object_with_doubled_method_which_is_reset_and_called('value', ->(v) { v.upcase }, &block)
19
+ expect(return_value).to eq 'value'
20
+ end
21
+
22
+ def expect_that_double_sets_value(&block)
23
+ _, _, return_value =
24
+ build_object_with_doubled_method_which_is_called('old value', 'new value', &block)
25
+ expect(return_value).to eq 'new value'
26
+ end
27
+
28
+ def expect_that_double_sets_value_and_resets(&block)
29
+ _, _, return_value =
30
+ build_object_with_doubled_method_which_is_reset_and_called('old value', 'new value', &block)
31
+ expect(return_value).to eq 'old value'
32
+ end
33
+ end
@@ -0,0 +1,43 @@
1
+ module StubDefinitionCreatorHelpers
2
+ def expect_that_double_can_be_defined_without_block
3
+ _, _, return_value =
4
+ build_object_with_doubled_method_which_is_called('value', nil)
5
+ expect(return_value).to eq nil
6
+ end
7
+
8
+ def expect_that_double_sets_implementation(&block)
9
+ _, _, return_value =
10
+ build_object_with_doubled_method_which_is_called('old value', -> { 'new value' }, &block)
11
+ expect(return_value).to eq 'new value'
12
+ end
13
+
14
+ def expect_that_double_sets_implementation_and_resets(&block)
15
+ object, method_name, return_value =
16
+ build_object_with_doubled_method_which_is_reset_and_called('old value', -> { 'new value' }, &block)
17
+
18
+ if methods_being_doubled_exist_already?
19
+ # This doesn't work quite yet - see btakita#44
20
+ #expect(object).not_to respond_to(method_name)
21
+ else
22
+ expect(return_value).to eq 'old value'
23
+ end
24
+ end
25
+
26
+ def expect_that_double_sets_value(&block)
27
+ _, _, return_value =
28
+ build_object_with_doubled_method_which_is_called('old value', 'new value', &block)
29
+ expect(return_value).to eq 'new value'
30
+ end
31
+
32
+ def expect_that_double_sets_value_and_resets(&block)
33
+ _, _, return_value =
34
+ build_object_with_doubled_method_which_is_reset_and_called('old value', 'new value', &block)
35
+
36
+ if methods_being_doubled_exist_already?
37
+ # This doesn't work quite yet - see btakita#44
38
+ #expect(object).not_to respond_to(method_name)
39
+ else
40
+ expect(return_value).to eq 'old value'
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,45 @@
1
+ module StubDefinitionCreatorHelpers
2
+ include DoubleDefinitionCreatorHelpers
3
+
4
+ def expect_that_double_can_be_defined_without_block
5
+ _, _, return_value =
6
+ build_object_with_doubled_method_which_is_called('value', nil)
7
+ expect(return_value).to eq nil
8
+ end
9
+
10
+ def expect_that_double_sets_implementation(&block)
11
+ _, _, return_value =
12
+ build_object_with_doubled_method_which_is_called('old value', -> { 'new value' }, &block)
13
+ expect(return_value).to eq 'new value'
14
+ end
15
+
16
+ def expect_that_double_sets_implementation_and_resets(&block)
17
+ object, method_name, return_value =
18
+ build_object_with_doubled_method_which_is_reset_and_called('old value', -> { 'new value' }, &block)
19
+
20
+ if methods_being_doubled_exist_already?
21
+ # This doesn't work quite yet - see btakita#44
22
+ #expect(object).not_to respond_to(method_name)
23
+ else
24
+ expect(return_value).to eq 'old value'
25
+ end
26
+ end
27
+
28
+ def expect_that_double_sets_value(&block)
29
+ _, _, return_value =
30
+ build_object_with_doubled_method_which_is_called('old value', 'new value', &block)
31
+ expect(return_value).to eq 'new value'
32
+ end
33
+
34
+ def expect_that_double_sets_value_and_resets(&block)
35
+ _, _, return_value =
36
+ build_object_with_doubled_method_which_is_reset_and_called('old value', 'new value', &block)
37
+
38
+ if methods_being_doubled_exist_already?
39
+ # This doesn't work quite yet - see btakita#44
40
+ #expect(object).not_to respond_to(method_name)
41
+ else
42
+ expect(return_value).to eq 'old value'
43
+ end
44
+ end
45
+ end
@@ -0,0 +1,39 @@
1
+ shared_context 'using 1 of 2 ways to define a mock with an argument expectation with a never-called qualifier' do
2
+ include DoubleDefinitionCreatorHelpers
3
+
4
+ it "works as long as the invocation never occurs" do
5
+ build_object_with_possible_methods(some_method: lambda {|arg| }) do |subject|
6
+ double_creator = double_definition_creator_for(subject)
7
+ define_double_with_argument_expectation(double_creator, :some_method, 1).never
8
+ end
9
+ end
10
+
11
+ it "works as long as the invocation never occurs even if other invocations occur" do
12
+ object = build_object_with_possible_methods(some_method: lambda {|arg| }) do |subject|
13
+ double_creator = double_definition_creator_for(subject)
14
+ define_double_with_argument_expectation(double_creator, :some_method, 1).never
15
+ end
16
+ stub(object).some_method.with_any_args
17
+ object.some_method(2)
18
+ end
19
+
20
+ specify "TimesCalledError is raised as soon as the invocation occurs" do
21
+ object = build_object_with_possible_methods(some_method: lambda {|arg| }) do |subject|
22
+ double_creator = double_definition_creator_for(subject)
23
+ define_double_with_argument_expectation(double_creator, :some_method, 1).never
24
+ end
25
+ expect { object.some_method(1) }.to raise_error(RR::Errors::TimesCalledError)
26
+ RR.reset
27
+ end
28
+
29
+ specify "nothing happens upon being reset" do
30
+ object = build_object_with_possible_methods(some_method: lambda {|arg| }) do |subject|
31
+ double_creator = double_definition_creator_for(subject)
32
+ define_double_with_argument_expectation(double_creator, :some_method, 1).never
33
+ end
34
+ RR.reset
35
+ expect {
36
+ call_possible_method_on(object, :some_method, 1)
37
+ }.not_to raise_error
38
+ end
39
+ end
@@ -0,0 +1,50 @@
1
+ shared_context 'using 1 of 2 ways to define a mock with an argument expectation with a times-called qualifier' do
2
+ include DoubleDefinitionCreatorHelpers
3
+
4
+ context 'upon verification after the invocation occurs too few times' do
5
+ specify "TimesCalledError is raised" do
6
+ object = build_object_with_possible_methods(some_method: ->(arg) {}) do |subject|
7
+ double_creator = double_definition_creator_for(subject)
8
+ define_double_with_argument_expectation(double_creator, :some_method, 1).times(2)
9
+ end
10
+ call_possible_method_on(object, :some_method, 1)
11
+ expect { RR.verify }.to raise_error(RR::Errors::TimesCalledError)
12
+ end
13
+
14
+ specify "nothing happens upon reset" do
15
+ object = build_object_with_possible_methods(some_method: ->(arg) {}) do |subject|
16
+ double_creator = double_definition_creator_for(subject)
17
+ define_double_with_argument_expectation(double_creator, :some_method, 1).times(2)
18
+ end
19
+ RR.reset
20
+ call_possible_method_on(object, :some_method, 1)
21
+ expect { RR.verify }.not_to raise_error
22
+ end
23
+ end
24
+
25
+ context 'the moment the invocation occurs one too many times' do
26
+ specify "TimesCalledError is raised" do
27
+ object = build_object_with_possible_methods(some_method: ->(arg) {}) do |subject|
28
+ double_creator = double_definition_creator_for(subject)
29
+ define_double_with_argument_expectation(double_creator, :some_method, 1).times(2)
30
+ end
31
+ call_possible_method_on(object, :some_method, 1)
32
+ call_possible_method_on(object, :some_method, 1)
33
+ expect { object.some_method(1) }.to raise_error(RR::Errors::TimesCalledError)
34
+ RR.reset
35
+ end
36
+
37
+ specify "nothing happens upon reset" do
38
+ object = build_object_with_possible_methods(some_method: ->(arg) {}) do |subject|
39
+ double_creator = double_definition_creator_for(subject)
40
+ define_double_with_argument_expectation(double_creator, :some_method, 1).times(2)
41
+ end
42
+ RR.reset
43
+ call_possible_method_on(object, :some_method, 1)
44
+ call_possible_method_on(object, :some_method, 1)
45
+ expect {
46
+ call_possible_method_on(object, :some_method, 1)
47
+ }.not_to raise_error
48
+ end
49
+ end
50
+ end
@@ -0,0 +1,131 @@
1
+ shared_context 'using 1 of 2 ways to define a method double with an argument expectation without any qualifiers' do
2
+ include DoubleDefinitionCreatorHelpers
3
+
4
+ it "defines the double just for that specific invocation" do
5
+ object = build_object_with_possible_methods(some_method: ->(*args) { 'value' }) do |subject|
6
+ double_creator = double_definition_creator_for(subject)
7
+ double = define_double_with_argument_expectation(double_creator, :some_method, 1)
8
+ double.returns { 'bar' }
9
+ end
10
+ expect_call_to_return_or_raise_times_called_error('bar', object, :some_method, 1)
11
+ end
12
+
13
+ if supports_dont_allow?
14
+
15
+ context 'upon verification after the invocation occurs too few times' do
16
+ specify "no error is raised if the method is never called at all" do
17
+ build_object_with_possible_methods(some_method: ->(*args) {}) do |subject|
18
+ double_creator = double_definition_creator_for(subject)
19
+ define_double_with_argument_expectation(double_creator, :some_method, 1)
20
+ end
21
+ expect { RR.verify }.not_to raise_error
22
+ end
23
+ end
24
+
25
+ context 'the moment an unknown invocation occurs' do
26
+ specify "DoubleNotFoundError is raised" do
27
+ object = build_object_with_possible_methods(some_method: ->(*args) {}) do |subject|
28
+ double_creator = double_definition_creator_for(subject)
29
+ define_double_with_argument_expectation(double_creator, :some_method, 1)
30
+ end
31
+ expect { object.some_method }.to raise_error(RR::Errors::DoubleNotFoundError)
32
+ RR.reset
33
+ end
34
+
35
+ it "is reset correctly" do
36
+ object = build_object_with_possible_methods(some_method: ->(*args) {}) do |subject|
37
+ double_creator = double_definition_creator_for(subject)
38
+ define_double_with_argument_expectation(double_creator, :some_method, 1)
39
+ end
40
+ RR.reset
41
+ expect {
42
+ call_possible_method_on(object, :some_method)
43
+ }.not_to raise_error
44
+ end
45
+ end
46
+
47
+ elsif supports_mocking?
48
+
49
+ context 'upon verification after the invocation occurs too few times' do
50
+ specify "TimesCalledError is raised at the verify step if the method is never called at all" do
51
+ build_object_with_possible_methods(some_method: ->(*args) {}) do |subject|
52
+ double_creator = double_definition_creator_for(subject)
53
+ define_double_with_argument_expectation(double_creator, :some_method, 1)
54
+ end
55
+ expect { RR.verify }.to raise_error(RR::Errors::TimesCalledError)
56
+ end
57
+
58
+ specify "nothing happens upon being reset" do
59
+ build_object_with_possible_methods(some_method: ->(*args) {}) do |subject|
60
+ double_creator = double_definition_creator_for(subject)
61
+ define_double_with_argument_expectation(double_creator, :some_method, 1)
62
+ end
63
+ RR.reset
64
+ expect { RR.verify }.not_to raise_error
65
+ end
66
+ end
67
+
68
+ context 'the moment an unknown invocation occurs' do
69
+ specify "DoubleNotFoundError is raised" do
70
+ object = build_object_with_possible_methods(some_method: ->(*args) {}) do |subject|
71
+ double_creator = double_definition_creator_for(subject)
72
+ define_double_with_argument_expectation(double_creator, :some_method, 1)
73
+ end
74
+ expect { object.some_method }.to raise_error(RR::Errors::DoubleNotFoundError)
75
+ RR.reset
76
+ end
77
+
78
+ specify "is reset correctly" do
79
+ object = build_object_with_possible_methods(some_method: ->(*args) {}) do |subject|
80
+ double_creator = double_definition_creator_for(subject)
81
+ define_double_with_argument_expectation(double_creator, :some_method, 1)
82
+ end
83
+ RR.reset
84
+ expect {
85
+ call_possible_method_on(object, :some_method, 1)
86
+ }.not_to raise_error
87
+ end
88
+ end
89
+
90
+ else
91
+
92
+ it "resets the double correctly" do
93
+ object = build_object_with_possible_methods(some_method: ->(*args) { 'existing value' }) do |subject, object|
94
+ expect_method_to_have_value_or_be_absent('existing value', object, :some_method, 1)
95
+ double_creator = double_definition_creator_for(subject)
96
+ double = define_double_with_argument_expectation(double_creator, :some_method, 1)
97
+ double.returns { 'new value' }
98
+ end
99
+ RR.reset
100
+ expect_method_to_have_value_or_be_absent('existing value', object, :some_method, 1)
101
+ end
102
+
103
+ it "raises DoubleNotFoundError the moment the method is called but not with the specified arguments" do
104
+ object = build_object_with_possible_methods(some_method: ->(*args) {}) do |subject|
105
+ double_creator = double_definition_creator_for(subject)
106
+ define_double_with_argument_expectation(double_creator, :some_method, 1)
107
+ end
108
+ expect { object.some_method }.to raise_error(RR::Errors::DoubleNotFoundError)
109
+ RR.reset
110
+ end
111
+
112
+ end
113
+
114
+ unless supports_dont_allow?
115
+ it "lets you define a catch-all double by defining a stub without arguments" do
116
+ object = build_object_with_possible_methods(some_method: ->(*args) {}) do |subject|
117
+ double_creator =
118
+ if supports_instance_of?
119
+ stub.instance_of(subject)
120
+ else
121
+ stub(subject)
122
+ end
123
+ double_creator.some_method
124
+ double_creator = double_definition_creator_for(subject)
125
+ define_double_with_argument_expectation(double_creator, :some_method, 1)
126
+ end
127
+ object.some_method(1)
128
+ object.some_method(2) # shouldn't raise an error
129
+ end
130
+ end
131
+ end
@@ -0,0 +1,148 @@
1
+ shared_context 'tests for a double definition creator method that supports dont_allow' do
2
+ include DoubleDefinitionCreatorHelpers
3
+
4
+ specify "TimesCalledError is raised as soon as the method is called" do
5
+ object = build_object_with_possible_methods(some_method: -> {}) do |subject|
6
+ dont_allow(subject).some_method
7
+ end
8
+ expect { object.some_method }.to raise_error(RR::Errors::TimesCalledError)
9
+ end
10
+
11
+ context 'defining a mock with an argument expectation with a times-called qualifier' do
12
+ context 'by passing arguments to the double definition directly' do
13
+ include_context 'using 1 of 2 ways to define a mock with an argument expectation with a times-called qualifier'
14
+
15
+ def define_double_with_argument_expectation(double_creator, method_name, *args)
16
+ double_creator.__send__(method_name, *args)
17
+ end
18
+ end
19
+
20
+ # https://github.com/rr/rr/issues/23
21
+ unless supports_strong?
22
+ context 'by using #with and arguments' do
23
+ include_context 'using 1 of 2 ways to define a mock with an argument expectation with a times-called qualifier'
24
+
25
+ def define_double_with_argument_expectation(double_creator, method_name, *args)
26
+ double_creator.__send__(method_name).with(*args)
27
+ end
28
+ end
29
+ end
30
+ end
31
+
32
+ context 'defining a mock with an argument expectation with a never-called qualifier' do
33
+ context 'by passing arguments to the double definition directly' do
34
+ include_context 'using 1 of 2 ways to define a mock with an argument expectation with a never-called qualifier'
35
+
36
+ def define_double_with_argument_expectation(double_creator, method_name, *args)
37
+ double_creator.__send__(method_name, *args)
38
+ end
39
+ end
40
+
41
+ # https://github.com/rr/rr/issues/23
42
+ unless supports_strong?
43
+ context 'by using #with and arguments' do
44
+ include_context 'using 1 of 2 ways to define a mock with an argument expectation with a never-called qualifier'
45
+
46
+ def define_double_with_argument_expectation(double_creator, method_name, *args)
47
+ double_creator.__send__(method_name).with(*args)
48
+ end
49
+ end
50
+ end
51
+ end
52
+
53
+ context 'defining a mock with an argument expectation without any qualifiers' do
54
+ context 'by passing arguments to the double definition directly' do
55
+ include_context 'using 1 of 2 ways to define a method double with an argument expectation without any qualifiers'
56
+
57
+ specify "no error is raised if the method is never called at all" do
58
+ build_object_with_possible_methods(some_method: -> {}) do |subject|
59
+ double_creator = double_definition_creator_for(subject)
60
+ define_double_with_argument_expectation(double_creator, :some_method, 1)
61
+ end
62
+ end
63
+
64
+ specify "a DoubleNotFoundError is raised if the method is called but not with the specified arguments" do
65
+ object = build_object_with_possible_methods(some_method: -> {}) do |subject|
66
+ double_creator = double_definition_creator_for(subject)
67
+ define_double_with_argument_expectation(double_creator, :some_method, 1)
68
+ end
69
+ expect { object.some_method }.to raise_error(RR::Errors::DoubleNotFoundError)
70
+ end
71
+
72
+ specify "a TimesCalledError is raised the moment the method is called with the specified arguments" do
73
+ object = build_object_with_possible_methods(some_method: -> {}) do |subject|
74
+ double_creator = double_definition_creator_for(subject)
75
+ define_double_with_argument_expectation(double_creator, :some_method, 1)
76
+ end
77
+ expect { object.some_method(1) }.to raise_error(RR::Errors::TimesCalledError)
78
+ end
79
+
80
+ def define_double_with_argument_expectation(double_creator, method_name, *args)
81
+ double_creator.__send__(method_name, *args)
82
+ end
83
+ end
84
+
85
+ # https://github.com/rr/rr/issues/23
86
+ unless supports_strong?
87
+ context 'by using #with and arguments' do
88
+ include_context 'using 1 of 2 ways to define a method double with an argument expectation without any qualifiers'
89
+
90
+ specify "no error is raised if the method is never called at all" do
91
+ build_object_with_possible_methods(some_method: -> {}) do |subject|
92
+ double_creator = double_definition_creator_for(subject)
93
+ define_double_with_argument_expectation(double_creator, :some_method, 1)
94
+ end
95
+ end
96
+
97
+ specify "a DoubleNotFoundError is raised if the method is called but not with the specified arguments" do
98
+ object = build_object_with_possible_methods(some_method: -> {}) do |subject|
99
+ double_creator = double_definition_creator_for(subject)
100
+ define_double_with_argument_expectation(double_creator, :some_method, 1)
101
+ end
102
+ expect { object.some_method }.to raise_error(RR::Errors::DoubleNotFoundError)
103
+ end
104
+
105
+ specify "a TimesCalledError is raised the moment the method is called with the specified arguments" do
106
+ object = build_object_with_possible_methods(some_method: -> {}) do |subject|
107
+ double_creator = double_definition_creator_for(subject)
108
+ define_double_with_argument_expectation(double_creator, :some_method, 1)
109
+ end
110
+ expect { object.some_method(1) }.to raise_error(RR::Errors::TimesCalledError)
111
+ end
112
+
113
+ def define_double_with_argument_expectation(double_creator, method_name, *args)
114
+ double_creator.__send__(method_name).with(*args)
115
+ end
116
+ end
117
+ end
118
+ end
119
+
120
+ it_behaves_like 'defining method doubles using the block form of the double definition creator'
121
+ it_behaves_like 'defining a method double for sequential invocations of that method using #ordered/#then'
122
+ it_behaves_like 'an object which has a method double wrapped in an array and flattened'
123
+
124
+ if supports_proxying? && !supports_instance_of?
125
+ it_behaves_like 'defining a method double on an object which is a proxy for another object'
126
+ end
127
+
128
+ if methods_being_doubled_exist_already?
129
+ it "lets you double operator methods as well as normal ones" do
130
+ object = build_object do |subject|
131
+ double_definition_creator_for(subject).==(anything) { 'value' }
132
+ end
133
+ expect_call_to_return_or_raise_times_called_error('value', object, :==, :whatever)
134
+ end
135
+ end
136
+
137
+ if type_of_methods_being_tested == :class && methods_being_doubled_exist_already? && !supports_instance_of?
138
+ it "in a parent class doesn't affect child classes" do
139
+ parent_class = Class.new do
140
+ def self.some_method; 'existing value'; end
141
+ end
142
+ child_class = Class.new(parent_class)
143
+ double_creator = double_definition_creator_for(parent_class)
144
+ double_creator.some_method { 'value' }
145
+ expect(child_class.some_method).to eq 'existing value'
146
+ end
147
+ end
148
+ end