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,26 @@
1
+ shared_context 'mock + instance_of' do
2
+ include MockDefinitionCreatorHelpers
3
+
4
+ context 'where subject is a class', method_type: :class do
5
+ include_context 'tests for a double definition creator method that supports mocking'
6
+
7
+ it "lets you stub methods which are called in #initialize" do
8
+ klass = Class.new do
9
+ def initialize; method_run_in_initialize; end
10
+ def method_run_in_initialize; end
11
+ end
12
+ method_double_called = false
13
+ double_creator = double_definition_creator_for(klass)
14
+ double_creator.method_run_in_initialize { method_double_called = true }
15
+ klass.new
16
+ expect(method_double_called).to eq true
17
+ end
18
+ end
19
+
20
+ context 'where subject is an instance of a class', method_type: :instance do
21
+ it "doesn't work" do
22
+ double_creator = double_definition_creator_for(Object.new)
23
+ expect { double_creator.some_method }.to raise_error(ArgumentError)
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,28 @@
1
+ shared_context 'mock + instance_of + strong' do
2
+ include MockDefinitionCreatorHelpers
3
+
4
+ context 'where subject is a class', method_type: :class do
5
+ include_context 'tests for a double definition creator method that supports stubbing'
6
+
7
+ it_behaves_like 'comparing the arity between the method and double definition'
8
+
9
+ it "lets you stub methods which are called in #initialize" do
10
+ klass = Class.new do
11
+ def initialize; method_run_in_initialize; end
12
+ def method_run_in_initialize; end
13
+ end
14
+ method_double_called = false
15
+ double_creator = double_definition_creator_for(klass)
16
+ double_creator.method_run_in_initialize { method_double_called = true }
17
+ klass.new
18
+ expect(method_double_called).to eq true
19
+ end
20
+ end
21
+
22
+ context 'where subject is an instance of a class', method_type: :instance do
23
+ it "doesn't work" do
24
+ double_creator = double_definition_creator_for(Object.new)
25
+ expect { double_creator.some_method }.to raise_error(ArgumentError)
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,11 @@
1
+ shared_context 'mock + proxy' do
2
+ include ProxyDefinitionCreatorHelpers
3
+
4
+ context 'against instance methods', method_type: :instance do
5
+ include_context 'tests for a double definition creator method that supports mocking'
6
+ end
7
+
8
+ context 'against class methods', method_type: :class do
9
+ include_context 'tests for a double definition creator method that supports mocking'
10
+ end
11
+ end
@@ -0,0 +1,37 @@
1
+ shared_context 'mock + strong' do
2
+ include MockDefinitionCreatorHelpers
3
+
4
+ context 'against instance methods', method_type: :instance do
5
+ context 'that exist', methods_exist: true do
6
+ include_context 'tests for a double definition creator method that supports mocking'
7
+
8
+ it_behaves_like 'comparing the arity between the method and double definition'
9
+ end
10
+
11
+ context 'that do not exist', methods_exist: false do
12
+ it "doesn't work" do
13
+ object = Object.new
14
+ double_creator = double_definition_creator_for(object)
15
+ expect { double_creator.some_method }.to \
16
+ raise_error(RR::Errors::SubjectDoesNotImplementMethodError)
17
+ end
18
+ end
19
+ end
20
+
21
+ context 'against class methods', method_type: :class do
22
+ context 'that exist', methods_exist: true do
23
+ include_context 'tests for a double definition creator method that supports mocking'
24
+
25
+ it_behaves_like 'comparing the arity between the method and double definition'
26
+ end
27
+
28
+ context 'that do not exist', methods_exist: false do
29
+ it "doesn't work" do
30
+ klass = Class.new
31
+ double_creator = double_definition_creator_for(klass)
32
+ expect { double_creator.some_method }.to \
33
+ raise_error(RR::Errors::SubjectDoesNotImplementMethodError)
34
+ end
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,107 @@
1
+ shared_context 'tests for a double definition creator method that supports mocking' do
2
+ include DoubleDefinitionCreatorHelpers
3
+
4
+ specify "TimesCalledError is raised at the verify step if the method is never called" do
5
+ build_object_with_possible_methods(some_method: -> {}) do |subject|
6
+ double_creator = double_definition_creator_for(subject)
7
+ double_creator.some_method
8
+ end
9
+ expect { RR.verify }.to raise_error(RR::Errors::TimesCalledError)
10
+ end
11
+
12
+ it_behaves_like 'defining a method double that sets the implementation of that method'
13
+
14
+ context 'defining a mock with an argument expectation with a times-called qualifier' do
15
+ context 'by passing arguments to the double definition directly' do
16
+ include_context 'using 1 of 2 ways to define a mock with an argument expectation with a times-called qualifier'
17
+
18
+ def define_double_with_argument_expectation(double_creator, method_name, *args)
19
+ double_creator.__send__(method_name, *args)
20
+ end
21
+ end
22
+
23
+ # https://github.com/rr/rr/issues/23
24
+ unless supports_strong?
25
+ context 'by using #with and arguments' do
26
+ include_context 'using 1 of 2 ways to define a mock with an argument expectation with a times-called qualifier'
27
+
28
+ def define_double_with_argument_expectation(double_creator, method_name, *args)
29
+ double_creator.__send__(method_name).with(*args)
30
+ end
31
+ end
32
+ end
33
+ end
34
+
35
+ context 'defining a mock with an argument expectation with a never-called qualifier' do
36
+ context 'by passing arguments to the double definition directly' do
37
+ include_context 'using 1 of 2 ways to define a mock with an argument expectation with a never-called qualifier'
38
+
39
+ def define_double_with_argument_expectation(double_creator, method_name, *args)
40
+ double_creator.__send__(method_name, *args)
41
+ end
42
+ end
43
+
44
+ # https://github.com/rr/rr/issues/23
45
+ unless supports_strong?
46
+ context 'by using #with and arguments' do
47
+ include_context 'using 1 of 2 ways to define a mock with an argument expectation with a never-called qualifier'
48
+
49
+ def define_double_with_argument_expectation(double_creator, method_name, *args)
50
+ double_creator.__send__(method_name).with(*args)
51
+ end
52
+ end
53
+ end
54
+ end
55
+
56
+ context 'defining a mock with an argument expectation without any qualifiers' do
57
+ context 'by passing arguments to the double definition directly' do
58
+ include_context 'using 1 of 2 ways to define a method double with an argument expectation without any qualifiers'
59
+
60
+ def define_double_with_argument_expectation(double_creator, method_name, *args)
61
+ double_creator.__send__(method_name, *args)
62
+ end
63
+ end
64
+
65
+ # https://github.com/rr/rr/issues/23
66
+ unless supports_strong?
67
+ context 'by using #with and arguments' do
68
+ include_context 'using 1 of 2 ways to define a method double with an argument expectation without any qualifiers'
69
+
70
+ def define_double_with_argument_expectation(double_creator, method_name, *args)
71
+ double_creator.__send__(method_name).with(*args)
72
+ end
73
+ end
74
+ end
75
+ end
76
+
77
+ it_behaves_like 'defining a method double qualified with #yields'
78
+ it_behaves_like 'defining method doubles using the block form of the double definition creator'
79
+ it_behaves_like 'defining a method double for sequential invocations of that method using #ordered/#then'
80
+ it_behaves_like 'an object which has a method double wrapped in an array and flattened'
81
+
82
+ if supports_proxying? && !supports_instance_of?
83
+ it_behaves_like 'defining a method double on an object which is a proxy for another object'
84
+ end
85
+
86
+ if methods_being_doubled_exist_already?
87
+ it "lets you double operator methods as well as normal ones" do
88
+ object = build_object do |subject|
89
+ double_definition_creator_for(subject).==(anything) { 'value' }
90
+ end
91
+ expect(object == :whatever).to eq 'value'
92
+ end
93
+ end
94
+
95
+ if type_of_methods_being_tested == :class && methods_being_doubled_exist_already? && !supports_instance_of?
96
+ it "in a parent class doesn't affect child classes" do
97
+ parent_class = Class.new do
98
+ def self.some_method; 'existing value'; end
99
+ end
100
+ child_class = Class.new(parent_class)
101
+ double_creator = double_definition_creator_for(parent_class)
102
+ double_creator.some_method { 'value' }
103
+ parent_class.some_method
104
+ expect(child_class.some_method).to eq 'existing value'
105
+ end
106
+ end
107
+ end
@@ -0,0 +1,32 @@
1
+ shared_context 'stub + instance_of' do
2
+ include StubDefinitionCreatorHelpers
3
+
4
+ context 'where subject is a class', method_type: :class do
5
+ context 'where methods being doubled already exist', methods_exist: true do
6
+ include_context 'tests for a double definition creator method that supports stubbing'
7
+
8
+ it "lets you stub methods which are called in #initialize" do
9
+ klass = Class.new do
10
+ def initialize; method_run_in_initialize; end
11
+ def method_run_in_initialize; end
12
+ end
13
+ method_double_called = false
14
+ double_creator = double_definition_creator_for(klass)
15
+ double_creator.method_run_in_initialize { method_double_called = true }
16
+ klass.new
17
+ expect(method_double_called).to eq true
18
+ end
19
+ end
20
+
21
+ context 'where methods being doubled do not already exist', methods_exist: false do
22
+ include_context 'tests for a double definition creator method that supports stubbing'
23
+ end
24
+ end
25
+
26
+ context 'where subject is an instance of a class', method_type: :instance do
27
+ it "doesn't work" do
28
+ double_creator = double_definition_creator_for(Object.new)
29
+ expect { double_creator.some_method }.to raise_error(ArgumentError)
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,39 @@
1
+ shared_context 'stub + instance_of + strong' do
2
+ include StubDefinitionCreatorHelpers
3
+
4
+ context 'where subject is a class', method_type: :class do
5
+ context 'where methods being doubled already exist', methods_exist: true do
6
+ include_context 'tests for a double definition creator method that supports stubbing'
7
+
8
+ it_behaves_like 'comparing the arity between the method and double definition'
9
+
10
+ it "lets you stub methods which are called in #initialize" do
11
+ klass = Class.new do
12
+ def initialize; method_run_in_initialize; end
13
+ def method_run_in_initialize; end
14
+ end
15
+ method_double_called = false
16
+ double_creator = double_definition_creator_for(klass)
17
+ double_creator.method_run_in_initialize { method_double_called = true }
18
+ klass.new
19
+ expect(method_double_called).to eq true
20
+ end
21
+ end
22
+
23
+ context 'where methods being doubled do not already exist', methods_exist: false do
24
+ it "doesn't work" do
25
+ klass = Class.new
26
+ double_creator = double_definition_creator_for(klass)
27
+ expect { double_creator.some_method }.to \
28
+ raise_error(RR::Errors::SubjectDoesNotImplementMethodError)
29
+ end
30
+ end
31
+ end
32
+
33
+ context 'where subject is an instance of a class', method_type: :instance do
34
+ it "doesn't work" do
35
+ double_creator = double_definition_creator_for(Object.new)
36
+ expect { double_creator.some_method }.to raise_error(ArgumentError)
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,11 @@
1
+ shared_context 'stub + proxy' do
2
+ include ProxyDefinitionCreatorHelpers
3
+
4
+ context 'against instance methods', method_type: :instance do
5
+ include_context 'tests for a double definition creator method that supports stubbing'
6
+ end
7
+
8
+ context 'against class methods', method_type: :class do
9
+ include_context 'tests for a double definition creator method that supports stubbing'
10
+ end
11
+ end
@@ -0,0 +1,37 @@
1
+ shared_context 'stub + strong' do
2
+ include StubDefinitionCreatorHelpers
3
+
4
+ context 'against instance methods', method_type: :instance do
5
+ context 'that exist', methods_exist: true do
6
+ include_context 'tests for a double definition creator method that supports stubbing'
7
+
8
+ it_behaves_like 'comparing the arity between the method and double definition'
9
+ end
10
+
11
+ context 'that do not exist', methods_exist: false do
12
+ it "doesn't work" do
13
+ object = Object.new
14
+ double_creator = double_definition_creator_for(object)
15
+ expect { double_creator.some_method }.to \
16
+ raise_error(RR::Errors::SubjectDoesNotImplementMethodError)
17
+ end
18
+ end
19
+ end
20
+
21
+ context 'against class methods', method_type: :class do
22
+ context 'that exist', methods_exist: true do
23
+ include_context 'tests for a double definition creator method that supports stubbing'
24
+
25
+ it_behaves_like 'comparing the arity between the method and double definition'
26
+ end
27
+
28
+ context 'that do not exist', methods_exist: false do
29
+ it "doesn't work" do
30
+ klass = Class.new
31
+ double_creator = double_definition_creator_for(klass)
32
+ expect { double_creator.some_method }.to \
33
+ raise_error(RR::Errors::SubjectDoesNotImplementMethodError)
34
+ end
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,57 @@
1
+ shared_context 'tests for a double definition creator method that supports stubbing' do
2
+ include DoubleDefinitionCreatorHelpers
3
+
4
+ it_behaves_like 'defining a method double that sets the implementation of that method'
5
+
6
+ context 'defining a method double with an argument expectation' do
7
+ context 'by passing arguments to the double definition directly' do
8
+ include_context 'using 1 of 2 ways to define a method double with an argument expectation without any qualifiers'
9
+
10
+ def define_double_with_argument_expectation(double_creator, method_name, *args)
11
+ double_creator.__send__(method_name, *args)
12
+ end
13
+ end
14
+
15
+ # https://github.com/rr/rr/issues/23
16
+ unless supports_strong?
17
+ context 'by using #with and arguments' do
18
+ include_context 'using 1 of 2 ways to define a method double with an argument expectation without any qualifiers'
19
+
20
+ def define_double_with_argument_expectation(double_creator, method_name, *args)
21
+ double_creator.__send__(method_name).with(*args)
22
+ end
23
+ end
24
+ end
25
+ end
26
+
27
+ it_behaves_like 'defining a method double qualified with #yields'
28
+ it_behaves_like 'defining method doubles using the block form of the double definition creator'
29
+ it_behaves_like 'defining a method double for sequential invocations of that method using #ordered/#then'
30
+ it_behaves_like 'an object which has a method double wrapped in an array and flattened'
31
+
32
+ if supports_proxying? && !supports_instance_of?
33
+ it_behaves_like 'defining a method double on an object which is a proxy for another object'
34
+ end
35
+
36
+ if methods_being_doubled_exist_already?
37
+ it "lets you double operator methods as well as normal ones" do
38
+ object = build_object do |subject|
39
+ double_definition_creator_for(subject).==(anything) { 'value' }
40
+ end
41
+ expect(object == :whatever).to eq 'value'
42
+ end
43
+ end
44
+
45
+ if type_of_methods_being_tested == :class && methods_being_doubled_exist_already? && !supports_instance_of?
46
+ it "in a parent class doesn't affect child classes" do
47
+ parent_class = Class.new do
48
+ def self.some_method; 'existing value'; end
49
+ end
50
+ child_class = Class.new(parent_class)
51
+ double_creator = double_definition_creator_for(parent_class)
52
+ double_creator.some_method { 'value' }
53
+ parent_class.some_method
54
+ expect(child_class.some_method).to eq 'existing value'
55
+ end
56
+ end
57
+ end
@@ -0,0 +1,35 @@
1
+ # btakita/rr issue #44
2
+ shared_examples_for 'an object which has a method double wrapped in an array and flattened' do
3
+ include DoubleDefinitionCreatorHelpers
4
+
5
+ it "does not raise an error" do
6
+ object = build_object_with_possible_methods(some_method: -> {}) do |subject|
7
+ double_definition_creator_for(subject).some_method
8
+ end
9
+ # force RR to define method_missing
10
+ call_method_rescuing_times_called_error(object, :some_method)
11
+ expect([object].flatten).to eq [object]
12
+ end
13
+
14
+ it "honors a #to_ary that already exists" do
15
+ object = build_object_with_possible_methods(some_method: -> {}) do |subject, object|
16
+ (class << object; self; end).class_eval do
17
+ def to_ary; []; end
18
+ end
19
+ double_definition_creator_for(subject).some_method
20
+ end
21
+ # force RR to define method_missing
22
+ call_method_rescuing_times_called_error(object, :some_method)
23
+ expect([object].flatten).to eq []
24
+ end
25
+
26
+ it "is reset correctly" do
27
+ object = build_object_with_possible_methods(some_method: -> {}) do |subject|
28
+ double_definition_creator_for(subject).some_method
29
+ end
30
+ # force RR to define method_missing
31
+ call_method_rescuing_times_called_error(object, :some_method)
32
+ RR.reset
33
+ expect([object].flatten).to eq [object]
34
+ end
35
+ end
@@ -0,0 +1,31 @@
1
+ shared_examples_for 'defining method doubles using the block form of the double definition creator' do
2
+ include DoubleDefinitionCreatorHelpers
3
+
4
+ it "allows multiple methods to be doubled" do
5
+ object = build_object_with_possible_methods(
6
+ some_method: -> { 'existing value 1' },
7
+ another_method: -> { 'existing value 2' }
8
+ ) do |subject|
9
+ double_definition_creator_for(subject) do
10
+ some_method { 'value 1' }
11
+ another_method { 'value 2' }
12
+ end
13
+ end
14
+ expect_call_to_return_or_raise_times_called_error('value 1', object, :some_method)
15
+ expect_call_to_return_or_raise_times_called_error('value 2', object, :another_method)
16
+ end
17
+
18
+ it "yields rather than using instance_eval if a block argument is given" do
19
+ object = build_object_with_possible_methods(
20
+ some_method: -> { 'existing value 1' },
21
+ another_method: -> { 'existing value 2' }
22
+ ) do |subject|
23
+ double_definition_creator_for(subject) do |double_creator|
24
+ double_creator.some_method { 'value 1' }
25
+ double_creator.another_method { 'value 2' }
26
+ end
27
+ end
28
+ expect_call_to_return_or_raise_times_called_error('value 1', object, :some_method)
29
+ expect_call_to_return_or_raise_times_called_error('value 2', object, :another_method)
30
+ end
31
+ end