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
data/spec/suites/rspec_2/support/shared_contexts/double_definition_creators/mock_instance_of.rb
ADDED
|
@@ -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
|
data/spec/suites/rspec_2/support/shared_contexts/double_definition_creators/stub_instance_of.rb
ADDED
|
@@ -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
|
data/spec/suites/rspec_2/support/shared_examples/double_definition_creators/array_flatten_bug.rb
ADDED
|
@@ -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
|