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.
- checksums.yaml +5 -5
- data/Appraisals +6 -0
- data/CHANGES.md +102 -1
- data/CREDITS.md +5 -0
- data/Gemfile +3 -0
- data/README.md +91 -110
- data/Rakefile +43 -0
- data/doc/02_syntax_comparison.md +1 -0
- data/gemfiles/ruby_19_rspec_2.gemfile +14 -0
- data/gemfiles/ruby_19_rspec_2.gemfile.lock +49 -0
- data/gemfiles/ruby_19_rspec_2_rails_4.gemfile +15 -0
- data/gemfiles/ruby_19_rspec_2_rails_4.gemfile.lock +119 -0
- data/lib/rr/class_instance_method_defined.rb +1 -1
- data/lib/rr/core_ext/array.rb +2 -0
- data/lib/rr/core_ext/hash.rb +2 -0
- data/lib/rr/deprecations.rb +97 -0
- data/lib/rr/double.rb +28 -10
- data/lib/rr/double_definitions/double_definition.rb +39 -16
- data/lib/rr/double_definitions/double_definition_create.rb +5 -5
- data/lib/rr/double_definitions/double_definition_create_blank_slate.rb +10 -4
- data/lib/rr/double_definitions/double_injections/any_instance_of.rb +1 -1
- data/lib/rr/double_definitions/double_injections/instance.rb +2 -2
- data/lib/rr/double_definitions/strategies/strategy.rb +27 -8
- data/lib/rr/double_definitions/strategies/verification/mock.rb +8 -2
- data/lib/rr/double_matches.rb +4 -3
- data/lib/rr/dsl.rb +152 -0
- data/lib/rr/expectations/any_argument_expectation.rb +4 -4
- data/lib/rr/expectations/argument_equality_expectation.rb +43 -5
- data/lib/rr/injections/double_injection.rb +67 -19
- data/lib/rr/injections/method_missing_injection.rb +37 -6
- data/lib/rr/integrations.rb +13 -12
- data/lib/rr/integrations/decorator.rb +4 -1
- data/lib/rr/integrations/minitest_4.rb +1 -1
- data/lib/rr/integrations/minitest_4_active_support.rb +1 -1
- data/lib/rr/integrations/rspec/invocation_matcher.rb +0 -8
- data/lib/rr/integrations/rspec_2.rb +28 -3
- data/lib/rr/keyword_arguments.rb +15 -0
- data/lib/rr/method_dispatches/base_method_dispatch.rb +22 -5
- data/lib/rr/method_dispatches/method_dispatch.rb +21 -10
- data/lib/rr/method_dispatches/method_missing_dispatch.rb +14 -5
- data/lib/rr/recorded_call.rb +35 -0
- data/lib/rr/recorded_calls.rb +23 -9
- data/lib/rr/space.rb +15 -5
- data/lib/rr/spy_verification.rb +13 -5
- data/lib/rr/version.rb +1 -2
- data/lib/rr/wildcard_matchers.rb +10 -10
- data/lib/rr/without_autohook.rb +7 -14
- data/rr.gemspec +14 -5
- data/spec/custom_formatter_for_rspec.rb +18 -0
- data/spec/custom_formatter_for_rspec_2.rb +40 -0
- data/spec/defines_spec_suite_tasks.rb +57 -0
- data/spec/fixtures/rubygems_patch_for_187.rb +598 -0
- data/spec/global_helper.rb +38 -0
- data/spec/spec.opts +3 -0
- data/spec/spec_suite_configuration.rb +126 -0
- data/spec/spec_suite_runner.rb +47 -0
- data/spec/suites.yml +10 -0
- data/spec/suites/rspec_2/functional/any_instance_of_spec.rb +147 -0
- data/spec/suites/rspec_2/functional/dont_allow_spec.rb +17 -0
- data/spec/suites/rspec_2/functional/mock_bang_spec.rb +20 -0
- data/spec/suites/rspec_2/functional/mock_instance_of_spec.rb +14 -0
- data/spec/suites/rspec_2/functional/mock_instance_of_strong_spec.rb +15 -0
- data/spec/suites/rspec_2/functional/mock_proxy_instance_of_spec.rb +15 -0
- data/spec/suites/rspec_2/functional/mock_proxy_spec.rb +14 -0
- data/spec/suites/rspec_2/functional/mock_spec.rb +17 -0
- data/spec/suites/rspec_2/functional/mock_strong_spec.rb +14 -0
- data/spec/suites/rspec_2/functional/received_spec.rb +16 -0
- data/spec/suites/rspec_2/functional/spy_spec.rb +102 -0
- data/spec/suites/rspec_2/functional/stub_bang_spec.rb +20 -0
- data/spec/suites/rspec_2/functional/stub_instance_of_spec.rb +15 -0
- data/spec/suites/rspec_2/functional/stub_instance_of_strong_spec.rb +15 -0
- data/spec/suites/rspec_2/functional/stub_proxy_instance_of_spec.rb +16 -0
- data/spec/suites/rspec_2/functional/stub_proxy_spec.rb +45 -0
- data/spec/suites/rspec_2/functional/stub_spec.rb +71 -0
- data/spec/suites/rspec_2/functional/stub_strong_spec.rb +15 -0
- data/spec/suites/rspec_2/functional/wildcard_matchers_spec.rb +128 -0
- data/spec/suites/rspec_2/helper.rb +28 -0
- data/spec/suites/rspec_2/integration/minitest_4_spec.rb +109 -0
- data/spec/suites/rspec_2/integration/minitest_spec.rb +109 -0
- data/spec/suites/rspec_2/spec_helper.rb +3 -0
- data/spec/suites/rspec_2/support/matchers/wildcard_matcher_matchers.rb +32 -0
- data/spec/suites/rspec_2/support/mixins/double_definition_creator_helpers.rb +173 -0
- data/spec/suites/rspec_2/support/mixins/mock_definition_creator_helpers.rb +45 -0
- data/spec/suites/rspec_2/support/mixins/proxy_definition_creator_helpers.rb +33 -0
- data/spec/suites/rspec_2/support/mixins/stub_creator_helpers.rb +43 -0
- data/spec/suites/rspec_2/support/mixins/stub_definition_creator_helpers.rb +45 -0
- data/spec/suites/rspec_2/support/shared_contexts/double_definition_creators/argument_expectations_with_never_called_qualifier.rb +39 -0
- data/spec/suites/rspec_2/support/shared_contexts/double_definition_creators/argument_expectations_with_times_called_qualifier.rb +50 -0
- data/spec/suites/rspec_2/support/shared_contexts/double_definition_creators/argument_expectations_without_qualifiers.rb +131 -0
- data/spec/suites/rspec_2/support/shared_contexts/double_definition_creators/dont_allow.rb +148 -0
- data/spec/suites/rspec_2/support/shared_contexts/double_definition_creators/mock_instance_of.rb +26 -0
- data/spec/suites/rspec_2/support/shared_contexts/double_definition_creators/mock_instance_of_strong.rb +28 -0
- data/spec/suites/rspec_2/support/shared_contexts/double_definition_creators/mock_proxy.rb +11 -0
- data/spec/suites/rspec_2/support/shared_contexts/double_definition_creators/mock_strong.rb +37 -0
- data/spec/suites/rspec_2/support/shared_contexts/double_definition_creators/mocking.rb +107 -0
- data/spec/suites/rspec_2/support/shared_contexts/double_definition_creators/stub_instance_of.rb +32 -0
- data/spec/suites/rspec_2/support/shared_contexts/double_definition_creators/stub_instance_of_strong.rb +39 -0
- data/spec/suites/rspec_2/support/shared_contexts/double_definition_creators/stub_proxy.rb +11 -0
- data/spec/suites/rspec_2/support/shared_contexts/double_definition_creators/stub_strong.rb +37 -0
- data/spec/suites/rspec_2/support/shared_contexts/double_definition_creators/stubbing.rb +57 -0
- data/spec/suites/rspec_2/support/shared_examples/double_definition_creators/array_flatten_bug.rb +35 -0
- data/spec/suites/rspec_2/support/shared_examples/double_definition_creators/block_form.rb +31 -0
- data/spec/suites/rspec_2/support/shared_examples/double_definition_creators/comparing_arity.rb +63 -0
- data/spec/suites/rspec_2/support/shared_examples/double_definition_creators/object_is_proxy.rb +43 -0
- data/spec/suites/rspec_2/support/shared_examples/double_definition_creators/sequential_invocations.rb +26 -0
- data/spec/suites/rspec_2/support/shared_examples/double_definition_creators/setting_implementation.rb +51 -0
- data/spec/suites/rspec_2/support/shared_examples/double_definition_creators/yields.rb +81 -0
- data/spec/suites/rspec_2/support/shared_examples/space.rb +13 -0
- data/spec/suites/rspec_2/support/shared_examples/times_called_expectation.rb +9 -0
- data/spec/suites/rspec_2/unit/core_ext/array_spec.rb +39 -0
- data/spec/suites/rspec_2/unit/core_ext/enumerable_spec.rb +53 -0
- data/spec/suites/rspec_2/unit/core_ext/hash_spec.rb +55 -0
- data/spec/suites/rspec_2/unit/core_ext/range_spec.rb +41 -0
- data/spec/suites/rspec_2/unit/core_ext/regexp_spec.rb +41 -0
- data/spec/suites/rspec_2/unit/deprecations_spec.rb +27 -0
- data/spec/suites/rspec_2/unit/double_definitions/child_double_definition_create_spec.rb +114 -0
- data/spec/suites/rspec_2/unit/double_definitions/double_definition_create_blank_slate_spec.rb +93 -0
- data/spec/suites/rspec_2/unit/double_definitions/double_definition_create_spec.rb +446 -0
- data/spec/suites/rspec_2/unit/dsl/double_creators_spec.rb +133 -0
- data/spec/suites/rspec_2/unit/dsl/space_spec.rb +99 -0
- data/spec/suites/rspec_2/unit/dsl/wildcard_matchers_spec.rb +67 -0
- data/spec/suites/rspec_2/unit/errors/rr_error_spec.rb +67 -0
- data/spec/suites/rspec_2/unit/expectations/any_argument_expectation_spec.rb +48 -0
- data/spec/suites/rspec_2/unit/expectations/anything_argument_equality_expectation_spec.rb +14 -0
- data/spec/suites/rspec_2/unit/expectations/argument_equality_expectation_spec.rb +135 -0
- data/spec/suites/rspec_2/unit/expectations/boolean_argument_equality_expectation_spec.rb +30 -0
- data/spec/suites/rspec_2/unit/expectations/hash_including_argument_equality_expectation_spec.rb +92 -0
- data/spec/suites/rspec_2/unit/expectations/satisfy_argument_equality_expectation_spec.rb +61 -0
- data/spec/suites/rspec_2/unit/expectations/times_called_expectation/any_times_matcher_spec.rb +22 -0
- data/spec/suites/rspec_2/unit/expectations/times_called_expectation/at_least_matcher_spec.rb +37 -0
- data/spec/suites/rspec_2/unit/expectations/times_called_expectation/at_most_matcher_spec.rb +43 -0
- data/spec/suites/rspec_2/unit/expectations/times_called_expectation/integer_matcher_spec.rb +58 -0
- data/spec/suites/rspec_2/unit/expectations/times_called_expectation/proc_matcher_spec.rb +35 -0
- data/spec/suites/rspec_2/unit/expectations/times_called_expectation/range_matcher_spec.rb +39 -0
- data/spec/suites/rspec_2/unit/hash_with_object_id_key_spec.rb +88 -0
- data/spec/suites/rspec_2/unit/injections/double_injection/double_injection_spec.rb +533 -0
- data/spec/suites/rspec_2/unit/injections/double_injection/double_injection_verify_spec.rb +32 -0
- data/spec/suites/rspec_2/unit/integrations/rspec/invocation_matcher_spec.rb +297 -0
- data/spec/suites/rspec_2/unit/integrations/rspec_spec.rb +70 -0
- data/spec/suites/rspec_2/unit/rr_spec.rb +28 -0
- data/spec/suites/rspec_2/unit/space_spec.rb +598 -0
- data/spec/suites/rspec_2/unit/spy_verification_spec.rb +133 -0
- data/spec/suites/rspec_2/unit/times_called_matchers/any_times_matcher_spec.rb +46 -0
- data/spec/suites/rspec_2/unit/times_called_matchers/at_least_matcher_spec.rb +54 -0
- data/spec/suites/rspec_2/unit/times_called_matchers/at_most_matcher_spec.rb +69 -0
- data/spec/suites/rspec_2/unit/times_called_matchers/integer_matcher_spec.rb +69 -0
- data/spec/suites/rspec_2/unit/times_called_matchers/proc_matcher_spec.rb +54 -0
- data/spec/suites/rspec_2/unit/times_called_matchers/range_matcher_spec.rb +75 -0
- data/spec/suites/rspec_2/unit/times_called_matchers/times_called_matcher_spec.rb +117 -0
- data/spec/suites/rspec_2/unit/wildcard_matchers/anything_spec.rb +33 -0
- data/spec/suites/rspec_2/unit/wildcard_matchers/boolean_spec.rb +45 -0
- data/spec/suites/rspec_2/unit/wildcard_matchers/duck_type_spec.rb +64 -0
- data/spec/suites/rspec_2/unit/wildcard_matchers/hash_including_spec.rb +64 -0
- data/spec/suites/rspec_2/unit/wildcard_matchers/is_a_spec.rb +55 -0
- data/spec/suites/rspec_2/unit/wildcard_matchers/numeric_spec.rb +46 -0
- data/spec/suites/rspec_2/unit/wildcard_matchers/satisfy_spec.rb +57 -0
- data/spec/support/adapter.rb +22 -0
- data/spec/support/adapter_tests/base.rb +45 -0
- data/spec/support/adapter_tests/minitest.rb +7 -0
- data/spec/support/adapter_tests/rspec.rb +70 -0
- data/spec/support/adapter_tests/test_unit.rb +47 -0
- data/spec/support/command_runner.rb +105 -0
- data/spec/support/generator.rb +56 -0
- data/spec/support/integration_tests/base.rb +64 -0
- data/spec/support/integration_tests/rails.rb +60 -0
- data/spec/support/integration_tests/rails_minitest.rb +13 -0
- data/spec/support/integration_tests/rails_rspec.rb +13 -0
- data/spec/support/integration_tests/rails_test_unit.rb +13 -0
- data/spec/support/integration_tests/rails_test_unit_like.rb +13 -0
- data/spec/support/integration_tests/ruby.rb +7 -0
- data/spec/support/integration_tests/ruby_minitest.rb +13 -0
- data/spec/support/integration_tests/ruby_rspec.rb +13 -0
- data/spec/support/integration_tests/ruby_test_unit.rb +13 -0
- data/spec/support/matchers/be_a_subset_of_matcher.rb +24 -0
- data/spec/support/project/cucumber.rb +50 -0
- data/spec/support/project/generator.rb +348 -0
- data/spec/support/project/minitest.rb +39 -0
- data/spec/support/project/rails.rb +199 -0
- data/spec/support/project/rails_minitest.rb +17 -0
- data/spec/support/project/rails_rspec.rb +50 -0
- data/spec/support/project/rails_test_unit.rb +17 -0
- data/spec/support/project/rails_test_unit_like.rb +17 -0
- data/spec/support/project/rspec.rb +69 -0
- data/spec/support/project/ruby.rb +34 -0
- data/spec/support/project/ruby_minitest.rb +11 -0
- data/spec/support/project/ruby_rspec.rb +29 -0
- data/spec/support/project/ruby_test_unit.rb +11 -0
- data/spec/support/project/ruby_test_unit_like.rb +21 -0
- data/spec/support/project/test_unit.rb +29 -0
- data/spec/support/project/test_unit_like.rb +7 -0
- data/spec/support/project/tests_runner.rb +22 -0
- data/spec/support/test.sqlite3 +0 -0
- data/spec/support/test_case/generator.rb +53 -0
- data/spec/support/test_case/minitest.rb +13 -0
- data/spec/support/test_case/rspec.rb +19 -0
- data/spec/support/test_case/test_unit.rb +21 -0
- data/spec/support/test_file/generator.rb +120 -0
- data/spec/support/test_file/minitest.rb +19 -0
- data/spec/support/test_file/rails_minitest.rb +7 -0
- data/spec/support/test_file/rails_rspec.rb +12 -0
- data/spec/support/test_file/rails_test_unit.rb +25 -0
- data/spec/support/test_file/rspec.rb +33 -0
- data/spec/support/test_file/test_unit.rb +36 -0
- data/spec/support/test_helper/generator.rb +27 -0
- data/spec/support/test_helper/minitest.rb +7 -0
- data/spec/support/test_helper/rails.rb +31 -0
- data/spec/support/test_helper/rails_minitest.rb +7 -0
- data/spec/support/test_helper/rails_rspec.rb +25 -0
- data/spec/support/test_helper/rails_test_unit.rb +23 -0
- data/spec/support/test_helper/rspec.rb +7 -0
- data/spec/support/test_helper/ruby.rb +31 -0
- data/spec/support/test_helper/test_unit.rb +7 -0
- metadata +240 -19
- data/VERSION +0 -1
- data/lib/rr/adapters.rb +0 -44
- data/lib/rr/adapters/rr_methods.rb +0 -142
- data/lib/rr/integrations/rspec_1.rb +0 -46
- data/lib/rr/integrations/test_unit_1.rb +0 -63
- data/lib/rr/integrations/test_unit_2.rb +0 -15
- data/lib/rr/integrations/test_unit_200.rb +0 -27
- data/lib/rr/integrations/test_unit_200_active_support.rb +0 -25
- data/lib/rr/integrations/test_unit_2_active_support.rb +0 -38
- 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
|