opal-connect-rspec 0.5.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 +7 -0
- data/.gitignore +5 -0
- data/.gitmodules +15 -0
- data/.travis.yml +51 -0
- data/.yardopts +5 -0
- data/CHANGELOG.md +54 -0
- data/Gemfile +19 -0
- data/README.md +325 -0
- data/Rakefile +169 -0
- data/config.ru +15 -0
- data/example/Gemfile +4 -0
- data/example/README.md +13 -0
- data/example/Rakefile +8 -0
- data/example/opal/user.rb +11 -0
- data/example/spec/user_spec.rb +15 -0
- data/gemfiles/opal_master.gemfile +18 -0
- data/lib/opal-rspec.rb +2 -0
- data/lib/opal/rspec.rb +39 -0
- data/lib/opal/rspec/cached_environment.rb +25 -0
- data/lib/opal/rspec/post_rack_locator.rb +20 -0
- data/lib/opal/rspec/pre_rack_locator.rb +32 -0
- data/lib/opal/rspec/rake_task.rb +132 -0
- data/lib/opal/rspec/sprockets_environment.rb +37 -0
- data/lib/opal/rspec/version.rb +5 -0
- data/opal-rspec.gemspec +21 -0
- data/opal/opal-rspec.rb +1 -0
- data/opal/opal/rspec.rb +23 -0
- data/opal/opal/rspec/async.rb +5 -0
- data/opal/opal/rspec/async/async_example.rb +96 -0
- data/opal/opal/rspec/async/example_group.rb +96 -0
- data/opal/opal/rspec/async/hooks.rb +10 -0
- data/opal/opal/rspec/async/legacy.rb +50 -0
- data/opal/opal/rspec/async/reporter.rb +9 -0
- data/opal/opal/rspec/fixes.rb +5 -0
- data/opal/opal/rspec/fixes/opal.rb +5 -0
- data/opal/opal/rspec/fixes/opal/class.rb +8 -0
- data/opal/opal/rspec/fixes/opal/compatibility.rb +228 -0
- data/opal/opal/rspec/fixes/opal/corelib.rb +3 -0
- data/opal/opal/rspec/fixes/opal/corelib/error.rb +61 -0
- data/opal/opal/rspec/fixes/opal/corelib/regexp.rb +92 -0
- data/opal/opal/rspec/fixes/opal/corelib/struct.rb +260 -0
- data/opal/opal/rspec/fixes/opal/kernel.rb +80 -0
- data/opal/opal/rspec/fixes/opal/stdlib.rb +2 -0
- data/opal/opal/rspec/fixes/opal/stdlib/pp.rb +23 -0
- data/opal/opal/rspec/fixes/opal/stdlib/set.rb +36 -0
- data/opal/opal/rspec/fixes/rspec.rb +7 -0
- data/opal/opal/rspec/fixes/rspec/caller_filter.rb +6 -0
- data/opal/opal/rspec/fixes/rspec/core.rb +9 -0
- data/opal/opal/rspec/fixes/rspec/core/configuration.rb +11 -0
- data/opal/opal/rspec/fixes/rspec/core/example.rb +20 -0
- data/opal/opal/rspec/fixes/rspec/core/example_group.rb +9 -0
- data/opal/opal/rspec/fixes/rspec/core/formatters.rb +6 -0
- data/opal/opal/rspec/fixes/rspec/core/formatters/backtrace_formatter.rb +20 -0
- data/opal/opal/rspec/fixes/rspec/core/formatters/console_codes.rb +11 -0
- data/opal/opal/rspec/fixes/rspec/core/formatters/deprecation_formatter.rb +20 -0
- data/opal/opal/rspec/fixes/rspec/core/formatters/generated_deprecation_message.rb +15 -0
- data/opal/opal/rspec/fixes/rspec/core/formatters/json_formatter.rb +10 -0
- data/opal/opal/rspec/fixes/rspec/core/formatters/loader.rb +38 -0
- data/opal/opal/rspec/fixes/rspec/core/metadata.rb +39 -0
- data/opal/opal/rspec/fixes/rspec/core/notifications.rb +3 -0
- data/opal/opal/rspec/fixes/rspec/core/notifications/examples_notification.rb +30 -0
- data/opal/opal/rspec/fixes/rspec/core/notifications/failed_example_notification.rb +20 -0
- data/opal/opal/rspec/fixes/rspec/core/notifications/summary_notification.rb +26 -0
- data/opal/opal/rspec/fixes/rspec/core/ordering.rb +1 -0
- data/opal/opal/rspec/fixes/rspec/core/ordering/random.rb +13 -0
- data/opal/opal/rspec/fixes/rspec/core/reporter.rb +14 -0
- data/opal/opal/rspec/fixes/rspec/core/warnings.rb +18 -0
- data/opal/opal/rspec/fixes/rspec/example_groups.rb +49 -0
- data/opal/opal/rspec/fixes/rspec/expectations.rb +2 -0
- data/opal/opal/rspec/fixes/rspec/expectations/fail_with.rb +21 -0
- data/opal/opal/rspec/fixes/rspec/expectations/syntax.rb +25 -0
- data/opal/opal/rspec/fixes/rspec/matchers.rb +2 -0
- data/opal/opal/rspec/fixes/rspec/matchers/built_in.rb +4 -0
- data/opal/opal/rspec/fixes/rspec/matchers/built_in/all.rb +10 -0
- data/opal/opal/rspec/fixes/rspec/matchers/built_in/compound.rb +15 -0
- data/opal/opal/rspec/fixes/rspec/matchers/built_in/start_and_end_with.rb +42 -0
- data/opal/opal/rspec/fixes/rspec/matchers/built_in/yield.rb +21 -0
- data/opal/opal/rspec/fixes/rspec/matchers/pretty.rb +15 -0
- data/opal/opal/rspec/fixes/rspec/mocks.rb +4 -0
- data/opal/opal/rspec/fixes/rspec/mocks/error_generator.rb +40 -0
- data/opal/opal/rspec/fixes/rspec/mocks/space.rb +37 -0
- data/opal/opal/rspec/fixes/rspec/mocks/test_double.rb +39 -0
- data/opal/opal/rspec/fixes/rspec/mocks/verifying_double.rb +29 -0
- data/opal/opal/rspec/fixes/rspec/support.rb +4 -0
- data/opal/opal/rspec/fixes/rspec/support/encoded_string.rb +10 -0
- data/opal/opal/rspec/fixes/rspec/support/fuzzy_matcher.rb +23 -0
- data/opal/opal/rspec/fixes/rspec/support/recursive_const_methods.rb +7 -0
- data/opal/opal/rspec/fixes/rspec/support/ruby_features.rb +8 -0
- data/opal/opal/rspec/fixes/rspec/support/warnings.rb +18 -0
- data/opal/opal/rspec/formatter/browser_formatter.rb +38 -0
- data/opal/opal/rspec/formatter/document_io.rb +27 -0
- data/opal/opal/rspec/formatter/element.rb +100 -0
- data/opal/opal/rspec/formatter/html_printer.rb +121 -0
- data/opal/opal/rspec/formatter/noop_flush_string_io.rb +9 -0
- data/opal/opal/rspec/formatter/opal_closed_tty_io.rb +27 -0
- data/opal/opal/rspec/pre_require_fixes.rb +11 -0
- data/opal/opal/rspec/requires.rb +145 -0
- data/opal/opal/rspec/runner.rb +91 -0
- data/opal/opal/rspec/spec_opts.rb.erb +28 -0
- data/opal/opal/rspec/sprockets_runner.rb.erb +13 -0
- data/rspec-core/benchmarks/call_v_yield.rb +81 -0
- data/rspec-core/benchmarks/check_inclusion.rb +125 -0
- data/rspec-core/benchmarks/define_method_v_attr_reader_v_def.rb +81 -0
- data/rspec-core/benchmarks/eager_vs_lazy_metadata.rb +126 -0
- data/rspec-core/benchmarks/eager_vs_lazy_metadata/define_examples.rb +22 -0
- data/rspec-core/benchmarks/filter_object.rb +35 -0
- data/rspec-core/benchmarks/index_v_take_while.rb +47 -0
- data/rspec-core/benchmarks/map_then_flatten_vs_flat_map_benchmarks.rb +94 -0
- data/rspec-core/benchmarks/require_relative_v_require.rb +75 -0
- data/rspec-core/benchmarks/respond_to_v_defined.rb +72 -0
- data/rspec-core/benchmarks/several_regexps_v_one_big_one.rb +86 -0
- data/rspec-core/benchmarks/sort_by_v_shuffle.rb +83 -0
- data/rspec-core/benchmarks/to_proc_v_not_to_proc.rb +539 -0
- data/rspec-core/features/step_definitions/additional_cli_steps.rb +126 -0
- data/rspec-core/features/step_definitions/core_standalone_steps.rb +12 -0
- data/rspec-core/features/support/env.rb +21 -0
- data/rspec-core/features/support/require_expect_syntax_in_aruba_specs.rb +29 -0
- data/rspec-core/features/support/rubinius.rb +6 -0
- data/rspec-core/lib/rspec/autorun.rb +2 -0
- data/rspec-core/lib/rspec/core.rb +169 -0
- data/rspec-core/lib/rspec/core/backport_random.rb +336 -0
- data/rspec-core/lib/rspec/core/backtrace_formatter.rb +66 -0
- data/rspec-core/lib/rspec/core/configuration.rb +1440 -0
- data/rspec-core/lib/rspec/core/configuration_options.rb +173 -0
- data/rspec-core/lib/rspec/core/drb.rb +111 -0
- data/rspec-core/lib/rspec/core/dsl.rb +93 -0
- data/rspec-core/lib/rspec/core/example.rb +502 -0
- data/rspec-core/lib/rspec/core/example_group.rb +606 -0
- data/rspec-core/lib/rspec/core/filter_manager.rb +259 -0
- data/rspec-core/lib/rspec/core/flat_map.rb +18 -0
- data/rspec-core/lib/rspec/core/formatters.rb +240 -0
- data/rspec-core/lib/rspec/core/formatters/base_formatter.rb +67 -0
- data/rspec-core/lib/rspec/core/formatters/base_text_formatter.rb +76 -0
- data/rspec-core/lib/rspec/core/formatters/console_codes.rb +64 -0
- data/rspec-core/lib/rspec/core/formatters/deprecation_formatter.rb +222 -0
- data/rspec-core/lib/rspec/core/formatters/documentation_formatter.rb +68 -0
- data/rspec-core/lib/rspec/core/formatters/helpers.rb +87 -0
- data/rspec-core/lib/rspec/core/formatters/html_formatter.rb +149 -0
- data/rspec-core/lib/rspec/core/formatters/html_printer.rb +403 -0
- data/rspec-core/lib/rspec/core/formatters/json_formatter.rb +94 -0
- data/rspec-core/lib/rspec/core/formatters/profile_formatter.rb +65 -0
- data/rspec-core/lib/rspec/core/formatters/progress_formatter.rb +28 -0
- data/rspec-core/lib/rspec/core/formatters/protocol.rb +163 -0
- data/rspec-core/lib/rspec/core/formatters/snippet_extractor.rb +104 -0
- data/rspec-core/lib/rspec/core/hooks.rb +591 -0
- data/rspec-core/lib/rspec/core/memoized_helpers.rb +472 -0
- data/rspec-core/lib/rspec/core/metadata.rb +437 -0
- data/rspec-core/lib/rspec/core/metadata_filter.rb +95 -0
- data/rspec-core/lib/rspec/core/minitest_assertions_adapter.rb +28 -0
- data/rspec-core/lib/rspec/core/mocking_adapters/flexmock.rb +31 -0
- data/rspec-core/lib/rspec/core/mocking_adapters/mocha.rb +57 -0
- data/rspec-core/lib/rspec/core/mocking_adapters/null.rb +14 -0
- data/rspec-core/lib/rspec/core/mocking_adapters/rr.rb +31 -0
- data/rspec-core/lib/rspec/core/mocking_adapters/rspec.rb +32 -0
- data/rspec-core/lib/rspec/core/notifications.rb +542 -0
- data/rspec-core/lib/rspec/core/option_parser.rb +222 -0
- data/rspec-core/lib/rspec/core/ordering.rb +155 -0
- data/rspec-core/lib/rspec/core/pending.rb +163 -0
- data/rspec-core/lib/rspec/core/project_initializer.rb +48 -0
- data/rspec-core/lib/rspec/core/project_initializer/spec/spec_helper.rb +89 -0
- data/rspec-core/lib/rspec/core/rake_task.rb +187 -0
- data/rspec-core/lib/rspec/core/reporter.rb +149 -0
- data/rspec-core/lib/rspec/core/ruby_project.rb +45 -0
- data/rspec-core/lib/rspec/core/runner.rb +158 -0
- data/rspec-core/lib/rspec/core/shared_context.rb +55 -0
- data/rspec-core/lib/rspec/core/shared_example_group.rb +182 -0
- data/rspec-core/lib/rspec/core/test_unit_assertions_adapter.rb +30 -0
- data/rspec-core/lib/rspec/core/version.rb +9 -0
- data/rspec-core/lib/rspec/core/warnings.rb +40 -0
- data/rspec-core/lib/rspec/core/world.rb +183 -0
- data/rspec-core/spec/command_line/order_spec.rb +213 -0
- data/rspec-core/spec/rspec/core/backtrace_formatter_spec.rb +306 -0
- data/rspec-core/spec/rspec/core/configuration_options_spec.rb +425 -0
- data/rspec-core/spec/rspec/core/configuration_spec.rb +1963 -0
- data/rspec-core/spec/rspec/core/drb_spec.rb +278 -0
- data/rspec-core/spec/rspec/core/dsl_spec.rb +85 -0
- data/rspec-core/spec/rspec/core/example_execution_result_spec.rb +142 -0
- data/rspec-core/spec/rspec/core/example_group_constants_spec.rb +16 -0
- data/rspec-core/spec/rspec/core/example_group_spec.rb +1621 -0
- data/rspec-core/spec/rspec/core/example_spec.rb +662 -0
- data/rspec-core/spec/rspec/core/failed_example_notification_spec.rb +25 -0
- data/rspec-core/spec/rspec/core/filter_manager_spec.rb +299 -0
- data/rspec-core/spec/rspec/core/formatters/base_text_formatter_spec.rb +182 -0
- data/rspec-core/spec/rspec/core/formatters/console_codes_spec.rb +65 -0
- data/rspec-core/spec/rspec/core/formatters/deprecation_formatter_spec.rb +225 -0
- data/rspec-core/spec/rspec/core/formatters/documentation_formatter_spec.rb +111 -0
- data/rspec-core/spec/rspec/core/formatters/helpers_spec.rb +104 -0
- data/rspec-core/spec/rspec/core/formatters/html_formatter_spec.rb +111 -0
- data/rspec-core/spec/rspec/core/formatters/json_formatter_spec.rb +183 -0
- data/rspec-core/spec/rspec/core/formatters/profile_formatter_spec.rb +99 -0
- data/rspec-core/spec/rspec/core/formatters/progress_formatter_spec.rb +55 -0
- data/rspec-core/spec/rspec/core/formatters/snippet_extractor_spec.rb +26 -0
- data/rspec-core/spec/rspec/core/formatters_spec.rb +160 -0
- data/rspec-core/spec/rspec/core/hooks_filtering_spec.rb +227 -0
- data/rspec-core/spec/rspec/core/hooks_spec.rb +447 -0
- data/rspec-core/spec/rspec/core/memoized_helpers_spec.rb +537 -0
- data/rspec-core/spec/rspec/core/metadata_filter_spec.rb +181 -0
- data/rspec-core/spec/rspec/core/metadata_spec.rb +642 -0
- data/rspec-core/spec/rspec/core/notifications_spec.rb +92 -0
- data/rspec-core/spec/rspec/core/option_parser_spec.rb +270 -0
- data/rspec-core/spec/rspec/core/ordering_spec.rb +102 -0
- data/rspec-core/spec/rspec/core/pending_example_spec.rb +221 -0
- data/rspec-core/spec/rspec/core/pending_spec.rb +8 -0
- data/rspec-core/spec/rspec/core/project_initializer_spec.rb +123 -0
- data/rspec-core/spec/rspec/core/rake_task_spec.rb +351 -0
- data/rspec-core/spec/rspec/core/random_spec.rb +47 -0
- data/rspec-core/spec/rspec/core/reporter_spec.rb +198 -0
- data/rspec-core/spec/rspec/core/resources/a_bar.rb +0 -0
- data/rspec-core/spec/rspec/core/resources/a_foo.rb +0 -0
- data/rspec-core/spec/rspec/core/resources/a_spec.rb +1 -0
- data/rspec-core/spec/rspec/core/resources/acceptance/bar.rb +0 -0
- data/rspec-core/spec/rspec/core/resources/acceptance/foo_spec.rb +0 -0
- data/rspec-core/spec/rspec/core/resources/custom_example_group_runner.rb +14 -0
- data/rspec-core/spec/rspec/core/resources/formatter_specs.rb +58 -0
- data/rspec-core/spec/rspec/core/resources/utf8_encoded.rb +9 -0
- data/rspec-core/spec/rspec/core/rspec_matchers_spec.rb +45 -0
- data/rspec-core/spec/rspec/core/ruby_project_spec.rb +26 -0
- data/rspec-core/spec/rspec/core/runner_spec.rb +309 -0
- data/rspec-core/spec/rspec/core/shared_context_spec.rb +102 -0
- data/rspec-core/spec/rspec/core/shared_example_group_spec.rb +268 -0
- data/rspec-core/spec/rspec/core/warnings_spec.rb +72 -0
- data/rspec-core/spec/rspec/core/world_spec.rb +142 -0
- data/rspec-core/spec/rspec/core_spec.rb +103 -0
- data/rspec-core/spec/spec_helper.rb +89 -0
- data/rspec-core/spec/support/config_options_helper.rb +13 -0
- data/rspec-core/spec/support/fake_minitest/minitest.rb +0 -0
- data/rspec-core/spec/support/fake_minitest/minitest/minitest_assertions.rb +4 -0
- data/rspec-core/spec/support/fake_minitest/test/unit/assertions.rb +6 -0
- data/rspec-core/spec/support/formatter_support.rb +263 -0
- data/rspec-core/spec/support/helper_methods.rb +26 -0
- data/rspec-core/spec/support/isolated_home_directory.rb +16 -0
- data/rspec-core/spec/support/matchers.rb +103 -0
- data/rspec-core/spec/support/mathn_integration_support.rb +12 -0
- data/rspec-core/spec/support/sandboxing.rb +50 -0
- data/rspec-core/spec/support/shared_example_groups.rb +43 -0
- data/rspec-core/spec/support/spec_files.rb +44 -0
- data/rspec-expectations/benchmarks/2.x_vs_3.x_matcher_dsl_implementation.rb +253 -0
- data/rspec-expectations/benchmarks/autoload_v_require.rb +25 -0
- data/rspec-expectations/benchmarks/cloning_matchers.rb +19 -0
- data/rspec-expectations/benchmarks/default_messages_as_methods_v_blocks.rb +27 -0
- data/rspec-expectations/benchmarks/example_spec.rb +9 -0
- data/rspec-expectations/benchmarks/include_v_superclass.rb +39 -0
- data/rspec-expectations/benchmarks/match_array/failing_with_distinct_items.rb +147 -0
- data/rspec-expectations/benchmarks/match_array/failing_with_duplicate_items.rb +122 -0
- data/rspec-expectations/benchmarks/match_array/passing_with_distinct_items.rb +154 -0
- data/rspec-expectations/benchmarks/match_array/passing_with_duplicate_items.rb +132 -0
- data/rspec-expectations/benchmarks/match_array/rubyprof/passing_with_distinct_items.rb +9 -0
- data/rspec-expectations/benchmarks/matcher_dsl_vs_classes.rb +180 -0
- data/rspec-expectations/benchmarks/method_to_proc.rb +72 -0
- data/rspec-expectations/benchmarks/set_vs_array_include.rb +68 -0
- data/rspec-expectations/features/step_definitions/additional_cli_steps.rb +22 -0
- data/rspec-expectations/features/support/disallow_certain_apis.rb +34 -0
- data/rspec-expectations/features/support/env.rb +21 -0
- data/rspec-expectations/features/support/rubinius.rb +6 -0
- data/rspec-expectations/lib/rspec/expectations.rb +68 -0
- data/rspec-expectations/lib/rspec/expectations/configuration.rb +147 -0
- data/rspec-expectations/lib/rspec/expectations/expectation_target.rb +119 -0
- data/rspec-expectations/lib/rspec/expectations/fail_with.rb +34 -0
- data/rspec-expectations/lib/rspec/expectations/handler.rb +167 -0
- data/rspec-expectations/lib/rspec/expectations/minitest_integration.rb +17 -0
- data/rspec-expectations/lib/rspec/expectations/syntax.rb +132 -0
- data/rspec-expectations/lib/rspec/expectations/version.rb +8 -0
- data/rspec-expectations/lib/rspec/matchers.rb +967 -0
- data/rspec-expectations/lib/rspec/matchers/aliased_matcher.rb +116 -0
- data/rspec-expectations/lib/rspec/matchers/built_in.rb +52 -0
- data/rspec-expectations/lib/rspec/matchers/built_in/all.rb +85 -0
- data/rspec-expectations/lib/rspec/matchers/built_in/base_matcher.rb +132 -0
- data/rspec-expectations/lib/rspec/matchers/built_in/be.rb +277 -0
- data/rspec-expectations/lib/rspec/matchers/built_in/be_between.rb +77 -0
- data/rspec-expectations/lib/rspec/matchers/built_in/be_instance_of.rb +22 -0
- data/rspec-expectations/lib/rspec/matchers/built_in/be_kind_of.rb +16 -0
- data/rspec-expectations/lib/rspec/matchers/built_in/be_within.rb +72 -0
- data/rspec-expectations/lib/rspec/matchers/built_in/change.rb +337 -0
- data/rspec-expectations/lib/rspec/matchers/built_in/compound.rb +258 -0
- data/rspec-expectations/lib/rspec/matchers/built_in/contain_exactly.rb +249 -0
- data/rspec-expectations/lib/rspec/matchers/built_in/cover.rb +24 -0
- data/rspec-expectations/lib/rspec/matchers/built_in/eq.rb +75 -0
- data/rspec-expectations/lib/rspec/matchers/built_in/eql.rb +34 -0
- data/rspec-expectations/lib/rspec/matchers/built_in/equal.rb +81 -0
- data/rspec-expectations/lib/rspec/matchers/built_in/exist.rb +86 -0
- data/rspec-expectations/lib/rspec/matchers/built_in/has.rb +101 -0
- data/rspec-expectations/lib/rspec/matchers/built_in/have_attributes.rb +84 -0
- data/rspec-expectations/lib/rspec/matchers/built_in/include.rb +105 -0
- data/rspec-expectations/lib/rspec/matchers/built_in/match.rb +29 -0
- data/rspec-expectations/lib/rspec/matchers/built_in/operators.rb +119 -0
- data/rspec-expectations/lib/rspec/matchers/built_in/output.rb +152 -0
- data/rspec-expectations/lib/rspec/matchers/built_in/raise_error.rb +174 -0
- data/rspec-expectations/lib/rspec/matchers/built_in/respond_to.rb +91 -0
- data/rspec-expectations/lib/rspec/matchers/built_in/satisfy.rb +39 -0
- data/rspec-expectations/lib/rspec/matchers/built_in/start_and_end_with.rb +82 -0
- data/rspec-expectations/lib/rspec/matchers/built_in/throw_symbol.rb +132 -0
- data/rspec-expectations/lib/rspec/matchers/built_in/yield.rb +420 -0
- data/rspec-expectations/lib/rspec/matchers/composable.rb +183 -0
- data/rspec-expectations/lib/rspec/matchers/dsl.rb +391 -0
- data/rspec-expectations/lib/rspec/matchers/generated_descriptions.rb +42 -0
- data/rspec-expectations/lib/rspec/matchers/matcher_delegator.rb +33 -0
- data/rspec-expectations/lib/rspec/matchers/matcher_protocol.rb +99 -0
- data/rspec-expectations/lib/rspec/matchers/pretty.rb +77 -0
- data/rspec-expectations/spec/rspec/expectations/configuration_spec.rb +226 -0
- data/rspec-expectations/spec/rspec/expectations/expectation_target_spec.rb +147 -0
- data/rspec-expectations/spec/rspec/expectations/extensions/kernel_spec.rb +69 -0
- data/rspec-expectations/spec/rspec/expectations/fail_with_spec.rb +73 -0
- data/rspec-expectations/spec/rspec/expectations/handler_spec.rb +200 -0
- data/rspec-expectations/spec/rspec/expectations/minitest_integration_spec.rb +25 -0
- data/rspec-expectations/spec/rspec/expectations/syntax_spec.rb +93 -0
- data/rspec-expectations/spec/rspec/expectations_spec.rb +15 -0
- data/rspec-expectations/spec/rspec/matchers/aliased_matcher_spec.rb +113 -0
- data/rspec-expectations/spec/rspec/matchers/aliases_spec.rb +455 -0
- data/rspec-expectations/spec/rspec/matchers/built_in/all_spec.rb +212 -0
- data/rspec-expectations/spec/rspec/matchers/built_in/base_matcher_spec.rb +140 -0
- data/rspec-expectations/spec/rspec/matchers/built_in/be_between_spec.rb +157 -0
- data/rspec-expectations/spec/rspec/matchers/built_in/be_instance_of_spec.rb +61 -0
- data/rspec-expectations/spec/rspec/matchers/built_in/be_kind_of_spec.rb +39 -0
- data/rspec-expectations/spec/rspec/matchers/built_in/be_spec.rb +685 -0
- data/rspec-expectations/spec/rspec/matchers/built_in/be_within_spec.rb +139 -0
- data/rspec-expectations/spec/rspec/matchers/built_in/change_spec.rb +829 -0
- data/rspec-expectations/spec/rspec/matchers/built_in/compound_spec.rb +537 -0
- data/rspec-expectations/spec/rspec/matchers/built_in/contain_exactly_spec.rb +556 -0
- data/rspec-expectations/spec/rspec/matchers/built_in/cover_spec.rb +67 -0
- data/rspec-expectations/spec/rspec/matchers/built_in/eq_spec.rb +176 -0
- data/rspec-expectations/spec/rspec/matchers/built_in/eql_spec.rb +39 -0
- data/rspec-expectations/spec/rspec/matchers/built_in/equal_spec.rb +130 -0
- data/rspec-expectations/spec/rspec/matchers/built_in/exist_spec.rb +139 -0
- data/rspec-expectations/spec/rspec/matchers/built_in/has_spec.rb +179 -0
- data/rspec-expectations/spec/rspec/matchers/built_in/have_attributes_spec.rb +177 -0
- data/rspec-expectations/spec/rspec/matchers/built_in/include_spec.rb +587 -0
- data/rspec-expectations/spec/rspec/matchers/built_in/match_spec.rb +100 -0
- data/rspec-expectations/spec/rspec/matchers/built_in/operators_spec.rb +250 -0
- data/rspec-expectations/spec/rspec/matchers/built_in/output_spec.rb +168 -0
- data/rspec-expectations/spec/rspec/matchers/built_in/raise_error_spec.rb +446 -0
- data/rspec-expectations/spec/rspec/matchers/built_in/respond_to_spec.rb +290 -0
- data/rspec-expectations/spec/rspec/matchers/built_in/satisfy_spec.rb +42 -0
- data/rspec-expectations/spec/rspec/matchers/built_in/start_and_end_with_spec.rb +347 -0
- data/rspec-expectations/spec/rspec/matchers/built_in/throw_symbol_spec.rb +133 -0
- data/rspec-expectations/spec/rspec/matchers/built_in/yield_spec.rb +643 -0
- data/rspec-expectations/spec/rspec/matchers/composable_spec.rb +77 -0
- data/rspec-expectations/spec/rspec/matchers/define_negated_matcher_spec.rb +199 -0
- data/rspec-expectations/spec/rspec/matchers/description_generation_spec.rb +189 -0
- data/rspec-expectations/spec/rspec/matchers/dsl_spec.rb +1036 -0
- data/rspec-expectations/spec/rspec/matchers/legacy_spec.rb +104 -0
- data/rspec-expectations/spec/rspec/matchers_spec.rb +108 -0
- data/rspec-expectations/spec/spec_helper.rb +94 -0
- data/rspec-expectations/spec/support/matchers.rb +54 -0
- data/rspec-expectations/spec/support/shared_examples.rb +101 -0
- data/rspec-mocks/benchmarks/double_creation.rb +66 -0
- data/rspec-mocks/benchmarks/each_value_v_values_each.rb +58 -0
- data/rspec-mocks/benchmarks/find_original_method_early.rb +64 -0
- data/rspec-mocks/benchmarks/method_defined_at_any_visibility.rb +101 -0
- data/rspec-mocks/benchmarks/thread_safety.rb +24 -0
- data/rspec-mocks/benchmarks/transfer_nested_constants.rb +77 -0
- data/rspec-mocks/features/step_definitions/additional_cli_steps.rb +21 -0
- data/rspec-mocks/features/support/disallow_certain_apis.rb +24 -0
- data/rspec-mocks/features/support/env.rb +22 -0
- data/rspec-mocks/features/support/rubinius.rb +6 -0
- data/rspec-mocks/lib/rspec/mocks.rb +126 -0
- data/rspec-mocks/lib/rspec/mocks/any_instance.rb +10 -0
- data/rspec-mocks/lib/rspec/mocks/any_instance/chain.rb +109 -0
- data/rspec-mocks/lib/rspec/mocks/any_instance/expect_chain_chain.rb +35 -0
- data/rspec-mocks/lib/rspec/mocks/any_instance/expectation_chain.rb +48 -0
- data/rspec-mocks/lib/rspec/mocks/any_instance/message_chains.rb +85 -0
- data/rspec-mocks/lib/rspec/mocks/any_instance/proxy.rb +116 -0
- data/rspec-mocks/lib/rspec/mocks/any_instance/recorder.rb +267 -0
- data/rspec-mocks/lib/rspec/mocks/any_instance/stub_chain.rb +45 -0
- data/rspec-mocks/lib/rspec/mocks/any_instance/stub_chain_chain.rb +27 -0
- data/rspec-mocks/lib/rspec/mocks/argument_list_matcher.rb +72 -0
- data/rspec-mocks/lib/rspec/mocks/argument_matchers.rb +282 -0
- data/rspec-mocks/lib/rspec/mocks/configuration.rb +157 -0
- data/rspec-mocks/lib/rspec/mocks/error_generator.rb +253 -0
- data/rspec-mocks/lib/rspec/mocks/example_methods.rb +379 -0
- data/rspec-mocks/lib/rspec/mocks/instance_method_stasher.rb +135 -0
- data/rspec-mocks/lib/rspec/mocks/marshal_extension.rb +41 -0
- data/rspec-mocks/lib/rspec/mocks/matchers/expectation_customization.rb +20 -0
- data/rspec-mocks/lib/rspec/mocks/matchers/have_received.rb +121 -0
- data/rspec-mocks/lib/rspec/mocks/matchers/receive.rb +106 -0
- data/rspec-mocks/lib/rspec/mocks/matchers/receive_message_chain.rb +66 -0
- data/rspec-mocks/lib/rspec/mocks/matchers/receive_messages.rb +71 -0
- data/rspec-mocks/lib/rspec/mocks/message_chain.rb +91 -0
- data/rspec-mocks/lib/rspec/mocks/message_expectation.rb +694 -0
- data/rspec-mocks/lib/rspec/mocks/method_double.rb +260 -0
- data/rspec-mocks/lib/rspec/mocks/method_reference.rb +155 -0
- data/rspec-mocks/lib/rspec/mocks/mutate_const.rb +324 -0
- data/rspec-mocks/lib/rspec/mocks/object_reference.rb +91 -0
- data/rspec-mocks/lib/rspec/mocks/order_group.rb +81 -0
- data/rspec-mocks/lib/rspec/mocks/proxy.rb +431 -0
- data/rspec-mocks/lib/rspec/mocks/space.rb +221 -0
- data/rspec-mocks/lib/rspec/mocks/standalone.rb +3 -0
- data/rspec-mocks/lib/rspec/mocks/syntax.rb +329 -0
- data/rspec-mocks/lib/rspec/mocks/targets.rb +97 -0
- data/rspec-mocks/lib/rspec/mocks/test_double.rb +135 -0
- data/rspec-mocks/lib/rspec/mocks/verifying_double.rb +127 -0
- data/rspec-mocks/lib/rspec/mocks/verifying_message_expecation.rb +62 -0
- data/rspec-mocks/lib/rspec/mocks/verifying_proxy.rb +171 -0
- data/rspec-mocks/lib/rspec/mocks/version.rb +9 -0
- data/rspec-mocks/spec/rspec/mocks/and_call_original_spec.rb +267 -0
- data/rspec-mocks/spec/rspec/mocks/and_return_spec.rb +21 -0
- data/rspec-mocks/spec/rspec/mocks/and_wrap_original_spec.rb +63 -0
- data/rspec-mocks/spec/rspec/mocks/and_yield_spec.rb +161 -0
- data/rspec-mocks/spec/rspec/mocks/any_instance/message_chains_spec.rb +39 -0
- data/rspec-mocks/spec/rspec/mocks/any_instance_spec.rb +1242 -0
- data/rspec-mocks/spec/rspec/mocks/argument_matchers_spec.rb +336 -0
- data/rspec-mocks/spec/rspec/mocks/array_including_matcher_spec.rb +39 -0
- data/rspec-mocks/spec/rspec/mocks/at_least_spec.rb +147 -0
- data/rspec-mocks/spec/rspec/mocks/at_most_spec.rb +113 -0
- data/rspec-mocks/spec/rspec/mocks/before_all_spec.rb +75 -0
- data/rspec-mocks/spec/rspec/mocks/block_return_value_spec.rb +68 -0
- data/rspec-mocks/spec/rspec/mocks/combining_implementation_instructions_spec.rb +196 -0
- data/rspec-mocks/spec/rspec/mocks/configuration_spec.rb +175 -0
- data/rspec-mocks/spec/rspec/mocks/double_spec.rb +830 -0
- data/rspec-mocks/spec/rspec/mocks/example_methods_spec.rb +11 -0
- data/rspec-mocks/spec/rspec/mocks/expiration_spec.rb +90 -0
- data/rspec-mocks/spec/rspec/mocks/hash_excluding_matcher_spec.rb +65 -0
- data/rspec-mocks/spec/rspec/mocks/hash_including_matcher_spec.rb +92 -0
- data/rspec-mocks/spec/rspec/mocks/instance_method_stasher_spec.rb +72 -0
- data/rspec-mocks/spec/rspec/mocks/marshal_extension_spec.rb +67 -0
- data/rspec-mocks/spec/rspec/mocks/matchers/have_received_spec.rb +513 -0
- data/rspec-mocks/spec/rspec/mocks/matchers/receive_message_chain_spec.rb +227 -0
- data/rspec-mocks/spec/rspec/mocks/matchers/receive_messages_spec.rb +148 -0
- data/rspec-mocks/spec/rspec/mocks/matchers/receive_spec.rb +525 -0
- data/rspec-mocks/spec/rspec/mocks/methods_spec.rb +24 -0
- data/rspec-mocks/spec/rspec/mocks/mock_expectation_error_spec.rb +20 -0
- data/rspec-mocks/spec/rspec/mocks/mock_ordering_spec.rb +112 -0
- data/rspec-mocks/spec/rspec/mocks/multiple_return_value_spec.rb +130 -0
- data/rspec-mocks/spec/rspec/mocks/mutate_const_spec.rb +561 -0
- data/rspec-mocks/spec/rspec/mocks/nil_expectation_warning_spec.rb +52 -0
- data/rspec-mocks/spec/rspec/mocks/null_object_double_spec.rb +135 -0
- data/rspec-mocks/spec/rspec/mocks/once_counts_spec.rb +50 -0
- data/rspec-mocks/spec/rspec/mocks/order_group_spec.rb +26 -0
- data/rspec-mocks/spec/rspec/mocks/partial_double_spec.rb +379 -0
- data/rspec-mocks/spec/rspec/mocks/partial_double_using_mocks_directly_spec.rb +83 -0
- data/rspec-mocks/spec/rspec/mocks/precise_counts_spec.rb +66 -0
- data/rspec-mocks/spec/rspec/mocks/serialization_spec.rb +89 -0
- data/rspec-mocks/spec/rspec/mocks/should_syntax_spec.rb +539 -0
- data/rspec-mocks/spec/rspec/mocks/space_spec.rb +242 -0
- data/rspec-mocks/spec/rspec/mocks/spy_spec.rb +127 -0
- data/rspec-mocks/spec/rspec/mocks/stash_spec.rb +43 -0
- data/rspec-mocks/spec/rspec/mocks/stub_chain_spec.rb +166 -0
- data/rspec-mocks/spec/rspec/mocks/stub_implementation_spec.rb +98 -0
- data/rspec-mocks/spec/rspec/mocks/stub_spec.rb +520 -0
- data/rspec-mocks/spec/rspec/mocks/stubbed_message_expectations_spec.rb +56 -0
- data/rspec-mocks/spec/rspec/mocks/syntax_agnostic_message_matchers_spec.rb +99 -0
- data/rspec-mocks/spec/rspec/mocks/syntax_spec.rb +7 -0
- data/rspec-mocks/spec/rspec/mocks/test_double_spec.rb +53 -0
- data/rspec-mocks/spec/rspec/mocks/thrice_counts_spec.rb +72 -0
- data/rspec-mocks/spec/rspec/mocks/to_ary_spec.rb +52 -0
- data/rspec-mocks/spec/rspec/mocks/twice_counts_spec.rb +64 -0
- data/rspec-mocks/spec/rspec/mocks/verifying_doubles/class_double_with_class_loaded_spec.rb +118 -0
- data/rspec-mocks/spec/rspec/mocks/verifying_doubles/class_double_with_class_not_loaded_spec.rb +58 -0
- data/rspec-mocks/spec/rspec/mocks/verifying_doubles/construction_spec.rb +54 -0
- data/rspec-mocks/spec/rspec/mocks/verifying_doubles/expected_arg_verification_spec.rb +81 -0
- data/rspec-mocks/spec/rspec/mocks/verifying_doubles/instance_double_with_class_loaded_spec.rb +195 -0
- data/rspec-mocks/spec/rspec/mocks/verifying_doubles/instance_double_with_class_not_loaded_spec.rb +57 -0
- data/rspec-mocks/spec/rspec/mocks/verifying_doubles/method_visibility_spec.rb +129 -0
- data/rspec-mocks/spec/rspec/mocks/verifying_doubles/object_double_spec.rb +68 -0
- data/rspec-mocks/spec/rspec/mocks_spec.rb +199 -0
- data/rspec-mocks/spec/spec_helper.rb +131 -0
- data/rspec-mocks/spec/support/before_all_shared_example_group.rb +16 -0
- data/rspec-mocks/spec/support/doubled_classes.rb +74 -0
- data/rspec-mocks/spec/support/matchers.rb +15 -0
- data/rspec-support/benchmarks/caller.rb +81 -0
- data/rspec-support/lib/rspec/support.rb +76 -0
- data/rspec-support/lib/rspec/support/caller_filter.rb +63 -0
- data/rspec-support/lib/rspec/support/differ.rb +214 -0
- data/rspec-support/lib/rspec/support/directory_maker.rb +61 -0
- data/rspec-support/lib/rspec/support/encoded_string.rb +69 -0
- data/rspec-support/lib/rspec/support/fuzzy_matcher.rb +48 -0
- data/rspec-support/lib/rspec/support/hunk_generator.rb +47 -0
- data/rspec-support/lib/rspec/support/matcher_definition.rb +31 -0
- data/rspec-support/lib/rspec/support/method_signature_verifier.rb +272 -0
- data/rspec-support/lib/rspec/support/os.rb +18 -0
- data/rspec-support/lib/rspec/support/recursive_const_methods.rb +76 -0
- data/rspec-support/lib/rspec/support/ruby_features.rb +45 -0
- data/rspec-support/lib/rspec/support/spec.rb +72 -0
- data/rspec-support/lib/rspec/support/spec/deprecation_helpers.rb +60 -0
- data/rspec-support/lib/rspec/support/spec/formatting_support.rb +9 -0
- data/rspec-support/lib/rspec/support/spec/in_sub_process.rb +43 -0
- data/rspec-support/lib/rspec/support/spec/prevent_load_time_warnings.rb +44 -0
- data/rspec-support/lib/rspec/support/spec/shell_out.rb +69 -0
- data/rspec-support/lib/rspec/support/spec/stderr_splitter.rb +52 -0
- data/rspec-support/lib/rspec/support/spec/with_isolated_directory.rb +9 -0
- data/rspec-support/lib/rspec/support/spec/with_isolated_stderr.rb +13 -0
- data/rspec-support/lib/rspec/support/version.rb +7 -0
- data/rspec-support/lib/rspec/support/version_checker.rb +53 -0
- data/rspec-support/lib/rspec/support/warnings.rb +39 -0
- data/rspec-support/spec/rspec/support/caller_filter_spec.rb +66 -0
- data/rspec-support/spec/rspec/support/differ_spec.rb +322 -0
- data/rspec-support/spec/rspec/support/directory_maker_spec.rb +58 -0
- data/rspec-support/spec/rspec/support/encoded_string_spec.rb +86 -0
- data/rspec-support/spec/rspec/support/fuzzy_matcher_spec.rb +179 -0
- data/rspec-support/spec/rspec/support/method_signature_verifier_spec.rb +357 -0
- data/rspec-support/spec/rspec/support/os_spec.rb +36 -0
- data/rspec-support/spec/rspec/support/recursive_const_methods_spec.rb +49 -0
- data/rspec-support/spec/rspec/support/spec/in_sub_process_spec.rb +36 -0
- data/rspec-support/spec/rspec/support/spec/prevent_load_time_warnings_spec.rb +10 -0
- data/rspec-support/spec/rspec/support/spec/shell_out_spec.rb +44 -0
- data/rspec-support/spec/rspec/support/spec/stderr_splitter_spec.rb +60 -0
- data/rspec-support/spec/rspec/support/spec/with_isolated_std_err_spec.rb +21 -0
- data/rspec-support/spec/rspec/support/version_checker_spec.rb +29 -0
- data/rspec-support/spec/rspec/support/warnings_spec.rb +66 -0
- data/rspec-support/spec/rspec/support_spec.rb +119 -0
- data/rspec-support/spec/spec_helper.rb +2 -0
- data/rspec/lib/rspec.rb +3 -0
- data/rspec/lib/rspec/version.rb +5 -0
- data/spec/mri/integration/browser_spec.rb +31 -0
- data/spec/mri/integration/rack/sprockets_runner_js_errors.rb.erb +20 -0
- data/spec/mri/integration/spec_opts_spec.rb +81 -0
- data/spec/mri/unit/opal/rspec/browser_formatter_spec.rb +35 -0
- data/spec/mri/unit/opal/rspec/cached_environment_spec.rb +85 -0
- data/spec/mri/unit/opal/rspec/opal/browser_formatter_spec.rb +14 -0
- data/spec/mri/unit/opal/rspec/rack/config.ru +12 -0
- data/spec/mri/unit/opal/rspec/rake_task_spec.rb +261 -0
- data/spec/mri/unit/opal/rspec/sprockets_environment_spec.rb +55 -0
- data/spec/mri/unit/opal/rspec/temp_dir_helper.rb +19 -0
- data/spec/opal/after_hooks_spec.rb +140 -0
- data/spec/opal/around_hooks_spec.rb +164 -0
- data/spec/opal/async_spec.rb +184 -0
- data/spec/opal/before_hooks_spec.rb +183 -0
- data/spec/opal/example_spec.rb +174 -0
- data/spec/opal/expected_failures.txt +40 -0
- data/spec/opal/matchers_spec.rb +205 -0
- data/spec/opal/mock_spec.rb +63 -0
- data/spec/opal/should_syntax_spec.rb +17 -0
- data/spec/opal/skip_pending_spec.rb +43 -0
- data/spec/opal/subject_spec.rb +87 -0
- data/spec/other/color_on_by_default_spec.rb +9 -0
- data/spec/other/dummy_spec.rb +5 -0
- data/spec/other/formatter_dependency.rb +3 -0
- data/spec/other/ignored_spec.opal +5 -0
- data/spec/other/test_formatter.rb +9 -0
- data/spec/rspec/core/config.rb +5 -0
- data/spec/rspec/core/config.ru +4 -0
- data/spec/rspec/core/core_spec_loader.rb +46 -0
- data/spec/rspec/core/filter/core/async/example_group.txt +13 -0
- data/spec/rspec/core/filter/core/async/hooks.rb +12 -0
- data/spec/rspec/core/filter/core/async/memoized_helpers.txt +3 -0
- data/spec/rspec/core/filter/core/async/metadata.txt +2 -0
- data/spec/rspec/core/filter/core/bugs/filter_manager.txt +4 -0
- data/spec/rspec/core/filter/core/bugs/formatters.txt +4 -0
- data/spec/rspec/core/filter/core/bugs/memoized_helpers.rb +11 -0
- data/spec/rspec/core/filter/core/bugs/metadata.txt +5 -0
- data/spec/rspec/core/filter/core/bugs/sandbox/subject_issue_test.rb +328 -0
- data/spec/rspec/core/filter/core/bugs/warnings_deprecations.txt +3 -0
- data/spec/rspec/core/filter/core/unsupported/core.txt +5 -0
- data/spec/rspec/core/filter/core/unsupported/example.txt +7 -0
- data/spec/rspec/core/filter/core/unsupported/example_group.txt +13 -0
- data/spec/rspec/core/filter/core/unsupported/filter_manager.txt +7 -0
- data/spec/rspec/core/filter/core/unsupported/formatters.txt +27 -0
- data/spec/rspec/core/filter/core/unsupported/hooks.txt +2 -0
- data/spec/rspec/core/filter/core/unsupported/memoized_helpers.txt +6 -0
- data/spec/rspec/core/filter/core/unsupported/metadata.txt +14 -0
- data/spec/rspec/core/filter/core/unsupported/metadata_filter.txt +2 -0
- data/spec/rspec/core/filter/core/unsupported/notifications.txt +8 -0
- data/spec/rspec/core/filter/core/unsupported/world.txt +3 -0
- data/spec/rspec/core/fixes/missing_constants.rb +20 -0
- data/spec/rspec/core/fixes/opal_itself.rb +38 -0
- data/spec/rspec/core/fixes/shared_examples.rb +3 -0
- data/spec/rspec/core/opal_alternates/rspec/core/example_group_spec.rb +145 -0
- data/spec/rspec/core/opal_alternates/rspec/core/failed_example_notification_spec.rb +31 -0
- data/spec/rspec/core/opal_alternates/rspec/core/hooks_spec.rb +113 -0
- data/spec/rspec/core/opal_alternates/rspec/core/memoized_helpers_spec.rb +36 -0
- data/spec/rspec/core/opal_alternates/rspec/core/metadata_spec.rb +48 -0
- data/spec/rspec/core/require_specs.rb +25 -0
- data/spec/rspec/core/sandboxing.rb +72 -0
- data/spec/rspec/core/spec_files_exclude.txt +41 -0
- data/spec/rspec/expectations/config.rb +16 -0
- data/spec/rspec/expectations/config.ru +4 -0
- data/spec/rspec/expectations/expectation_spec_loader.rb +110 -0
- data/spec/rspec/expectations/filter/bugs/aliased_matcher.txt +2 -0
- data/spec/rspec/expectations/filter/bugs/aliases.rb +13 -0
- data/spec/rspec/expectations/filter/bugs/base_matcher.txt +2 -0
- data/spec/rspec/expectations/filter/bugs/be.rb +4 -0
- data/spec/rspec/expectations/filter/bugs/be_instance_of.rb +7 -0
- data/spec/rspec/expectations/filter/bugs/be_spec.txt +2 -0
- data/spec/rspec/expectations/filter/bugs/configuration.txt +8 -0
- data/spec/rspec/expectations/filter/bugs/contain_exactly.rb +13 -0
- data/spec/rspec/expectations/filter/bugs/define_negated_matcher.rb +9 -0
- data/spec/rspec/expectations/filter/bugs/description_generation.rb +4 -0
- data/spec/rspec/expectations/filter/bugs/dsl.txt +14 -0
- data/spec/rspec/expectations/filter/bugs/equal.txt +3 -0
- data/spec/rspec/expectations/filter/bugs/expectation_target.txt +2 -0
- data/spec/rspec/expectations/filter/bugs/expectations.txt +2 -0
- data/spec/rspec/expectations/filter/bugs/have_attributes.rb +8 -0
- data/spec/rspec/expectations/filter/bugs/include.rb +4 -0
- data/spec/rspec/expectations/filter/bugs/operators.txt +2 -0
- data/spec/rspec/expectations/filter/bugs/raise_error.txt +2 -0
- data/spec/rspec/expectations/filter/bugs/respond_to.rb +13 -0
- data/spec/rspec/expectations/filter/bugs/sandbox/undef.rb +20 -0
- data/spec/rspec/expectations/filter/unsupported/aliases.txt +5 -0
- data/spec/rspec/expectations/filter/unsupported/be.txt +2 -0
- data/spec/rspec/expectations/filter/unsupported/be_instance_of.txt +3 -0
- data/spec/rspec/expectations/filter/unsupported/change.txt +2 -0
- data/spec/rspec/expectations/filter/unsupported/configuration.txt +2 -0
- data/spec/rspec/expectations/filter/unsupported/contain_exactly.txt +2 -0
- data/spec/rspec/expectations/filter/unsupported/description_generation.txt +6 -0
- data/spec/rspec/expectations/filter/unsupported/dsl.txt +8 -0
- data/spec/rspec/expectations/filter/unsupported/eq.txt +10 -0
- data/spec/rspec/expectations/filter/unsupported/equal.txt +3 -0
- data/spec/rspec/expectations/filter/unsupported/expectation_target.txt +2 -0
- data/spec/rspec/expectations/filter/unsupported/expectations.txt +8 -0
- data/spec/rspec/expectations/filter/unsupported/has.txt +2 -0
- data/spec/rspec/expectations/filter/unsupported/include.txt +3 -0
- data/spec/rspec/expectations/filter/unsupported/match.txt +2 -0
- data/spec/rspec/expectations/filter/unsupported/matchers.txt +11 -0
- data/spec/rspec/expectations/filter/unsupported/output.txt +14 -0
- data/spec/rspec/expectations/filter/unsupported/raise_error.txt +3 -0
- data/spec/rspec/expectations/filter/unsupported/respond_to.rb +5 -0
- data/spec/rspec/expectations/filter/unsupported/syntax.txt +3 -0
- data/spec/rspec/expectations/filter/unsupported/yield.txt +2 -0
- data/spec/rspec/expectations/fixes/example_patches.rb +32 -0
- data/spec/rspec/expectations/fixes/missing_constants.rb +12 -0
- data/spec/rspec/expectations/fixes/not_compatible.rb +6 -0
- data/spec/rspec/expectations/fixes/opal_itself.rb +140 -0
- data/spec/rspec/expectations/opal_alternates/be_instance_of_spec.rb +11 -0
- data/spec/rspec/expectations/opal_alternates/dsl_spec.rb +66 -0
- data/spec/rspec/expectations/opal_alternates/expectation_target_spec.rb +21 -0
- data/spec/rspec/expectations/opal_alternates/yield_spec.rb +11 -0
- data/spec/rspec/expectations/require_specs.rb +16 -0
- data/spec/rspec/expectations/shared_examples.rb +47 -0
- data/spec/rspec/expectations/spec_files_exclude.txt +2 -0
- data/spec/rspec/expectations/spec_helper_opal.rb +13 -0
- data/spec/rspec/filter_processor.rb +77 -0
- data/spec/rspec/mocks/config.ru +4 -0
- data/spec/rspec/mocks/filter/bugs/and_call_original.txt +9 -0
- data/spec/rspec/mocks/filter/bugs/and_wrap_original.txt +2 -0
- data/spec/rspec/mocks/filter/bugs/any_instance.rb +24 -0
- data/spec/rspec/mocks/filter/bugs/argument_matchers.rb +3 -0
- data/spec/rspec/mocks/filter/bugs/configuration.txt +2 -0
- data/spec/rspec/mocks/filter/bugs/double.txt +3 -0
- data/spec/rspec/mocks/filter/bugs/expiration.txt +2 -0
- data/spec/rspec/mocks/filter/bugs/instance_method_stasher.txt +2 -0
- data/spec/rspec/mocks/filter/bugs/methods.rb +5 -0
- data/spec/rspec/mocks/filter/bugs/mocks.txt +6 -0
- data/spec/rspec/mocks/filter/bugs/mutate_const.txt +2 -0
- data/spec/rspec/mocks/filter/bugs/partial_double.rb +8 -0
- data/spec/rspec/mocks/filter/bugs/receive.txt +5 -0
- data/spec/rspec/mocks/filter/bugs/should_syntax.txt +5 -0
- data/spec/rspec/mocks/filter/bugs/space.txt +2 -0
- data/spec/rspec/mocks/filter/bugs/spy.txt +5 -0
- data/spec/rspec/mocks/filter/bugs/stub_implementation.rb +9 -0
- data/spec/rspec/mocks/filter/unsupported/and_call_original.txt +5 -0
- data/spec/rspec/mocks/filter/unsupported/and_return.txt +2 -0
- data/spec/rspec/mocks/filter/unsupported/any_instance.rb +6 -0
- data/spec/rspec/mocks/filter/unsupported/argument_matchers.rb +10 -0
- data/spec/rspec/mocks/filter/unsupported/combining_implementation_instructions.rb +9 -0
- data/spec/rspec/mocks/filter/unsupported/double.rb +16 -0
- data/spec/rspec/mocks/filter/unsupported/expected_arg_verification.txt +2 -0
- data/spec/rspec/mocks/filter/unsupported/have_received.txt +2 -0
- data/spec/rspec/mocks/filter/unsupported/instance_double_with_class_loaded.txt +8 -0
- data/spec/rspec/mocks/filter/unsupported/mocks.rb +8 -0
- data/spec/rspec/mocks/filter/unsupported/nil_expectation_warning.rb +8 -0
- data/spec/rspec/mocks/filter/unsupported/partial_double.rb +6 -0
- data/spec/rspec/mocks/filter/unsupported/receive.txt +13 -0
- data/spec/rspec/mocks/filter/unsupported/receive_message_chain.rb +4 -0
- data/spec/rspec/mocks/filter/unsupported/receive_messages.txt +2 -0
- data/spec/rspec/mocks/filter/unsupported/should_syntax.txt +1 -0
- data/spec/rspec/mocks/filter/unsupported/space.rb +7 -0
- data/spec/rspec/mocks/filter/unsupported/stub.rb +7 -0
- data/spec/rspec/mocks/fixes/doubled_classes.rb +76 -0
- data/spec/rspec/mocks/fixes/missing_constants.rb +3 -0
- data/spec/rspec/mocks/fixes/opal_itself.rb +59 -0
- data/spec/rspec/mocks/mocks_spec_loader.rb +91 -0
- data/spec/rspec/mocks/require_specs.rb +15 -0
- data/spec/rspec/mocks/spec_files_exclude.txt +11 -0
- data/spec/rspec/mocks/spec_helper_opal.rb +129 -0
- data/spec/rspec/opal_rspec_spec_loader.rb +359 -0
- data/spec/rspec/shared/opal/fixes/deprecation_helpers.rb +31 -0
- data/spec/rspec/shared/opal/fixes/rspec_helpers.rb +6 -0
- data/spec/rspec/shared/opal/progress_json_formatter.rb +29 -0
- data/spec/rspec/support/config.rb +5 -0
- data/spec/rspec/support/config.ru +4 -0
- data/spec/rspec/support/filter/bugs/recursive_const_methods.txt +3 -0
- data/spec/rspec/support/filter/bugs/sandbox/basic_object.rb +30 -0
- data/spec/rspec/support/filter/bugs/stderr_splitter_spec.txt +2 -0
- data/spec/rspec/support/filter/bugs/support.txt +2 -0
- data/spec/rspec/support/filter/unsupported/fuzzy_matcher.txt +2 -0
- data/spec/rspec/support/filter/unsupported/support.rb +7 -0
- data/spec/rspec/support/filter/unsupported/warnings.txt +6 -0
- data/spec/rspec/support/fixes/missing_constants.rb +3 -0
- data/spec/rspec/support/fixes/opal_itself.rb +13 -0
- data/spec/rspec/support/require_specs.rb +15 -0
- data/spec/rspec/support/spec_files_exclude.txt +26 -0
- data/spec/rspec/support/spec_helper.rb +27 -0
- data/spec/rspec/support/support_spec_loader.rb +38 -0
- data/util/create_requires.rb +49 -0
- data/vendor/spec_runner.js +64 -0
- metadata +774 -0
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
RSpec.describe RSpec::Mocks::AnyInstance::MessageChains do
|
|
2
|
+
let(:recorder) { double }
|
|
3
|
+
let(:chains) { RSpec::Mocks::AnyInstance::MessageChains.new }
|
|
4
|
+
let(:stub_chain) { RSpec::Mocks::AnyInstance::StubChain.new recorder }
|
|
5
|
+
let(:expectation_chain) { RSpec::Mocks::AnyInstance::PositiveExpectationChain.new recorder }
|
|
6
|
+
|
|
7
|
+
it "knows if a method does not have an expectation set on it" do
|
|
8
|
+
chains.add(:method_name, stub_chain)
|
|
9
|
+
expect(chains.has_expectation?(:method_name)).to be_falsey
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
it "knows if a method has an expectation set on it" do
|
|
13
|
+
chains.add(:method_name, stub_chain)
|
|
14
|
+
chains.add(:method_name, expectation_chain)
|
|
15
|
+
expect(chains.has_expectation?(:method_name)).to be_truthy
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
it "can remove all stub chains" do
|
|
19
|
+
chains.add(:method_name, stub_chain)
|
|
20
|
+
chains.add(:method_name, expectation_chain)
|
|
21
|
+
chains.add(:method_name, RSpec::Mocks::AnyInstance::StubChain.new(recorder))
|
|
22
|
+
|
|
23
|
+
chains.remove_stub_chains_for!(:method_name)
|
|
24
|
+
expect(chains[:method_name]).to eq([expectation_chain])
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
context "creating stub chains" do
|
|
28
|
+
it "understands how to add a stub chain for a method" do
|
|
29
|
+
chains.add(:method_name, stub_chain)
|
|
30
|
+
expect(chains[:method_name]).to eq([stub_chain])
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
it "allows multiple stub chains for a method" do
|
|
34
|
+
chains.add(:method_name, stub_chain)
|
|
35
|
+
chains.add(:method_name, another_stub_chain = RSpec::Mocks::AnyInstance::StubChain.new(recorder))
|
|
36
|
+
expect(chains[:method_name]).to eq([stub_chain, another_stub_chain])
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
end
|
|
@@ -0,0 +1,1242 @@
|
|
|
1
|
+
require 'delegate'
|
|
2
|
+
|
|
3
|
+
module RSpec
|
|
4
|
+
module Mocks
|
|
5
|
+
RSpec.describe "#any_instance" do
|
|
6
|
+
class CustomErrorForAnyInstanceSpec < StandardError;end
|
|
7
|
+
|
|
8
|
+
let(:klass) do
|
|
9
|
+
Class.new do
|
|
10
|
+
def existing_method; :existing_method_return_value; end
|
|
11
|
+
def existing_method_with_arguments(arg_one, arg_two = nil); :existing_method_with_arguments_return_value; end
|
|
12
|
+
def another_existing_method; end
|
|
13
|
+
private
|
|
14
|
+
def private_method; :private_method_return_value; end
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
let(:existing_method_return_value){ :existing_method_return_value }
|
|
18
|
+
|
|
19
|
+
context "invocation order" do
|
|
20
|
+
context "when stubbing" do
|
|
21
|
+
it "raises an error if 'with' follows 'and_return'" do
|
|
22
|
+
expect { allow_any_instance_of(klass).to receive(:foo).and_return(1).with("1") }.to raise_error(NoMethodError)
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
it "raises an error if 'with' follows 'and_raise'" do
|
|
26
|
+
expect { allow_any_instance_of(klass).to receive(:foo).and_raise(1).with("1") }.to raise_error(NoMethodError)
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
it "raises an error if 'with' follows 'and_yield'" do
|
|
30
|
+
expect { allow_any_instance_of(klass).to receive(:foo).and_yield(1).with("1") }.to raise_error(NoMethodError)
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
context "when setting a message expectation" do
|
|
35
|
+
it "raises an error if 'with' follows 'and_return'" do
|
|
36
|
+
pending "see Github issue #42"
|
|
37
|
+
expect { expect_any_instance_of(klass).to receive(:foo).and_return(1).with("1") }.to raise_error(NoMethodError)
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
it "raises an error if 'with' follows 'and_raise'" do
|
|
41
|
+
pending "see Github issue #42"
|
|
42
|
+
expect { expect_any_instance_of(klass).to receive(:foo).and_raise(1).with("1") }.to raise_error(NoMethodError)
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
context "when stubbing" do
|
|
48
|
+
it "does not suppress an exception when a method that doesn't exist is invoked" do
|
|
49
|
+
allow_any_instance_of(klass).to receive(:foo)
|
|
50
|
+
expect { klass.new.bar }.to raise_error(NoMethodError)
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
context 'multiple methods' do
|
|
54
|
+
it "allows multiple methods to be stubbed in a single invocation" do
|
|
55
|
+
allow_any_instance_of(klass).to receive_messages(:foo => 'foo', :bar => 'bar')
|
|
56
|
+
instance = klass.new
|
|
57
|
+
expect(instance.foo).to eq('foo')
|
|
58
|
+
expect(instance.bar).to eq('bar')
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
context "allows a chain of methods to be stubbed using #receive_message_chain" do
|
|
62
|
+
example "given symbols representing the methods" do
|
|
63
|
+
allow_any_instance_of(klass).to receive_message_chain(:one, :two, :three).and_return(:four)
|
|
64
|
+
expect(klass.new.one.two.three).to eq(:four)
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
example "given a hash as the last argument uses the value as the expected return value" do
|
|
68
|
+
allow_any_instance_of(klass).to receive_message_chain(:one, :two, :three => :four)
|
|
69
|
+
expect(klass.new.one.two.three).to eq(:four)
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
example "given a string of '.' separated method names representing the chain" do
|
|
73
|
+
allow_any_instance_of(klass).to receive_message_chain('one.two.three').and_return(:four)
|
|
74
|
+
expect(klass.new.one.two.three).to eq(:four)
|
|
75
|
+
end
|
|
76
|
+
end
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
context "behaves as 'every instance'" do
|
|
80
|
+
let(:super_class) { Class.new { def foo; 'bar'; end } }
|
|
81
|
+
let(:sub_class) { Class.new(super_class) }
|
|
82
|
+
|
|
83
|
+
it "stubs every instance in the spec" do
|
|
84
|
+
allow_any_instance_of(klass).to receive(:foo).and_return(result = Object.new)
|
|
85
|
+
expect(klass.new.foo).to eq(result)
|
|
86
|
+
expect(klass.new.foo).to eq(result)
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
it "stubs instance created before any_instance was called" do
|
|
90
|
+
instance = klass.new
|
|
91
|
+
allow_any_instance_of(klass).to receive(:foo).and_return(result = Object.new)
|
|
92
|
+
expect(instance.foo).to eq(result)
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
it 'handles freeze and duplication correctly' do
|
|
96
|
+
allow_any_instance_of(String).to receive(:any_method)
|
|
97
|
+
|
|
98
|
+
foo = 'foo'.freeze
|
|
99
|
+
expect(foo.dup.concat 'bar').to eq 'foobar'
|
|
100
|
+
end
|
|
101
|
+
|
|
102
|
+
it 'handles stubbing on super and subclasses' do
|
|
103
|
+
allow_any_instance_of(super_class).to receive(:foo)
|
|
104
|
+
allow_any_instance_of(sub_class).to receive(:foo).and_return('baz')
|
|
105
|
+
expect(sub_class.new.foo).to eq('baz')
|
|
106
|
+
end
|
|
107
|
+
|
|
108
|
+
it 'handles method restoration on subclasses' do
|
|
109
|
+
allow_any_instance_of(super_class).to receive(:foo)
|
|
110
|
+
allow_any_instance_of(sub_class).to receive(:foo)
|
|
111
|
+
allow_any_instance_of(sub_class).to receive(:foo).and_call_original
|
|
112
|
+
expect(sub_class.new.foo).to eq("bar")
|
|
113
|
+
end
|
|
114
|
+
end
|
|
115
|
+
|
|
116
|
+
context "when the class has a prepended module", :if => Support::RubyFeatures.module_prepends_supported? do
|
|
117
|
+
it 'allows stubbing a method that is not defined on the prepended module' do
|
|
118
|
+
klass.class_eval { prepend Module.new { def other; end } }
|
|
119
|
+
allow_any_instance_of(klass).to receive(:foo).and_return(45)
|
|
120
|
+
|
|
121
|
+
expect(klass.new.foo).to eq(45)
|
|
122
|
+
end
|
|
123
|
+
|
|
124
|
+
it 'prevents stubbing a method that is defined on the prepended module' do
|
|
125
|
+
klass.class_eval { prepend Module.new { def foo; end } }
|
|
126
|
+
|
|
127
|
+
expect {
|
|
128
|
+
allow_any_instance_of(klass).to receive(:foo).and_return(45)
|
|
129
|
+
}.to fail_with(/prepended module/)
|
|
130
|
+
end
|
|
131
|
+
|
|
132
|
+
it 'allows stubbing a chain starting with a method that is not defined on the prepended module' do
|
|
133
|
+
klass.class_eval { prepend Module.new { def other; end } }
|
|
134
|
+
allow_any_instance_of(klass).to receive_message_chain(:foo, :bar).and_return(45)
|
|
135
|
+
|
|
136
|
+
expect(klass.new.foo.bar).to eq(45)
|
|
137
|
+
end
|
|
138
|
+
|
|
139
|
+
it 'prevents stubbing a chain starting with a method that is defined on the prepended module' do
|
|
140
|
+
klass.class_eval { prepend Module.new { def foo; end } }
|
|
141
|
+
|
|
142
|
+
expect {
|
|
143
|
+
allow_any_instance_of(klass).to receive_message_chain(:foo, :bar).and_return(45)
|
|
144
|
+
}.to fail_with(/prepended module/)
|
|
145
|
+
end
|
|
146
|
+
end
|
|
147
|
+
|
|
148
|
+
context "with argument matching" do
|
|
149
|
+
before do
|
|
150
|
+
allow_any_instance_of(klass).to receive(:foo).with(:param_one, :param_two).and_return(:result_one)
|
|
151
|
+
allow_any_instance_of(klass).to receive(:foo).with(:param_three, :param_four).and_return(:result_two)
|
|
152
|
+
end
|
|
153
|
+
|
|
154
|
+
it "returns the stubbed value when arguments match" do
|
|
155
|
+
instance = klass.new
|
|
156
|
+
expect(instance.foo(:param_one, :param_two)).to eq(:result_one)
|
|
157
|
+
expect(instance.foo(:param_three, :param_four)).to eq(:result_two)
|
|
158
|
+
end
|
|
159
|
+
|
|
160
|
+
it "fails the spec with an expectation error when the arguments do not match" do
|
|
161
|
+
expect do
|
|
162
|
+
klass.new.foo(:param_one, :param_three)
|
|
163
|
+
end.to(raise_error(RSpec::Mocks::MockExpectationError))
|
|
164
|
+
end
|
|
165
|
+
end
|
|
166
|
+
|
|
167
|
+
context "with multiple stubs" do
|
|
168
|
+
before do
|
|
169
|
+
allow_any_instance_of(klass).to receive(:foo).and_return(1)
|
|
170
|
+
allow_any_instance_of(klass).to receive(:bar).and_return(2)
|
|
171
|
+
end
|
|
172
|
+
|
|
173
|
+
it "stubs a method" do
|
|
174
|
+
instance = klass.new
|
|
175
|
+
expect(instance.foo).to eq(1)
|
|
176
|
+
expect(instance.bar).to eq(2)
|
|
177
|
+
end
|
|
178
|
+
|
|
179
|
+
it "returns the same value for calls on different instances" do
|
|
180
|
+
expect(klass.new.foo).to eq(klass.new.foo)
|
|
181
|
+
expect(klass.new.bar).to eq(klass.new.bar)
|
|
182
|
+
end
|
|
183
|
+
end
|
|
184
|
+
|
|
185
|
+
context "with #and_return" do
|
|
186
|
+
it "can stub a method that doesn't exist" do
|
|
187
|
+
allow_any_instance_of(klass).to receive(:foo).and_return(1)
|
|
188
|
+
expect(klass.new.foo).to eq(1)
|
|
189
|
+
end
|
|
190
|
+
|
|
191
|
+
it "can stub a method that exists" do
|
|
192
|
+
allow_any_instance_of(klass).to receive(:existing_method).and_return(1)
|
|
193
|
+
expect(klass.new.existing_method).to eq(1)
|
|
194
|
+
end
|
|
195
|
+
|
|
196
|
+
it "returns the same object for calls on different instances" do
|
|
197
|
+
return_value = Object.new
|
|
198
|
+
allow_any_instance_of(klass).to receive(:foo).and_return(return_value)
|
|
199
|
+
expect(klass.new.foo).to be(return_value)
|
|
200
|
+
expect(klass.new.foo).to be(return_value)
|
|
201
|
+
end
|
|
202
|
+
|
|
203
|
+
it "can change how instances responds in the middle of an example" do
|
|
204
|
+
instance = klass.new
|
|
205
|
+
|
|
206
|
+
allow_any_instance_of(klass).to receive(:foo).and_return(1)
|
|
207
|
+
expect(instance.foo).to eq(1)
|
|
208
|
+
allow_any_instance_of(klass).to receive(:foo).and_return(2)
|
|
209
|
+
expect(instance.foo).to eq(2)
|
|
210
|
+
allow_any_instance_of(klass).to receive(:foo).and_raise("boom")
|
|
211
|
+
expect { instance.foo }.to raise_error("boom")
|
|
212
|
+
end
|
|
213
|
+
end
|
|
214
|
+
|
|
215
|
+
context "with #and_yield" do
|
|
216
|
+
it "yields the value specified" do
|
|
217
|
+
yielded_value = Object.new
|
|
218
|
+
allow_any_instance_of(klass).to receive(:foo).and_yield(yielded_value)
|
|
219
|
+
expect { |b| klass.new.foo(&b) }.to yield_with_args(yielded_value)
|
|
220
|
+
end
|
|
221
|
+
end
|
|
222
|
+
|
|
223
|
+
context 'with #and_call_original and competing #with' do
|
|
224
|
+
let(:klass) { Struct.new(:a_method) }
|
|
225
|
+
|
|
226
|
+
it 'can combine and_call_original, with, and_return' do
|
|
227
|
+
allow_any_instance_of(klass).to receive(:a_method).and_call_original
|
|
228
|
+
allow_any_instance_of(klass).to receive(:a_method).with(:arg).and_return('value')
|
|
229
|
+
|
|
230
|
+
expect(klass.new('org').a_method).to eq 'org'
|
|
231
|
+
expect(klass.new.a_method(:arg)).to eq 'value'
|
|
232
|
+
end
|
|
233
|
+
|
|
234
|
+
it 'can combine and_call_original, with, and_return (old syntax)' do
|
|
235
|
+
allow_any_instance_of(klass).to receive(:a_method).and_call_original
|
|
236
|
+
allow_any_instance_of(klass).to receive(:a_method).with(:arg).and_return('value')
|
|
237
|
+
|
|
238
|
+
expect(klass.new('org').a_method).to eq 'org'
|
|
239
|
+
expect(klass.new.a_method(:arg)).to eq 'value'
|
|
240
|
+
end
|
|
241
|
+
end
|
|
242
|
+
|
|
243
|
+
context "with #and_raise" do
|
|
244
|
+
it "can stub a method that doesn't exist" do
|
|
245
|
+
allow_any_instance_of(klass).to receive(:foo).and_raise(CustomErrorForAnyInstanceSpec)
|
|
246
|
+
expect { klass.new.foo }.to raise_error(CustomErrorForAnyInstanceSpec)
|
|
247
|
+
end
|
|
248
|
+
|
|
249
|
+
it "can stub a method that exists" do
|
|
250
|
+
allow_any_instance_of(klass).to receive(:existing_method).and_raise(CustomErrorForAnyInstanceSpec)
|
|
251
|
+
expect { klass.new.existing_method }.to raise_error(CustomErrorForAnyInstanceSpec)
|
|
252
|
+
end
|
|
253
|
+
end
|
|
254
|
+
|
|
255
|
+
context "with a block" do
|
|
256
|
+
it "stubs a method" do
|
|
257
|
+
allow_any_instance_of(klass).to receive(:foo) { 1 }
|
|
258
|
+
expect(klass.new.foo).to eq(1)
|
|
259
|
+
end
|
|
260
|
+
|
|
261
|
+
it "returns the same computed value for calls on different instances" do
|
|
262
|
+
allow_any_instance_of(klass).to receive(:foo) { 1 + 2 }
|
|
263
|
+
expect(klass.new.foo).to eq(klass.new.foo)
|
|
264
|
+
end
|
|
265
|
+
end
|
|
266
|
+
|
|
267
|
+
context "when partially mocking objects" do
|
|
268
|
+
let(:obj) { klass.new }
|
|
269
|
+
|
|
270
|
+
it "resets partially mocked objects correctly" do
|
|
271
|
+
allow_any_instance_of(klass).to receive(:existing_method).and_return("stubbed value")
|
|
272
|
+
|
|
273
|
+
# Simply resetting the proxy doesn't work
|
|
274
|
+
# what we need to have happen is
|
|
275
|
+
# ::RSpec::Mocks.space.any_instance_recorder_for(klass).stop_all_observation!
|
|
276
|
+
# but that is never invoked in ::
|
|
277
|
+
expect {
|
|
278
|
+
verify_all
|
|
279
|
+
}.to(
|
|
280
|
+
change { obj.existing_method }.from("stubbed value").to(:existing_method_return_value)
|
|
281
|
+
)
|
|
282
|
+
end
|
|
283
|
+
end
|
|
284
|
+
|
|
285
|
+
context "core ruby objects" do
|
|
286
|
+
it "works uniformly across *everything*" do
|
|
287
|
+
allow_any_instance_of(Object).to receive(:foo).and_return(1)
|
|
288
|
+
expect(Object.new.foo).to eq(1)
|
|
289
|
+
end
|
|
290
|
+
|
|
291
|
+
it "works with the non-standard constructor []" do
|
|
292
|
+
allow_any_instance_of(Array).to receive(:foo).and_return(1)
|
|
293
|
+
expect([].foo).to eq(1)
|
|
294
|
+
end
|
|
295
|
+
|
|
296
|
+
it "works with the non-standard constructor {}" do
|
|
297
|
+
allow_any_instance_of(Hash).to receive(:foo).and_return(1)
|
|
298
|
+
expect({}.foo).to eq(1)
|
|
299
|
+
end
|
|
300
|
+
|
|
301
|
+
it "works with the non-standard constructor \"\"" do
|
|
302
|
+
allow_any_instance_of(String).to receive(:foo).and_return(1)
|
|
303
|
+
expect("".foo).to eq(1)
|
|
304
|
+
end
|
|
305
|
+
|
|
306
|
+
it "works with the non-standard constructor \'\'" do
|
|
307
|
+
allow_any_instance_of(String).to receive(:foo).and_return(1)
|
|
308
|
+
expect(''.foo).to eq(1)
|
|
309
|
+
end
|
|
310
|
+
|
|
311
|
+
it "works with the non-standard constructor module" do
|
|
312
|
+
allow_any_instance_of(Module).to receive(:foo).and_return(1)
|
|
313
|
+
module RSpec::SampleRspecTestModule;end
|
|
314
|
+
expect(RSpec::SampleRspecTestModule.foo).to eq(1)
|
|
315
|
+
end
|
|
316
|
+
|
|
317
|
+
it "works with the non-standard constructor class" do
|
|
318
|
+
allow_any_instance_of(Class).to receive(:foo).and_return(1)
|
|
319
|
+
class RSpec::SampleRspecTestClass;end
|
|
320
|
+
expect(RSpec::SampleRspecTestClass.foo).to eq(1)
|
|
321
|
+
end
|
|
322
|
+
end
|
|
323
|
+
end
|
|
324
|
+
|
|
325
|
+
context "unstubbing using `and_call_original`" do
|
|
326
|
+
it "replaces the stubbed method with the original method" do
|
|
327
|
+
allow_any_instance_of(klass).to receive(:existing_method)
|
|
328
|
+
allow_any_instance_of(klass).to receive(:existing_method).and_call_original
|
|
329
|
+
expect(klass.new.existing_method).to eq(:existing_method_return_value)
|
|
330
|
+
end
|
|
331
|
+
|
|
332
|
+
it "removes all stubs with the supplied method name" do
|
|
333
|
+
allow_any_instance_of(klass).to receive(:existing_method).with(1)
|
|
334
|
+
allow_any_instance_of(klass).to receive(:existing_method).with(2)
|
|
335
|
+
allow_any_instance_of(klass).to receive(:existing_method).and_call_original
|
|
336
|
+
expect(klass.new.existing_method).to eq(:existing_method_return_value)
|
|
337
|
+
end
|
|
338
|
+
|
|
339
|
+
it "removes stubs even if they have already been invoked" do
|
|
340
|
+
allow_any_instance_of(klass).to receive(:existing_method).and_return(:any_instance_value)
|
|
341
|
+
obj = klass.new
|
|
342
|
+
obj.existing_method
|
|
343
|
+
allow_any_instance_of(klass).to receive(:existing_method).and_call_original
|
|
344
|
+
|
|
345
|
+
expect(obj.existing_method).to eq(:existing_method_return_value)
|
|
346
|
+
end
|
|
347
|
+
|
|
348
|
+
it "removes stubs from sub class after invokation when super class was originally stubbed" do
|
|
349
|
+
allow_any_instance_of(klass).to receive(:existing_method).and_return(:any_instance_value)
|
|
350
|
+
obj = Class.new(klass).new
|
|
351
|
+
expect(obj.existing_method).to eq(:any_instance_value)
|
|
352
|
+
allow_any_instance_of(klass).to receive(:existing_method).and_call_original
|
|
353
|
+
|
|
354
|
+
expect(obj.existing_method).to eq(:existing_method_return_value)
|
|
355
|
+
end
|
|
356
|
+
|
|
357
|
+
it "removes any stubs set directly on an instance" do
|
|
358
|
+
allow_any_instance_of(klass).to receive(:existing_method).and_return(:any_instance_value)
|
|
359
|
+
obj = klass.new
|
|
360
|
+
allow(obj).to receive(:existing_method).and_return(:local_method)
|
|
361
|
+
allow_any_instance_of(klass).to receive(:existing_method).and_call_original
|
|
362
|
+
expect(obj.existing_method).to eq(:existing_method_return_value)
|
|
363
|
+
end
|
|
364
|
+
|
|
365
|
+
it "does not remove any expectations with the same method name" do
|
|
366
|
+
expect_any_instance_of(klass).to receive(:existing_method_with_arguments).with(3).and_return(:three)
|
|
367
|
+
allow_any_instance_of(klass).to receive(:existing_method_with_arguments).with(1)
|
|
368
|
+
allow_any_instance_of(klass).to receive(:existing_method_with_arguments).with(2)
|
|
369
|
+
allow_any_instance_of(klass).to receive(:existing_method_with_arguments).and_call_original
|
|
370
|
+
expect(klass.new.existing_method_with_arguments(3)).to eq(:three)
|
|
371
|
+
end
|
|
372
|
+
|
|
373
|
+
it 'does not get confused about string vs symbol usage for the message' do
|
|
374
|
+
allow_any_instance_of(klass).to receive(:existing_method) { :stubbed }
|
|
375
|
+
allow_any_instance_of(klass).to receive("existing_method").and_call_original
|
|
376
|
+
expect(klass.new.existing_method).to eq(:existing_method_return_value)
|
|
377
|
+
end
|
|
378
|
+
end
|
|
379
|
+
|
|
380
|
+
context "expect_any_instance_of(...).not_to receive" do
|
|
381
|
+
it "fails if the method is called" do
|
|
382
|
+
expect_any_instance_of(klass).not_to receive(:existing_method)
|
|
383
|
+
expect { klass.new.existing_method }.to raise_error(RSpec::Mocks::MockExpectationError)
|
|
384
|
+
end
|
|
385
|
+
|
|
386
|
+
it "passes if no method is called" do
|
|
387
|
+
expect { expect_any_instance_of(klass).not_to receive(:existing_method) }.to_not raise_error
|
|
388
|
+
end
|
|
389
|
+
|
|
390
|
+
it "passes if only a different method is called" do
|
|
391
|
+
expect_any_instance_of(klass).not_to receive(:existing_method)
|
|
392
|
+
expect { klass.new.another_existing_method }.to_not raise_error
|
|
393
|
+
end
|
|
394
|
+
|
|
395
|
+
it "affects previously stubbed instances" do
|
|
396
|
+
instance = klass.new
|
|
397
|
+
|
|
398
|
+
allow_any_instance_of(klass).to receive(:foo).and_return(1)
|
|
399
|
+
expect(instance.foo).to eq(1)
|
|
400
|
+
expect_any_instance_of(klass).not_to receive(:foo)
|
|
401
|
+
expect { instance.foo }.to fail
|
|
402
|
+
end
|
|
403
|
+
|
|
404
|
+
context "with constraints" do
|
|
405
|
+
it "fails if the method is called with the specified parameters" do
|
|
406
|
+
expect_any_instance_of(klass).not_to receive(:existing_method_with_arguments).with(:argument_one, :argument_two)
|
|
407
|
+
expect {
|
|
408
|
+
klass.new.existing_method_with_arguments(:argument_one, :argument_two)
|
|
409
|
+
}.to raise_error(RSpec::Mocks::MockExpectationError)
|
|
410
|
+
end
|
|
411
|
+
|
|
412
|
+
it "passes if the method is called with different parameters" do
|
|
413
|
+
expect_any_instance_of(klass).not_to receive(:existing_method_with_arguments).with(:argument_one, :argument_two)
|
|
414
|
+
expect { klass.new.existing_method_with_arguments(:argument_three, :argument_four) }.to_not raise_error
|
|
415
|
+
end
|
|
416
|
+
end
|
|
417
|
+
|
|
418
|
+
context 'when used in combination with should_receive' do
|
|
419
|
+
it 'passes if only the expected message is received' do
|
|
420
|
+
expect_any_instance_of(klass).to receive(:foo)
|
|
421
|
+
expect_any_instance_of(klass).not_to receive(:bar)
|
|
422
|
+
klass.new.foo
|
|
423
|
+
verify_all
|
|
424
|
+
end
|
|
425
|
+
end
|
|
426
|
+
|
|
427
|
+
it "prevents confusing double-negative expressions involving `never`" do
|
|
428
|
+
expect {
|
|
429
|
+
expect_any_instance_of(klass).not_to receive(:not_expected).never
|
|
430
|
+
}.to raise_error(/trying to negate it again/)
|
|
431
|
+
end
|
|
432
|
+
end
|
|
433
|
+
|
|
434
|
+
context "setting a message expectation" do
|
|
435
|
+
let(:foo_expectation_error_message) { 'Exactly one instance should have received the following message(s) but didn\'t: foo' }
|
|
436
|
+
let(:existing_method_expectation_error_message) { 'Exactly one instance should have received the following message(s) but didn\'t: existing_method' }
|
|
437
|
+
|
|
438
|
+
it "handles inspect accessing expected methods" do
|
|
439
|
+
klass.class_eval do
|
|
440
|
+
def inspect
|
|
441
|
+
"The contents of output: #{stdout}"
|
|
442
|
+
end
|
|
443
|
+
end
|
|
444
|
+
|
|
445
|
+
expect_any_instance_of(klass).to receive(:stdout).at_least(:twice)
|
|
446
|
+
expect do
|
|
447
|
+
klass.new.stdout
|
|
448
|
+
klass.new.stdout
|
|
449
|
+
end.to raise_error(/The message 'stdout' was received by/)
|
|
450
|
+
reset_all
|
|
451
|
+
end
|
|
452
|
+
|
|
453
|
+
it "affects previously stubbed instances" do
|
|
454
|
+
instance = klass.new
|
|
455
|
+
|
|
456
|
+
allow_any_instance_of(klass).to receive(:foo).and_return(1)
|
|
457
|
+
expect(instance.foo).to eq(1)
|
|
458
|
+
expect_any_instance_of(klass).to receive(:foo).with(2).and_return(2)
|
|
459
|
+
expect(instance.foo(2)).to eq(2)
|
|
460
|
+
end
|
|
461
|
+
|
|
462
|
+
it "does not set the expectation on every instance" do
|
|
463
|
+
# Setup an unrelated object of the same class that won't receive the expected message.
|
|
464
|
+
allow('non-related object').to receive(:non_related_method)
|
|
465
|
+
|
|
466
|
+
expect_any_instance_of(Object).to receive(:foo)
|
|
467
|
+
'something'.foo
|
|
468
|
+
end
|
|
469
|
+
|
|
470
|
+
it "does not modify the return value of stubs set on an instance" do
|
|
471
|
+
expect_any_instance_of(Object).to receive(:foo).twice
|
|
472
|
+
object = Object.new
|
|
473
|
+
allow(object).to receive(:foo).and_return(3)
|
|
474
|
+
expect(object.foo).to eq(3)
|
|
475
|
+
expect(object.foo).to eq(3)
|
|
476
|
+
end
|
|
477
|
+
|
|
478
|
+
it "does not modify the return value of stubs set on an instance of a subclass" do
|
|
479
|
+
subklass = Class.new(klass)
|
|
480
|
+
subinstance = subklass.new
|
|
481
|
+
allow_any_instance_of(klass).to receive(:foo).and_return(1)
|
|
482
|
+
expect(subinstance.foo).to eq(1)
|
|
483
|
+
expect_any_instance_of(klass).to receive(:foo).with(2).and_return(2)
|
|
484
|
+
expect(subinstance.foo(2)).to eq(2)
|
|
485
|
+
end
|
|
486
|
+
|
|
487
|
+
it "properly notifies any instance recorders at multiple levels of hierarchy when a directly stubbed object receives a message" do
|
|
488
|
+
subclass = Class.new(klass)
|
|
489
|
+
instance = subclass.new
|
|
490
|
+
|
|
491
|
+
expect_any_instance_of(klass).to receive(:msg_1)
|
|
492
|
+
expect_any_instance_of(subclass).to receive(:msg_2)
|
|
493
|
+
|
|
494
|
+
allow(instance).to receive_messages(:msg_1 => "a", :msg_2 => "b")
|
|
495
|
+
|
|
496
|
+
expect(instance.msg_1).to eq("a")
|
|
497
|
+
expect(instance.msg_2).to eq("b")
|
|
498
|
+
end
|
|
499
|
+
|
|
500
|
+
it "properly notifies any instance recorders when they are created after the object's mock proxy" do
|
|
501
|
+
object = Object.new
|
|
502
|
+
allow(object).to receive(:bar)
|
|
503
|
+
expect_any_instance_of(Object).to receive(:foo).twice
|
|
504
|
+
allow(object).to receive(:foo).and_return(3)
|
|
505
|
+
expect(object.foo).to eq(3)
|
|
506
|
+
expect(object.foo).to eq(3)
|
|
507
|
+
end
|
|
508
|
+
|
|
509
|
+
context "when the class has a prepended module", :if => Support::RubyFeatures.module_prepends_supported? do
|
|
510
|
+
it 'allows mocking a method that is not defined on the prepended module' do
|
|
511
|
+
klass.class_eval { prepend Module.new { def other; end } }
|
|
512
|
+
expect_any_instance_of(klass).to receive(:foo).and_return(45)
|
|
513
|
+
|
|
514
|
+
expect(klass.new.foo).to eq(45)
|
|
515
|
+
end
|
|
516
|
+
|
|
517
|
+
it 'prevents mocking a method that is defined on the prepended module' do
|
|
518
|
+
klass.class_eval { prepend Module.new { def foo; end } }
|
|
519
|
+
|
|
520
|
+
expect {
|
|
521
|
+
expect_any_instance_of(klass).to receive(:foo).and_return(45)
|
|
522
|
+
}.to fail_with(/prepended module/)
|
|
523
|
+
end
|
|
524
|
+
end
|
|
525
|
+
|
|
526
|
+
context "when the class has an included module" do
|
|
527
|
+
it 'allows mocking a method that is defined on the module' do
|
|
528
|
+
mod = Module.new { def foo; end }
|
|
529
|
+
klass.class_eval { include mod }
|
|
530
|
+
expect_any_instance_of(mod).to receive(:foo).and_return(45)
|
|
531
|
+
|
|
532
|
+
expect(klass.new.foo).to eq(45)
|
|
533
|
+
end
|
|
534
|
+
end
|
|
535
|
+
|
|
536
|
+
context "when an instance has been directly stubbed" do
|
|
537
|
+
it "fails when a second instance to receive the message" do
|
|
538
|
+
expect_any_instance_of(klass).to receive(:foo)
|
|
539
|
+
instance_1 = klass.new
|
|
540
|
+
|
|
541
|
+
allow(instance_1).to receive(:foo).and_return(17)
|
|
542
|
+
expect(instance_1.foo).to eq(17)
|
|
543
|
+
|
|
544
|
+
expect {
|
|
545
|
+
klass.new.foo
|
|
546
|
+
}.to fail_with(/has already been received/)
|
|
547
|
+
end
|
|
548
|
+
end
|
|
549
|
+
|
|
550
|
+
context "when argument matching is used and an instance has stubbed the message" do
|
|
551
|
+
it "fails on verify if the arguments do not match" do
|
|
552
|
+
expect_any_instance_of(klass).to receive(:foo).with(3)
|
|
553
|
+
instance = klass.new
|
|
554
|
+
allow(instance).to receive(:foo).and_return(2)
|
|
555
|
+
|
|
556
|
+
expect(instance.foo(4)).to eq(2)
|
|
557
|
+
expect { verify_all }.to fail
|
|
558
|
+
end
|
|
559
|
+
|
|
560
|
+
it "passes on verify if the arguments do match" do
|
|
561
|
+
expect_any_instance_of(klass).to receive(:foo).with(3)
|
|
562
|
+
instance = klass.new
|
|
563
|
+
allow(instance).to receive(:foo).and_return(2)
|
|
564
|
+
|
|
565
|
+
expect(instance.foo(3)).to eq(2)
|
|
566
|
+
expect { verify_all }.not_to raise_error
|
|
567
|
+
end
|
|
568
|
+
end
|
|
569
|
+
|
|
570
|
+
context "with an expectation is set on a method which does not exist" do
|
|
571
|
+
it "returns the expected value" do
|
|
572
|
+
expect_any_instance_of(klass).to receive(:foo).and_return(1)
|
|
573
|
+
expect(klass.new.foo(1)).to eq(1)
|
|
574
|
+
end
|
|
575
|
+
|
|
576
|
+
it "fails if an instance is created but no invocation occurs" do
|
|
577
|
+
expect do
|
|
578
|
+
expect_any_instance_of(klass).to receive(:foo)
|
|
579
|
+
klass.new
|
|
580
|
+
verify_all
|
|
581
|
+
end.to raise_error(RSpec::Mocks::MockExpectationError, foo_expectation_error_message)
|
|
582
|
+
end
|
|
583
|
+
|
|
584
|
+
it "fails if no instance is created" do
|
|
585
|
+
expect do
|
|
586
|
+
expect_any_instance_of(klass).to receive(:foo).and_return(1)
|
|
587
|
+
verify_all
|
|
588
|
+
end.to raise_error(RSpec::Mocks::MockExpectationError, foo_expectation_error_message)
|
|
589
|
+
end
|
|
590
|
+
|
|
591
|
+
it "fails if no instance is created and there are multiple expectations" do
|
|
592
|
+
expect do
|
|
593
|
+
expect_any_instance_of(klass).to receive(:foo)
|
|
594
|
+
expect_any_instance_of(klass).to receive(:bar)
|
|
595
|
+
verify_all
|
|
596
|
+
end.to raise_error(RSpec::Mocks::MockExpectationError, 'Exactly one instance should have received the following message(s) but didn\'t: bar, foo')
|
|
597
|
+
end
|
|
598
|
+
|
|
599
|
+
it "allows expectations on instances to take priority" do
|
|
600
|
+
expect_any_instance_of(klass).to receive(:foo)
|
|
601
|
+
klass.new.foo
|
|
602
|
+
|
|
603
|
+
instance = klass.new
|
|
604
|
+
expect(instance).to receive(:foo).and_return(result = Object.new)
|
|
605
|
+
expect(instance.foo).to eq(result)
|
|
606
|
+
end
|
|
607
|
+
|
|
608
|
+
context "behaves as 'exactly one instance'" do
|
|
609
|
+
it "passes if subsequent invocations do not receive that message" do
|
|
610
|
+
expect_any_instance_of(klass).to receive(:foo)
|
|
611
|
+
klass.new.foo
|
|
612
|
+
klass.new
|
|
613
|
+
end
|
|
614
|
+
|
|
615
|
+
it "fails if the method is invoked on a second instance" do
|
|
616
|
+
instance_one = klass.new
|
|
617
|
+
instance_two = klass.new
|
|
618
|
+
expect do
|
|
619
|
+
expect_any_instance_of(klass).to receive(:foo)
|
|
620
|
+
|
|
621
|
+
instance_one.foo
|
|
622
|
+
instance_two.foo
|
|
623
|
+
end.to raise_error(RSpec::Mocks::MockExpectationError, /The message 'foo' was received by .*#{instance_two.object_id}.* but has already been received by #{instance_one.inspect}/)
|
|
624
|
+
end
|
|
625
|
+
end
|
|
626
|
+
|
|
627
|
+
context "normal expectations on the class object" do
|
|
628
|
+
it "fail when unfulfilled" do
|
|
629
|
+
expect do
|
|
630
|
+
expect_any_instance_of(klass).to receive(:foo)
|
|
631
|
+
expect(klass).to receive(:woot)
|
|
632
|
+
klass.new.foo
|
|
633
|
+
verify_all
|
|
634
|
+
end.to(raise_error(RSpec::Mocks::MockExpectationError) do |error|
|
|
635
|
+
expect(error.message).not_to eq(existing_method_expectation_error_message)
|
|
636
|
+
end)
|
|
637
|
+
end
|
|
638
|
+
|
|
639
|
+
it "pass when expectations are met" do
|
|
640
|
+
expect_any_instance_of(klass).to receive(:foo)
|
|
641
|
+
expect(klass).to receive(:woot).and_return(result = Object.new)
|
|
642
|
+
klass.new.foo
|
|
643
|
+
expect(klass.woot).to eq(result)
|
|
644
|
+
end
|
|
645
|
+
end
|
|
646
|
+
end
|
|
647
|
+
|
|
648
|
+
context "with an expectation is set on a method that exists" do
|
|
649
|
+
it "returns the expected value" do
|
|
650
|
+
expect_any_instance_of(klass).to receive(:existing_method).and_return(1)
|
|
651
|
+
expect(klass.new.existing_method(1)).to eq(1)
|
|
652
|
+
end
|
|
653
|
+
|
|
654
|
+
it "fails if an instance is created but no invocation occurs" do
|
|
655
|
+
expect do
|
|
656
|
+
expect_any_instance_of(klass).to receive(:existing_method)
|
|
657
|
+
klass.new
|
|
658
|
+
verify_all
|
|
659
|
+
end.to raise_error(RSpec::Mocks::MockExpectationError, existing_method_expectation_error_message)
|
|
660
|
+
end
|
|
661
|
+
|
|
662
|
+
it "fails if no instance is created" do
|
|
663
|
+
expect do
|
|
664
|
+
expect_any_instance_of(klass).to receive(:existing_method)
|
|
665
|
+
verify_all
|
|
666
|
+
end.to raise_error(RSpec::Mocks::MockExpectationError, existing_method_expectation_error_message)
|
|
667
|
+
end
|
|
668
|
+
|
|
669
|
+
it "fails if no instance is created and there are multiple expectations" do
|
|
670
|
+
expect do
|
|
671
|
+
expect_any_instance_of(klass).to receive(:existing_method)
|
|
672
|
+
expect_any_instance_of(klass).to receive(:another_existing_method)
|
|
673
|
+
verify_all
|
|
674
|
+
end.to raise_error(RSpec::Mocks::MockExpectationError, 'Exactly one instance should have received the following message(s) but didn\'t: another_existing_method, existing_method')
|
|
675
|
+
end
|
|
676
|
+
|
|
677
|
+
context "after any one instance has received a message" do
|
|
678
|
+
it "passes if subsequent invocations do not receive that message" do
|
|
679
|
+
expect_any_instance_of(klass).to receive(:existing_method)
|
|
680
|
+
klass.new.existing_method
|
|
681
|
+
klass.new
|
|
682
|
+
end
|
|
683
|
+
|
|
684
|
+
it "fails if the method is invoked on a second instance" do
|
|
685
|
+
instance_one = klass.new
|
|
686
|
+
instance_two = klass.new
|
|
687
|
+
expect do
|
|
688
|
+
expect_any_instance_of(klass).to receive(:existing_method)
|
|
689
|
+
|
|
690
|
+
instance_one.existing_method
|
|
691
|
+
instance_two.existing_method
|
|
692
|
+
end.to raise_error(RSpec::Mocks::MockExpectationError, /The message 'existing_method' was received by .*#{instance_two.object_id}.* but has already been received by #{instance_one.inspect}/)
|
|
693
|
+
end
|
|
694
|
+
end
|
|
695
|
+
end
|
|
696
|
+
|
|
697
|
+
it 'works with a BasicObject subclass that mixes in Kernel', :if => defined?(BasicObject) do
|
|
698
|
+
klass = Class.new(BasicObject) do
|
|
699
|
+
include ::Kernel
|
|
700
|
+
def foo; end
|
|
701
|
+
end
|
|
702
|
+
|
|
703
|
+
expect_any_instance_of(klass).to receive(:foo)
|
|
704
|
+
klass.new.foo
|
|
705
|
+
end
|
|
706
|
+
|
|
707
|
+
it 'works with a SimpleDelegator subclass', :if => (RUBY_VERSION.to_f > 1.8) do
|
|
708
|
+
klass = Class.new(SimpleDelegator) do
|
|
709
|
+
def foo; end
|
|
710
|
+
end
|
|
711
|
+
|
|
712
|
+
expect_any_instance_of(klass).to receive(:foo)
|
|
713
|
+
klass.new(Object.new).foo
|
|
714
|
+
end
|
|
715
|
+
|
|
716
|
+
context "with argument matching" do
|
|
717
|
+
before do
|
|
718
|
+
expect_any_instance_of(klass).to receive(:foo).with(:param_one, :param_two).and_return(:result_one)
|
|
719
|
+
expect_any_instance_of(klass).to receive(:foo).with(:param_three, :param_four).and_return(:result_two)
|
|
720
|
+
end
|
|
721
|
+
|
|
722
|
+
it "returns the expected value when arguments match" do
|
|
723
|
+
instance = klass.new
|
|
724
|
+
expect(instance.foo(:param_one, :param_two)).to eq(:result_one)
|
|
725
|
+
expect(instance.foo(:param_three, :param_four)).to eq(:result_two)
|
|
726
|
+
end
|
|
727
|
+
|
|
728
|
+
it "fails when the arguments match but different instances are used" do
|
|
729
|
+
instances = Array.new(2) { klass.new }
|
|
730
|
+
expect do
|
|
731
|
+
expect(instances[0].foo(:param_one, :param_two)).to eq(:result_one)
|
|
732
|
+
expect(instances[1].foo(:param_three, :param_four)).to eq(:result_two)
|
|
733
|
+
end.to raise_error(RSpec::Mocks::MockExpectationError)
|
|
734
|
+
|
|
735
|
+
# ignore the fact that should_receive expectations were not met
|
|
736
|
+
instances.each { |instance| reset instance }
|
|
737
|
+
end
|
|
738
|
+
|
|
739
|
+
it "is not affected by the invocation of existing methods on other instances" do
|
|
740
|
+
expect(klass.new.existing_method_with_arguments(:param_one, :param_two)).to eq(:existing_method_with_arguments_return_value)
|
|
741
|
+
instance = klass.new
|
|
742
|
+
expect(instance.foo(:param_one, :param_two)).to eq(:result_one)
|
|
743
|
+
expect(instance.foo(:param_three, :param_four)).to eq(:result_two)
|
|
744
|
+
end
|
|
745
|
+
|
|
746
|
+
it "fails when arguments do not match" do
|
|
747
|
+
instance = klass.new
|
|
748
|
+
expect do
|
|
749
|
+
instance.foo(:param_one, :param_three)
|
|
750
|
+
end.to raise_error(RSpec::Mocks::MockExpectationError)
|
|
751
|
+
|
|
752
|
+
# ignore the fact that should_receive expectations were not met
|
|
753
|
+
reset instance
|
|
754
|
+
end
|
|
755
|
+
end
|
|
756
|
+
|
|
757
|
+
context "message count" do
|
|
758
|
+
context "the 'once' constraint" do
|
|
759
|
+
it "passes for one invocation" do
|
|
760
|
+
expect_any_instance_of(klass).to receive(:foo).once
|
|
761
|
+
klass.new.foo
|
|
762
|
+
end
|
|
763
|
+
|
|
764
|
+
it "fails when no instances are declared" do
|
|
765
|
+
expect do
|
|
766
|
+
expect_any_instance_of(klass).to receive(:foo).once
|
|
767
|
+
verify_all
|
|
768
|
+
end.to raise_error(RSpec::Mocks::MockExpectationError, foo_expectation_error_message)
|
|
769
|
+
end
|
|
770
|
+
|
|
771
|
+
it "fails when an instance is declared but there are no invocations" do
|
|
772
|
+
expect do
|
|
773
|
+
expect_any_instance_of(klass).to receive(:foo).once
|
|
774
|
+
klass.new
|
|
775
|
+
verify_all
|
|
776
|
+
end.to raise_error(RSpec::Mocks::MockExpectationError, foo_expectation_error_message)
|
|
777
|
+
end
|
|
778
|
+
|
|
779
|
+
it "fails for more than one invocation" do
|
|
780
|
+
expect do
|
|
781
|
+
expect_any_instance_of(klass).to receive(:foo).once
|
|
782
|
+
instance = klass.new
|
|
783
|
+
2.times { instance.foo }
|
|
784
|
+
verify instance
|
|
785
|
+
end.to raise_error(RSpec::Mocks::MockExpectationError)
|
|
786
|
+
end
|
|
787
|
+
end
|
|
788
|
+
|
|
789
|
+
context "the 'twice' constraint" do
|
|
790
|
+
it "passes for two invocations" do
|
|
791
|
+
expect_any_instance_of(klass).to receive(:foo).twice
|
|
792
|
+
instance = klass.new
|
|
793
|
+
2.times { instance.foo }
|
|
794
|
+
end
|
|
795
|
+
|
|
796
|
+
it "fails for more than two invocations" do
|
|
797
|
+
expect do
|
|
798
|
+
expect_any_instance_of(klass).to receive(:foo).twice
|
|
799
|
+
instance = klass.new
|
|
800
|
+
3.times { instance.foo }
|
|
801
|
+
verify instance
|
|
802
|
+
end.to raise_error(RSpec::Mocks::MockExpectationError)
|
|
803
|
+
end
|
|
804
|
+
end
|
|
805
|
+
|
|
806
|
+
context "the 'thrice' constraint" do
|
|
807
|
+
it "passes for three invocations" do
|
|
808
|
+
expect_any_instance_of(klass).to receive(:foo).thrice
|
|
809
|
+
instance = klass.new
|
|
810
|
+
3.times { instance.foo }
|
|
811
|
+
end
|
|
812
|
+
|
|
813
|
+
it "fails for more than three invocations" do
|
|
814
|
+
expect do
|
|
815
|
+
expect_any_instance_of(klass).to receive(:foo).thrice
|
|
816
|
+
instance = klass.new
|
|
817
|
+
4.times { instance.foo }
|
|
818
|
+
verify instance
|
|
819
|
+
end.to raise_error(RSpec::Mocks::MockExpectationError)
|
|
820
|
+
end
|
|
821
|
+
|
|
822
|
+
it "fails for less than three invocations" do
|
|
823
|
+
expect do
|
|
824
|
+
expect_any_instance_of(klass).to receive(:foo).thrice
|
|
825
|
+
instance = klass.new
|
|
826
|
+
2.times { instance.foo }
|
|
827
|
+
verify instance
|
|
828
|
+
end.to raise_error(RSpec::Mocks::MockExpectationError)
|
|
829
|
+
end
|
|
830
|
+
end
|
|
831
|
+
|
|
832
|
+
context "the 'exactly(n)' constraint" do
|
|
833
|
+
it "passes for n invocations where n = 3" do
|
|
834
|
+
expect_any_instance_of(klass).to receive(:foo).exactly(3).times
|
|
835
|
+
instance = klass.new
|
|
836
|
+
3.times { instance.foo }
|
|
837
|
+
end
|
|
838
|
+
|
|
839
|
+
it "fails for n invocations where n < 3" do
|
|
840
|
+
expect do
|
|
841
|
+
expect_any_instance_of(klass).to receive(:foo).exactly(3).times
|
|
842
|
+
instance = klass.new
|
|
843
|
+
2.times { instance.foo }
|
|
844
|
+
verify instance
|
|
845
|
+
end.to raise_error(RSpec::Mocks::MockExpectationError)
|
|
846
|
+
end
|
|
847
|
+
|
|
848
|
+
it "fails for n invocations where n > 3" do
|
|
849
|
+
expect do
|
|
850
|
+
expect_any_instance_of(klass).to receive(:foo).exactly(3).times
|
|
851
|
+
instance = klass.new
|
|
852
|
+
4.times { instance.foo }
|
|
853
|
+
verify instance
|
|
854
|
+
end.to raise_error(RSpec::Mocks::MockExpectationError)
|
|
855
|
+
end
|
|
856
|
+
end
|
|
857
|
+
|
|
858
|
+
context "the 'at_least(n)' constraint" do
|
|
859
|
+
it "passes for n invocations where n = 3" do
|
|
860
|
+
expect_any_instance_of(klass).to receive(:foo).at_least(3).times
|
|
861
|
+
instance = klass.new
|
|
862
|
+
3.times { instance.foo }
|
|
863
|
+
end
|
|
864
|
+
|
|
865
|
+
it "fails for n invocations where n < 3" do
|
|
866
|
+
expect do
|
|
867
|
+
expect_any_instance_of(klass).to receive(:foo).at_least(3).times
|
|
868
|
+
instance = klass.new
|
|
869
|
+
2.times { instance.foo }
|
|
870
|
+
verify instance
|
|
871
|
+
end.to raise_error(RSpec::Mocks::MockExpectationError)
|
|
872
|
+
end
|
|
873
|
+
|
|
874
|
+
it "passes for n invocations where n > 3" do
|
|
875
|
+
expect_any_instance_of(klass).to receive(:foo).at_least(3).times
|
|
876
|
+
instance = klass.new
|
|
877
|
+
4.times { instance.foo }
|
|
878
|
+
end
|
|
879
|
+
end
|
|
880
|
+
|
|
881
|
+
context "the 'at_most(n)' constraint" do
|
|
882
|
+
it "passes for n invocations where n = 3" do
|
|
883
|
+
expect_any_instance_of(klass).to receive(:foo).at_most(3).times
|
|
884
|
+
instance = klass.new
|
|
885
|
+
3.times { instance.foo }
|
|
886
|
+
end
|
|
887
|
+
|
|
888
|
+
it "passes for n invocations where n < 3" do
|
|
889
|
+
expect_any_instance_of(klass).to receive(:foo).at_most(3).times
|
|
890
|
+
instance = klass.new
|
|
891
|
+
2.times { instance.foo }
|
|
892
|
+
end
|
|
893
|
+
|
|
894
|
+
it "fails for n invocations where n > 3" do
|
|
895
|
+
expect do
|
|
896
|
+
expect_any_instance_of(klass).to receive(:foo).at_most(3).times
|
|
897
|
+
instance = klass.new
|
|
898
|
+
4.times { instance.foo }
|
|
899
|
+
verify instance
|
|
900
|
+
end.to raise_error(RSpec::Mocks::MockExpectationError)
|
|
901
|
+
end
|
|
902
|
+
end
|
|
903
|
+
|
|
904
|
+
context "the 'never' constraint" do
|
|
905
|
+
it "passes for 0 invocations" do
|
|
906
|
+
expect_any_instance_of(klass).to receive(:foo).never
|
|
907
|
+
verify_all
|
|
908
|
+
end
|
|
909
|
+
|
|
910
|
+
it "fails on the first invocation" do
|
|
911
|
+
expect do
|
|
912
|
+
expect_any_instance_of(klass).to receive(:foo).never
|
|
913
|
+
klass.new.foo
|
|
914
|
+
end.to raise_error(RSpec::Mocks::MockExpectationError)
|
|
915
|
+
end
|
|
916
|
+
|
|
917
|
+
context "when combined with other expectations" do
|
|
918
|
+
it "passes when the other expecations are met" do
|
|
919
|
+
expect_any_instance_of(klass).to receive(:foo).never
|
|
920
|
+
expect_any_instance_of(klass).to receive(:existing_method).and_return(5)
|
|
921
|
+
expect(klass.new.existing_method).to eq(5)
|
|
922
|
+
end
|
|
923
|
+
|
|
924
|
+
it "fails when the other expecations are not met" do
|
|
925
|
+
expect do
|
|
926
|
+
expect_any_instance_of(klass).to receive(:foo).never
|
|
927
|
+
expect_any_instance_of(klass).to receive(:existing_method).and_return(5)
|
|
928
|
+
verify_all
|
|
929
|
+
end.to raise_error(RSpec::Mocks::MockExpectationError, existing_method_expectation_error_message)
|
|
930
|
+
end
|
|
931
|
+
end
|
|
932
|
+
end
|
|
933
|
+
end
|
|
934
|
+
end
|
|
935
|
+
|
|
936
|
+
context "when resetting post-verification" do
|
|
937
|
+
let(:space) { RSpec::Mocks.space }
|
|
938
|
+
|
|
939
|
+
context "existing method" do
|
|
940
|
+
before(:each) do
|
|
941
|
+
RSpec::Mocks.space.any_instance_recorder_for(klass) # to force it to be tracked
|
|
942
|
+
end
|
|
943
|
+
|
|
944
|
+
context "with stubbing" do
|
|
945
|
+
context "public methods" do
|
|
946
|
+
before(:each) do
|
|
947
|
+
allow_any_instance_of(klass).to receive(:existing_method).and_return(1)
|
|
948
|
+
expect(klass.method_defined?(:__existing_method_without_any_instance__)).to be_truthy
|
|
949
|
+
end
|
|
950
|
+
|
|
951
|
+
it "restores the class to its original state after each example when no instance is created" do
|
|
952
|
+
verify_all
|
|
953
|
+
|
|
954
|
+
expect(klass.method_defined?(:__existing_method_without_any_instance__)).to be_falsey
|
|
955
|
+
expect(klass.new.existing_method).to eq(existing_method_return_value)
|
|
956
|
+
end
|
|
957
|
+
|
|
958
|
+
it "restores the class to its original state after each example when one instance is created" do
|
|
959
|
+
klass.new.existing_method
|
|
960
|
+
|
|
961
|
+
verify_all
|
|
962
|
+
|
|
963
|
+
expect(klass.method_defined?(:__existing_method_without_any_instance__)).to be_falsey
|
|
964
|
+
expect(klass.new.existing_method).to eq(existing_method_return_value)
|
|
965
|
+
end
|
|
966
|
+
|
|
967
|
+
it "restores the class to its original state after each example when more than one instance is created" do
|
|
968
|
+
klass.new.existing_method
|
|
969
|
+
klass.new.existing_method
|
|
970
|
+
|
|
971
|
+
verify_all
|
|
972
|
+
|
|
973
|
+
expect(klass.method_defined?(:__existing_method_without_any_instance__)).to be_falsey
|
|
974
|
+
expect(klass.new.existing_method).to eq(existing_method_return_value)
|
|
975
|
+
end
|
|
976
|
+
end
|
|
977
|
+
|
|
978
|
+
context "private methods" do
|
|
979
|
+
before :each do
|
|
980
|
+
allow_any_instance_of(klass).to receive(:private_method).and_return(:something)
|
|
981
|
+
|
|
982
|
+
verify_all
|
|
983
|
+
end
|
|
984
|
+
|
|
985
|
+
it "cleans up the backed up method" do
|
|
986
|
+
expect(klass.method_defined?(:__existing_method_without_any_instance__)).to be_falsey
|
|
987
|
+
end
|
|
988
|
+
|
|
989
|
+
it "restores a stubbed private method after the spec is run" do
|
|
990
|
+
expect(klass.private_method_defined?(:private_method)).to be_truthy
|
|
991
|
+
end
|
|
992
|
+
|
|
993
|
+
it "ensures that the restored method behaves as it originally did" do
|
|
994
|
+
expect(klass.new.send(:private_method)).to eq(:private_method_return_value)
|
|
995
|
+
end
|
|
996
|
+
end
|
|
997
|
+
end
|
|
998
|
+
|
|
999
|
+
context "with expectations" do
|
|
1000
|
+
context "private methods" do
|
|
1001
|
+
before :each do
|
|
1002
|
+
expect_any_instance_of(klass).to receive(:private_method).and_return(:something)
|
|
1003
|
+
klass.new.private_method
|
|
1004
|
+
|
|
1005
|
+
verify_all
|
|
1006
|
+
end
|
|
1007
|
+
|
|
1008
|
+
it "cleans up the backed up method" do
|
|
1009
|
+
expect(klass.method_defined?(:__existing_method_without_any_instance__)).to be_falsey
|
|
1010
|
+
end
|
|
1011
|
+
|
|
1012
|
+
it "restores a stubbed private method after the spec is run" do
|
|
1013
|
+
expect(klass.private_method_defined?(:private_method)).to be_truthy
|
|
1014
|
+
end
|
|
1015
|
+
|
|
1016
|
+
it "ensures that the restored method behaves as it originally did" do
|
|
1017
|
+
expect(klass.new.send(:private_method)).to eq(:private_method_return_value)
|
|
1018
|
+
end
|
|
1019
|
+
end
|
|
1020
|
+
|
|
1021
|
+
context "ensures that the subsequent specs do not see expectations set in previous specs" do
|
|
1022
|
+
context "when the instance created after the expectation is set" do
|
|
1023
|
+
it "first spec" do
|
|
1024
|
+
expect_any_instance_of(klass).to receive(:existing_method).and_return(Object.new)
|
|
1025
|
+
klass.new.existing_method
|
|
1026
|
+
end
|
|
1027
|
+
|
|
1028
|
+
it "second spec" do
|
|
1029
|
+
expect(klass.new.existing_method).to eq(existing_method_return_value)
|
|
1030
|
+
end
|
|
1031
|
+
end
|
|
1032
|
+
|
|
1033
|
+
context "when the instance created before the expectation is set" do
|
|
1034
|
+
before :each do
|
|
1035
|
+
@instance = klass.new
|
|
1036
|
+
end
|
|
1037
|
+
|
|
1038
|
+
it "first spec" do
|
|
1039
|
+
expect_any_instance_of(klass).to receive(:existing_method).and_return(Object.new)
|
|
1040
|
+
@instance.existing_method
|
|
1041
|
+
end
|
|
1042
|
+
|
|
1043
|
+
it "second spec" do
|
|
1044
|
+
expect(@instance.existing_method).to eq(existing_method_return_value)
|
|
1045
|
+
end
|
|
1046
|
+
end
|
|
1047
|
+
end
|
|
1048
|
+
|
|
1049
|
+
it "ensures that the next spec does not see that expectation" do
|
|
1050
|
+
expect_any_instance_of(klass).to receive(:existing_method).and_return(Object.new)
|
|
1051
|
+
klass.new.existing_method
|
|
1052
|
+
|
|
1053
|
+
verify_all
|
|
1054
|
+
|
|
1055
|
+
expect(klass.new.existing_method).to eq(existing_method_return_value)
|
|
1056
|
+
end
|
|
1057
|
+
end
|
|
1058
|
+
end
|
|
1059
|
+
|
|
1060
|
+
context "with multiple calls to any_instance in the same example" do
|
|
1061
|
+
it "does not prevent the change from being rolled back" do
|
|
1062
|
+
allow_any_instance_of(klass).to receive(:existing_method).and_return(false)
|
|
1063
|
+
allow_any_instance_of(klass).to receive(:existing_method).and_return(true)
|
|
1064
|
+
|
|
1065
|
+
verify_all
|
|
1066
|
+
expect(klass.new).to respond_to(:existing_method)
|
|
1067
|
+
expect(klass.new.existing_method).to eq(existing_method_return_value)
|
|
1068
|
+
end
|
|
1069
|
+
end
|
|
1070
|
+
|
|
1071
|
+
it "adds an instance to the current space when stubbed method is invoked" do
|
|
1072
|
+
allow_any_instance_of(klass).to receive(:foo)
|
|
1073
|
+
instance = klass.new
|
|
1074
|
+
instance.foo
|
|
1075
|
+
expect(RSpec::Mocks.space.proxies.keys).to include(instance.object_id)
|
|
1076
|
+
end
|
|
1077
|
+
end
|
|
1078
|
+
|
|
1079
|
+
context "passing the receiver to the implementation block" do
|
|
1080
|
+
context "when configured to pass the instance" do
|
|
1081
|
+
include_context 'with isolated configuration'
|
|
1082
|
+
before(:each) do
|
|
1083
|
+
RSpec::Mocks.configuration.yield_receiver_to_any_instance_implementation_blocks = true
|
|
1084
|
+
end
|
|
1085
|
+
|
|
1086
|
+
describe "an any instance stub" do
|
|
1087
|
+
it "passes the instance as the first arg of the implementation block" do
|
|
1088
|
+
instance = klass.new
|
|
1089
|
+
|
|
1090
|
+
expect { |b|
|
|
1091
|
+
expect_any_instance_of(klass).to receive(:bees).with(:sup, &b)
|
|
1092
|
+
instance.bees(:sup)
|
|
1093
|
+
}.to yield_with_args(instance, :sup)
|
|
1094
|
+
end
|
|
1095
|
+
|
|
1096
|
+
it "does not pass the instance to and_call_original" do
|
|
1097
|
+
klass = Class.new do
|
|
1098
|
+
def call(*args)
|
|
1099
|
+
args.first
|
|
1100
|
+
end
|
|
1101
|
+
end
|
|
1102
|
+
expect_any_instance_of(klass).to receive(:call).and_call_original
|
|
1103
|
+
instance = klass.new
|
|
1104
|
+
expect(instance.call(:bees)).to be :bees
|
|
1105
|
+
end
|
|
1106
|
+
end
|
|
1107
|
+
|
|
1108
|
+
describe "an any instance expectation" do
|
|
1109
|
+
it "doesn't effect with" do
|
|
1110
|
+
instance = klass.new
|
|
1111
|
+
expect_any_instance_of(klass).to receive(:bees).with(:sup)
|
|
1112
|
+
instance.bees(:sup)
|
|
1113
|
+
end
|
|
1114
|
+
|
|
1115
|
+
it "passes the instance as the first arg of the implementation block" do
|
|
1116
|
+
instance = klass.new
|
|
1117
|
+
|
|
1118
|
+
expect { |b|
|
|
1119
|
+
expect_any_instance_of(klass).to receive(:bees).with(:sup, &b)
|
|
1120
|
+
instance.bees(:sup)
|
|
1121
|
+
}.to yield_with_args(instance, :sup)
|
|
1122
|
+
end
|
|
1123
|
+
end
|
|
1124
|
+
end
|
|
1125
|
+
|
|
1126
|
+
context "when configured not to pass the instance" do
|
|
1127
|
+
include_context 'with isolated configuration'
|
|
1128
|
+
before(:each) do
|
|
1129
|
+
RSpec::Mocks.configuration.yield_receiver_to_any_instance_implementation_blocks = false
|
|
1130
|
+
end
|
|
1131
|
+
|
|
1132
|
+
describe "an any instance stub" do
|
|
1133
|
+
it "does not pass the instance to the implementation block" do
|
|
1134
|
+
instance = klass.new
|
|
1135
|
+
|
|
1136
|
+
expect { |b|
|
|
1137
|
+
expect_any_instance_of(klass).to receive(:bees).with(:sup, &b)
|
|
1138
|
+
instance.bees(:sup)
|
|
1139
|
+
}.to yield_with_args(:sup)
|
|
1140
|
+
end
|
|
1141
|
+
|
|
1142
|
+
it "does not cause with to fail when the instance is passed" do
|
|
1143
|
+
instance = klass.new
|
|
1144
|
+
expect_any_instance_of(klass).to receive(:bees).with(:faces)
|
|
1145
|
+
instance.bees(:faces)
|
|
1146
|
+
end
|
|
1147
|
+
end
|
|
1148
|
+
end
|
|
1149
|
+
end
|
|
1150
|
+
|
|
1151
|
+
context 'when used in conjunction with a `dup`' do
|
|
1152
|
+
it "doesn't cause an infinite loop" do
|
|
1153
|
+
skip "This intermittently fails on JRuby" if RUBY_PLATFORM == 'java'
|
|
1154
|
+
|
|
1155
|
+
allow_any_instance_of(Object).to receive(:some_method)
|
|
1156
|
+
o = Object.new
|
|
1157
|
+
o.some_method
|
|
1158
|
+
expect { o.dup.some_method }.to_not raise_error
|
|
1159
|
+
end
|
|
1160
|
+
|
|
1161
|
+
it "doesn't bomb if the object doesn't support `dup`" do
|
|
1162
|
+
klass = Class.new do
|
|
1163
|
+
undef_method :dup
|
|
1164
|
+
end
|
|
1165
|
+
allow_any_instance_of(klass).to receive(:foo)
|
|
1166
|
+
end
|
|
1167
|
+
|
|
1168
|
+
it "doesn't fail when dup accepts parameters" do
|
|
1169
|
+
klass = Class.new do
|
|
1170
|
+
def dup(funky_option)
|
|
1171
|
+
end
|
|
1172
|
+
end
|
|
1173
|
+
|
|
1174
|
+
allow_any_instance_of(klass).to receive(:foo)
|
|
1175
|
+
|
|
1176
|
+
expect { klass.new.dup('Dup dup dup') }.to_not raise_error
|
|
1177
|
+
end
|
|
1178
|
+
end
|
|
1179
|
+
|
|
1180
|
+
context "when directed at a method defined on a superclass" do
|
|
1181
|
+
let(:sub_klass) { Class.new(klass) }
|
|
1182
|
+
|
|
1183
|
+
it "stubs the method correctly" do
|
|
1184
|
+
allow_any_instance_of(klass).to receive(:existing_method).and_return("foo")
|
|
1185
|
+
expect(sub_klass.new.existing_method).to eq "foo"
|
|
1186
|
+
end
|
|
1187
|
+
|
|
1188
|
+
it "mocks the method correctly" do
|
|
1189
|
+
instance_one = sub_klass.new
|
|
1190
|
+
instance_two = sub_klass.new
|
|
1191
|
+
expect do
|
|
1192
|
+
expect_any_instance_of(klass).to receive(:existing_method)
|
|
1193
|
+
instance_one.existing_method
|
|
1194
|
+
instance_two.existing_method
|
|
1195
|
+
end.to raise_error(RSpec::Mocks::MockExpectationError, /The message 'existing_method' was received by .*#{instance_two.object_id}.* but has already been received by #{instance_one.inspect}/)
|
|
1196
|
+
end
|
|
1197
|
+
end
|
|
1198
|
+
|
|
1199
|
+
context "when a class overrides Object#method" do
|
|
1200
|
+
let(:http_request_class) { Struct.new(:method, :uri) }
|
|
1201
|
+
|
|
1202
|
+
it "stubs the method correctly" do
|
|
1203
|
+
allow_any_instance_of(http_request_class).to receive(:existing_method).and_return("foo")
|
|
1204
|
+
expect(http_request_class.new.existing_method).to eq "foo"
|
|
1205
|
+
end
|
|
1206
|
+
|
|
1207
|
+
it "mocks the method correctly" do
|
|
1208
|
+
expect_any_instance_of(http_request_class).to receive(:existing_method).and_return("foo")
|
|
1209
|
+
expect(http_request_class.new.existing_method).to eq "foo"
|
|
1210
|
+
end
|
|
1211
|
+
end
|
|
1212
|
+
|
|
1213
|
+
context "when used after the test has finished" do
|
|
1214
|
+
it "restores the original behavior of a stubbed method" do
|
|
1215
|
+
allow_any_instance_of(klass).to receive(:existing_method).and_return(:stubbed_return_value)
|
|
1216
|
+
|
|
1217
|
+
instance = klass.new
|
|
1218
|
+
expect(instance.existing_method).to eq :stubbed_return_value
|
|
1219
|
+
|
|
1220
|
+
verify_all
|
|
1221
|
+
|
|
1222
|
+
expect(instance.existing_method).to eq :existing_method_return_value
|
|
1223
|
+
end
|
|
1224
|
+
|
|
1225
|
+
it "restores the original behaviour, even if the expectation fails" do
|
|
1226
|
+
expect_any_instance_of(klass).to receive(:existing_method).with(1).and_return(:stubbed_return_value)
|
|
1227
|
+
|
|
1228
|
+
instance = klass.new
|
|
1229
|
+
begin
|
|
1230
|
+
instance.existing_method
|
|
1231
|
+
verify_all
|
|
1232
|
+
rescue RSpec::Mocks::MockExpectationError
|
|
1233
|
+
end
|
|
1234
|
+
|
|
1235
|
+
reset_all
|
|
1236
|
+
|
|
1237
|
+
expect(instance.existing_method).to eq :existing_method_return_value
|
|
1238
|
+
end
|
|
1239
|
+
end
|
|
1240
|
+
end
|
|
1241
|
+
end
|
|
1242
|
+
end
|