newbamboo-rspec 1.1.12
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.
- data/.autotest +4 -0
- data/History.txt +1263 -0
- data/License.txt +22 -0
- data/Manifest.txt +327 -0
- data/README.txt +57 -0
- data/Rakefile +104 -0
- data/TODO.txt +18 -0
- data/bin/autospec +4 -0
- data/bin/spec +4 -0
- data/examples/failing/README.txt +7 -0
- data/examples/failing/diffing_spec.rb +36 -0
- data/examples/failing/failing_autogenerated_docstrings_example.rb +19 -0
- data/examples/failing/failure_in_after.rb +10 -0
- data/examples/failing/failure_in_before.rb +10 -0
- data/examples/failing/mocking_example.rb +40 -0
- data/examples/failing/mocking_with_flexmock.rb +26 -0
- data/examples/failing/mocking_with_mocha.rb +25 -0
- data/examples/failing/mocking_with_rr.rb +27 -0
- data/examples/failing/partial_mock_example.rb +20 -0
- data/examples/failing/predicate_example.rb +34 -0
- data/examples/failing/raising_example.rb +47 -0
- data/examples/failing/spec_helper.rb +3 -0
- data/examples/failing/syntax_error_example.rb +7 -0
- data/examples/failing/team_spec.rb +44 -0
- data/examples/failing/timeout_behaviour.rb +7 -0
- data/examples/passing/autogenerated_docstrings_example.rb +25 -0
- data/examples/passing/before_and_after_example.rb +40 -0
- data/examples/passing/behave_as_example.rb +45 -0
- data/examples/passing/custom_expectation_matchers.rb +54 -0
- data/examples/passing/custom_formatter.rb +12 -0
- data/examples/passing/dynamic_spec.rb +9 -0
- data/examples/passing/file_accessor.rb +19 -0
- data/examples/passing/file_accessor_spec.rb +38 -0
- data/examples/passing/greeter_spec.rb +31 -0
- data/examples/passing/helper_method_example.rb +14 -0
- data/examples/passing/io_processor.rb +8 -0
- data/examples/passing/io_processor_spec.rb +21 -0
- data/examples/passing/legacy_spec.rb +11 -0
- data/examples/passing/mocking_example.rb +27 -0
- data/examples/passing/multi_threaded_example_group_runner.rb +26 -0
- data/examples/passing/nested_classes_example.rb +36 -0
- data/examples/passing/partial_mock_example.rb +29 -0
- data/examples/passing/pending_example.rb +20 -0
- data/examples/passing/predicate_example.rb +27 -0
- data/examples/passing/priority.txt +1 -0
- data/examples/passing/shared_example_group_example.rb +81 -0
- data/examples/passing/shared_stack_examples.rb +36 -0
- data/examples/passing/simple_matcher_example.rb +31 -0
- data/examples/passing/spec_helper.rb +3 -0
- data/examples/passing/stack.rb +36 -0
- data/examples/passing/stack_spec.rb +64 -0
- data/examples/passing/stack_spec_with_nested_example_groups.rb +67 -0
- data/examples/passing/stubbing_example.rb +69 -0
- data/examples/passing/yielding_example.rb +33 -0
- data/examples/ruby1.9.compatibility/access_to_constants_spec.rb +86 -0
- data/features/before_and_after_blocks/before_and_after_blocks.feature +168 -0
- data/features/example_groups/autogenerated_docstrings.feature +45 -0
- data/features/example_groups/example_group_with_should_methods.feature +17 -0
- data/features/example_groups/nested_groups.feature +17 -0
- data/features/example_groups/output.feature +20 -0
- data/features/interop/examples_and_tests_together.feature +31 -0
- data/features/interop/test_but_not_test_unit.feature +14 -0
- data/features/interop/test_case_with_should_methods.feature +17 -0
- data/features/mock_framework_integration/use_flexmock.feature +27 -0
- data/features/step_definitions/running_rspec.rb +54 -0
- data/features/support/env.rb +26 -0
- data/features/support/helpers/cmdline.rb +9 -0
- data/features/support/matchers/smart_match.rb +37 -0
- data/init.rb +9 -0
- data/lib/adapters/mock_frameworks/flexmock.rb +24 -0
- data/lib/adapters/mock_frameworks/mocha.rb +20 -0
- data/lib/adapters/mock_frameworks/rr.rb +22 -0
- data/lib/adapters/mock_frameworks/rspec.rb +20 -0
- data/lib/autotest/discover.rb +3 -0
- data/lib/autotest/rspec.rb +47 -0
- data/lib/spec/dsl/main.rb +87 -0
- data/lib/spec/dsl.rb +1 -0
- data/lib/spec/example/before_and_after_hooks.rb +99 -0
- data/lib/spec/example/errors.rb +30 -0
- data/lib/spec/example/example_group.rb +26 -0
- data/lib/spec/example/example_group_factory.rb +98 -0
- data/lib/spec/example/example_group_methods.rb +376 -0
- data/lib/spec/example/example_matcher.rb +44 -0
- data/lib/spec/example/example_methods.rb +137 -0
- data/lib/spec/example/module_reopening_fix.rb +21 -0
- data/lib/spec/example/pending.rb +18 -0
- data/lib/spec/example/shared_example_group.rb +59 -0
- data/lib/spec/example.rb +187 -0
- data/lib/spec/expectations/differs/default.rb +66 -0
- data/lib/spec/expectations/errors.rb +12 -0
- data/lib/spec/expectations/extensions/object.rb +63 -0
- data/lib/spec/expectations/extensions/string_and_symbol.rb +17 -0
- data/lib/spec/expectations/extensions.rb +2 -0
- data/lib/spec/expectations/handler.rb +32 -0
- data/lib/spec/expectations.rb +60 -0
- data/lib/spec/interop/test/unit/autorunner.rb +6 -0
- data/lib/spec/interop/test/unit/testcase.rb +73 -0
- data/lib/spec/interop/test/unit/testresult.rb +6 -0
- data/lib/spec/interop/test/unit/testsuite_adapter.rb +34 -0
- data/lib/spec/interop/test/unit/ui/console/testrunner.rb +61 -0
- data/lib/spec/interop/test.rb +12 -0
- data/lib/spec/matchers/be.rb +208 -0
- data/lib/spec/matchers/be_close.rb +21 -0
- data/lib/spec/matchers/change.rb +148 -0
- data/lib/spec/matchers/eql.rb +25 -0
- data/lib/spec/matchers/equal.rb +25 -0
- data/lib/spec/matchers/errors.rb +5 -0
- data/lib/spec/matchers/exist.rb +16 -0
- data/lib/spec/matchers/generated_descriptions.rb +48 -0
- data/lib/spec/matchers/has.rb +15 -0
- data/lib/spec/matchers/have.rb +150 -0
- data/lib/spec/matchers/include.rb +80 -0
- data/lib/spec/matchers/match.rb +22 -0
- data/lib/spec/matchers/match_array.rb +79 -0
- data/lib/spec/matchers/method_missing.rb +9 -0
- data/lib/spec/matchers/operator_matcher.rb +70 -0
- data/lib/spec/matchers/raise_error.rb +128 -0
- data/lib/spec/matchers/respond_to.rb +71 -0
- data/lib/spec/matchers/satisfy.rb +47 -0
- data/lib/spec/matchers/simple_matcher.rb +132 -0
- data/lib/spec/matchers/throw_symbol.rb +106 -0
- data/lib/spec/matchers/wrap_expectation.rb +55 -0
- data/lib/spec/matchers.rb +141 -0
- data/lib/spec/mocks/argument_expectation.rb +49 -0
- data/lib/spec/mocks/argument_matchers.rb +237 -0
- data/lib/spec/mocks/error_generator.rb +82 -0
- data/lib/spec/mocks/errors.rb +10 -0
- data/lib/spec/mocks/extensions/object.rb +3 -0
- data/lib/spec/mocks/extensions.rb +1 -0
- data/lib/spec/mocks/framework.rb +15 -0
- data/lib/spec/mocks/message_expectation.rb +331 -0
- data/lib/spec/mocks/methods.rb +51 -0
- data/lib/spec/mocks/mock.rb +55 -0
- data/lib/spec/mocks/order_group.rb +29 -0
- data/lib/spec/mocks/proxy.rb +230 -0
- data/lib/spec/mocks/space.rb +28 -0
- data/lib/spec/mocks/spec_methods.rb +55 -0
- data/lib/spec/mocks.rb +200 -0
- data/lib/spec/rake/spectask.rb +225 -0
- data/lib/spec/rake/verify_rcov.rb +52 -0
- data/lib/spec/ruby.rb +9 -0
- data/lib/spec/runner/backtrace_tweaker.rb +58 -0
- data/lib/spec/runner/class_and_arguments_parser.rb +14 -0
- data/lib/spec/runner/command_line.rb +35 -0
- data/lib/spec/runner/configuration.rb +166 -0
- data/lib/spec/runner/drb_command_line.rb +20 -0
- data/lib/spec/runner/example_group_runner.rb +70 -0
- data/lib/spec/runner/formatter/base_formatter.rb +79 -0
- data/lib/spec/runner/formatter/base_text_formatter.rb +127 -0
- data/lib/spec/runner/formatter/failing_example_groups_formatter.rb +27 -0
- data/lib/spec/runner/formatter/failing_examples_formatter.rb +20 -0
- data/lib/spec/runner/formatter/html_formatter.rb +340 -0
- data/lib/spec/runner/formatter/nested_text_formatter.rb +65 -0
- data/lib/spec/runner/formatter/profile_formatter.rb +51 -0
- data/lib/spec/runner/formatter/progress_bar_formatter.rb +34 -0
- data/lib/spec/runner/formatter/snippet_extractor.rb +52 -0
- data/lib/spec/runner/formatter/specdoc_formatter.rb +39 -0
- data/lib/spec/runner/formatter/text_mate_formatter.rb +16 -0
- data/lib/spec/runner/heckle_runner.rb +74 -0
- data/lib/spec/runner/heckle_runner_unsupported.rb +10 -0
- data/lib/spec/runner/option_parser.rb +204 -0
- data/lib/spec/runner/options.rb +320 -0
- data/lib/spec/runner/reporter.rb +167 -0
- data/lib/spec/runner/spec_parser.rb +73 -0
- data/lib/spec/runner.rb +88 -0
- data/lib/spec/version.rb +15 -0
- data/lib/spec.rb +7 -0
- data/resources/rake/examples.rake +7 -0
- data/resources/rake/examples_with_rcov.rake +9 -0
- data/resources/rake/failing_examples_with_html.rake +9 -0
- data/resources/rake/verify_rcov.rake +7 -0
- data/resources/spec/example_group_with_should_methods.rb +12 -0
- data/resources/spec/simple_spec.rb +8 -0
- data/resources/test/spec_and_test_together.rb +57 -0
- data/resources/test/spec_including_test_but_not_unit.rb +11 -0
- data/resources/test/test_case_with_should_methods.rb +30 -0
- data/rspec.gemspec +32 -0
- data/spec/README.jruby +15 -0
- data/spec/autotest/autotest_helper.rb +6 -0
- data/spec/autotest/autotest_matchers.rb +47 -0
- data/spec/autotest/discover_spec.rb +8 -0
- data/spec/autotest/failed_results_re_spec.rb +24 -0
- data/spec/autotest/rspec_spec.rb +114 -0
- data/spec/rspec_suite.rb +6 -0
- data/spec/ruby_forker.rb +13 -0
- data/spec/spec/dsl/main_spec.rb +88 -0
- data/spec/spec/example/example_group_class_definition_spec.rb +49 -0
- data/spec/spec/example/example_group_factory_spec.rb +224 -0
- data/spec/spec/example/example_group_methods_spec.rb +653 -0
- data/spec/spec/example/example_group_spec.rb +661 -0
- data/spec/spec/example/example_matcher_spec.rb +79 -0
- data/spec/spec/example/example_methods_spec.rb +204 -0
- data/spec/spec/example/helper_method_spec.rb +24 -0
- data/spec/spec/example/nested_example_group_spec.rb +71 -0
- data/spec/spec/example/pending_module_spec.rb +139 -0
- data/spec/spec/example/predicate_matcher_spec.rb +21 -0
- data/spec/spec/example/shared_example_group_spec.rb +257 -0
- data/spec/spec/example/subclassing_example_group_spec.rb +25 -0
- data/spec/spec/expectations/differs/default_spec.rb +127 -0
- data/spec/spec/expectations/extensions/object_spec.rb +45 -0
- data/spec/spec/expectations/fail_with_spec.rb +71 -0
- data/spec/spec/expectations/wrap_expectation_spec.rb +30 -0
- data/spec/spec/interop/test/unit/resources/spec_that_fails.rb +10 -0
- data/spec/spec/interop/test/unit/resources/spec_that_passes.rb +10 -0
- data/spec/spec/interop/test/unit/resources/spec_with_errors.rb +10 -0
- data/spec/spec/interop/test/unit/resources/spec_with_options_hash.rb +13 -0
- data/spec/spec/interop/test/unit/resources/test_case_that_fails.rb +10 -0
- data/spec/spec/interop/test/unit/resources/test_case_that_passes.rb +10 -0
- data/spec/spec/interop/test/unit/resources/test_case_with_errors.rb +10 -0
- data/spec/spec/interop/test/unit/resources/testsuite_adapter_spec_with_test_unit.rb +38 -0
- data/spec/spec/interop/test/unit/spec_spec.rb +48 -0
- data/spec/spec/interop/test/unit/test_unit_spec_helper.rb +18 -0
- data/spec/spec/interop/test/unit/testcase_spec.rb +49 -0
- data/spec/spec/interop/test/unit/testsuite_adapter_spec.rb +9 -0
- data/spec/spec/matchers/be_close_spec.rb +41 -0
- data/spec/spec/matchers/be_spec.rb +303 -0
- data/spec/spec/matchers/change_spec.rb +329 -0
- data/spec/spec/matchers/description_generation_spec.rb +172 -0
- data/spec/spec/matchers/eql_spec.rb +29 -0
- data/spec/spec/matchers/equal_spec.rb +29 -0
- data/spec/spec/matchers/exist_spec.rb +57 -0
- data/spec/spec/matchers/handler_spec.rb +111 -0
- data/spec/spec/matchers/has_spec.rb +63 -0
- data/spec/spec/matchers/have_spec.rb +399 -0
- data/spec/spec/matchers/include_spec.rb +88 -0
- data/spec/spec/matchers/match_array_spec.rb +83 -0
- data/spec/spec/matchers/match_spec.rb +37 -0
- data/spec/spec/matchers/matcher_methods_spec.rb +66 -0
- data/spec/spec/matchers/operator_matcher_spec.rb +191 -0
- data/spec/spec/matchers/raise_error_spec.rb +333 -0
- data/spec/spec/matchers/respond_to_spec.rb +116 -0
- data/spec/spec/matchers/satisfy_spec.rb +36 -0
- data/spec/spec/matchers/simple_matcher_spec.rb +93 -0
- data/spec/spec/matchers/throw_symbol_spec.rb +96 -0
- data/spec/spec/mocks/any_number_of_times_spec.rb +36 -0
- data/spec/spec/mocks/argument_expectation_spec.rb +23 -0
- data/spec/spec/mocks/at_least_spec.rb +97 -0
- data/spec/spec/mocks/at_most_spec.rb +93 -0
- data/spec/spec/mocks/bug_report_10260_spec.rb +8 -0
- data/spec/spec/mocks/bug_report_10263_spec.rb +24 -0
- data/spec/spec/mocks/bug_report_11545_spec.rb +32 -0
- data/spec/spec/mocks/bug_report_15719_spec.rb +30 -0
- data/spec/spec/mocks/bug_report_496.rb +19 -0
- data/spec/spec/mocks/bug_report_600_spec.rb +22 -0
- data/spec/spec/mocks/bug_report_7611_spec.rb +19 -0
- data/spec/spec/mocks/bug_report_7805_spec.rb +22 -0
- data/spec/spec/mocks/bug_report_8165_spec.rb +31 -0
- data/spec/spec/mocks/bug_report_8302_spec.rb +26 -0
- data/spec/spec/mocks/failing_argument_matchers_spec.rb +95 -0
- data/spec/spec/mocks/hash_including_matcher_spec.rb +90 -0
- data/spec/spec/mocks/hash_not_including_matcher_spec.rb +67 -0
- data/spec/spec/mocks/mock_ordering_spec.rb +84 -0
- data/spec/spec/mocks/mock_space_spec.rb +54 -0
- data/spec/spec/mocks/mock_spec.rb +579 -0
- data/spec/spec/mocks/multiple_return_value_spec.rb +113 -0
- data/spec/spec/mocks/nil_expectation_warning_spec.rb +53 -0
- data/spec/spec/mocks/null_object_mock_spec.rb +54 -0
- data/spec/spec/mocks/once_counts_spec.rb +53 -0
- data/spec/spec/mocks/options_hash_spec.rb +35 -0
- data/spec/spec/mocks/partial_mock_spec.rb +149 -0
- data/spec/spec/mocks/partial_mock_using_mocks_directly_spec.rb +66 -0
- data/spec/spec/mocks/passing_argument_matchers_spec.rb +145 -0
- data/spec/spec/mocks/precise_counts_spec.rb +52 -0
- data/spec/spec/mocks/record_messages_spec.rb +26 -0
- data/spec/spec/mocks/stub_spec.rb +194 -0
- data/spec/spec/mocks/stubbed_message_expectations_spec.rb +14 -0
- data/spec/spec/mocks/twice_counts_spec.rb +67 -0
- data/spec/spec/package/bin_spec_spec.rb +22 -0
- data/spec/spec/runner/class_and_argument_parser_spec.rb +23 -0
- data/spec/spec/runner/command_line_spec.rb +141 -0
- data/spec/spec/runner/configuration_spec.rb +301 -0
- data/spec/spec/runner/drb_command_line_spec.rb +97 -0
- data/spec/spec/runner/empty_file.txt +0 -0
- data/spec/spec/runner/example_group_runner_spec.rb +33 -0
- data/spec/spec/runner/examples.txt +2 -0
- data/spec/spec/runner/failed.txt +3 -0
- data/spec/spec/runner/formatter/base_formatter_spec.rb +23 -0
- data/spec/spec/runner/formatter/base_text_formatter_spec.rb +23 -0
- data/spec/spec/runner/formatter/failing_example_groups_formatter_spec.rb +45 -0
- data/spec/spec/runner/formatter/failing_examples_formatter_spec.rb +33 -0
- data/spec/spec/runner/formatter/html_formatted-1.8.4.html +365 -0
- data/spec/spec/runner/formatter/html_formatted-1.8.5-jruby.html +387 -0
- data/spec/spec/runner/formatter/html_formatted-1.8.5.html +371 -0
- data/spec/spec/runner/formatter/html_formatted-1.8.6-jruby.html +381 -0
- data/spec/spec/runner/formatter/html_formatted-1.8.6.html +379 -0
- data/spec/spec/runner/formatter/html_formatted-1.8.7.html +379 -0
- data/spec/spec/runner/formatter/html_formatted-1.9.1.html +379 -0
- data/spec/spec/runner/formatter/html_formatter_spec.rb +62 -0
- data/spec/spec/runner/formatter/nested_text_formatter_spec.rb +318 -0
- data/spec/spec/runner/formatter/profile_formatter_spec.rb +65 -0
- data/spec/spec/runner/formatter/progress_bar_formatter_spec.rb +145 -0
- data/spec/spec/runner/formatter/snippet_extractor_spec.rb +18 -0
- data/spec/spec/runner/formatter/spec_mate_formatter_spec.rb +104 -0
- data/spec/spec/runner/formatter/specdoc_formatter_spec.rb +159 -0
- data/spec/spec/runner/formatter/text_mate_formatted-1.8.4.html +365 -0
- data/spec/spec/runner/formatter/text_mate_formatted-1.8.6.html +373 -0
- data/spec/spec/runner/formatter/text_mate_formatted-1.8.7.html +373 -0
- data/spec/spec/runner/formatter/text_mate_formatted-1.9.1.html +373 -0
- data/spec/spec/runner/heckle_runner_spec.rb +78 -0
- data/spec/spec/runner/heckler_spec.rb +20 -0
- data/spec/spec/runner/noisy_backtrace_tweaker_spec.rb +45 -0
- data/spec/spec/runner/option_parser_spec.rb +396 -0
- data/spec/spec/runner/options_spec.rb +469 -0
- data/spec/spec/runner/output_one_time_fixture.rb +7 -0
- data/spec/spec/runner/output_one_time_fixture_runner.rb +8 -0
- data/spec/spec/runner/output_one_time_spec.rb +16 -0
- data/spec/spec/runner/quiet_backtrace_tweaker_spec.rb +62 -0
- data/spec/spec/runner/reporter_spec.rb +238 -0
- data/spec/spec/runner/resources/a_bar.rb +0 -0
- data/spec/spec/runner/resources/a_foo.rb +0 -0
- data/spec/spec/runner/resources/a_spec.rb +1 -0
- data/spec/spec/runner/resources/custom_example_group_runner.rb +14 -0
- data/spec/spec/runner/resources/utf8_encoded.rb +7 -0
- data/spec/spec/runner/spec.opts +2 -0
- data/spec/spec/runner/spec_drb.opts +1 -0
- data/spec/spec/runner/spec_parser/spec_parser_fixture.rb +70 -0
- data/spec/spec/runner/spec_parser_spec.rb +91 -0
- data/spec/spec/runner/spec_spaced.opts +2 -0
- data/spec/spec/runner_spec.rb +11 -0
- data/spec/spec/spec_classes.rb +133 -0
- data/spec/spec/spec_spec.rb +21 -0
- data/spec/spec.opts +6 -0
- data/spec/spec_helper.rb +107 -0
- metadata +388 -0
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
module Spec
|
|
2
|
+
module Matchers
|
|
3
|
+
|
|
4
|
+
class ThrowSymbol #:nodoc:
|
|
5
|
+
def initialize(expected_symbol = nil, expected_arg=nil)
|
|
6
|
+
@expected_symbol = expected_symbol
|
|
7
|
+
@expected_arg = expected_arg
|
|
8
|
+
@caught_symbol = nil
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
def matches?(given_proc)
|
|
12
|
+
begin
|
|
13
|
+
if @expected_symbol.nil?
|
|
14
|
+
given_proc.call
|
|
15
|
+
else
|
|
16
|
+
@caught_arg = catch :proc_did_not_throw_anything do
|
|
17
|
+
catch @expected_symbol do
|
|
18
|
+
given_proc.call
|
|
19
|
+
throw :proc_did_not_throw_anything, :nothing_thrown
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
@caught_symbol = @expected_symbol unless @caught_arg == :nothing_thrown
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
# Ruby 1.8 uses NameError with `symbol'
|
|
26
|
+
# Ruby 1.9 uses ArgumentError with :symbol
|
|
27
|
+
rescue NameError, ArgumentError => e
|
|
28
|
+
raise e unless e.message =~ /uncaught throw (`|\:)([a-zA-Z0-9_]*)(')?/
|
|
29
|
+
@caught_symbol = $2.to_sym
|
|
30
|
+
|
|
31
|
+
ensure
|
|
32
|
+
if @expected_symbol.nil?
|
|
33
|
+
return !@caught_symbol.nil?
|
|
34
|
+
else
|
|
35
|
+
if @expected_arg.nil?
|
|
36
|
+
return @caught_symbol == @expected_symbol
|
|
37
|
+
else
|
|
38
|
+
# puts [@caught_symbol, @expected_symbol].inspect
|
|
39
|
+
# puts [@caught_arg, @expected_arg].inspect
|
|
40
|
+
return @caught_symbol == @expected_symbol && @caught_arg == @expected_arg
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
def failure_message
|
|
47
|
+
if @caught_symbol
|
|
48
|
+
"expected #{expected}, got #{@caught_symbol.inspect}"
|
|
49
|
+
else
|
|
50
|
+
"expected #{expected} but nothing was thrown"
|
|
51
|
+
end
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
def negative_failure_message
|
|
55
|
+
if @expected_symbol
|
|
56
|
+
"expected #{expected} not to be thrown"
|
|
57
|
+
else
|
|
58
|
+
"expected no Symbol, got :#{@caught_symbol}"
|
|
59
|
+
end
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
def description
|
|
63
|
+
"throw #{expected}"
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
private
|
|
67
|
+
|
|
68
|
+
def expected
|
|
69
|
+
@expected_symbol.nil? ? "a Symbol" : "#{@expected_symbol.inspect}#{args}"
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
def args
|
|
73
|
+
@expected_arg.nil? ? "" : " with #{@expected_arg.inspect}"
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
# :call-seq:
|
|
79
|
+
# should throw_symbol()
|
|
80
|
+
# should throw_symbol(:sym)
|
|
81
|
+
# should throw_symbol(:sym, arg)
|
|
82
|
+
# should_not throw_symbol()
|
|
83
|
+
# should_not throw_symbol(:sym)
|
|
84
|
+
# should_not throw_symbol(:sym, arg)
|
|
85
|
+
#
|
|
86
|
+
# Given no argument, matches if a proc throws any Symbol.
|
|
87
|
+
#
|
|
88
|
+
# Given a Symbol, matches if the given proc throws the specified Symbol.
|
|
89
|
+
#
|
|
90
|
+
# Given a Symbol and an arg, matches if the given proc throws the
|
|
91
|
+
# specified Symbol with the specified arg.
|
|
92
|
+
#
|
|
93
|
+
# == Examples
|
|
94
|
+
#
|
|
95
|
+
# lambda { do_something_risky }.should throw_symbol
|
|
96
|
+
# lambda { do_something_risky }.should throw_symbol(:that_was_risky)
|
|
97
|
+
# lambda { do_something_risky }.should throw_symbol(:that_was_risky, culprit)
|
|
98
|
+
#
|
|
99
|
+
# lambda { do_something_risky }.should_not throw_symbol
|
|
100
|
+
# lambda { do_something_risky }.should_not throw_symbol(:that_was_risky)
|
|
101
|
+
# lambda { do_something_risky }.should_not throw_symbol(:that_was_risky, culprit)
|
|
102
|
+
def throw_symbol(sym=nil)
|
|
103
|
+
Matchers::ThrowSymbol.new(sym)
|
|
104
|
+
end
|
|
105
|
+
end
|
|
106
|
+
end
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
module Spec
|
|
2
|
+
module Matchers
|
|
3
|
+
# wraps an expectation in a block that will return true if the
|
|
4
|
+
# expectation passes and false if it fails (without bubbling up
|
|
5
|
+
# the failure).
|
|
6
|
+
#
|
|
7
|
+
# This is intended to be used in the context of a simple matcher,
|
|
8
|
+
# and is especially useful for wrapping multiple expectations or
|
|
9
|
+
# one or more assertions from test/unit extensions when running
|
|
10
|
+
# with test/unit.
|
|
11
|
+
#
|
|
12
|
+
# == Examples
|
|
13
|
+
#
|
|
14
|
+
# def eat_cheese(cheese)
|
|
15
|
+
# simple_matcher do |mouse, matcher|
|
|
16
|
+
# matcher.failure_message = "expected #{mouse} to eat cheese"
|
|
17
|
+
# wrap_expectation do |matcher|
|
|
18
|
+
# assert_eats_cheese(mouse)
|
|
19
|
+
# end
|
|
20
|
+
# end
|
|
21
|
+
# end
|
|
22
|
+
#
|
|
23
|
+
# describe Mouse do
|
|
24
|
+
# it "eats cheese" do
|
|
25
|
+
# Mouse.new.should eat_cheese
|
|
26
|
+
# end
|
|
27
|
+
# end
|
|
28
|
+
#
|
|
29
|
+
# You might be wondering "why would I do this if I could just say"
|
|
30
|
+
# assert_eats_cheese?", a fair question, indeed. You might prefer
|
|
31
|
+
# to replace the word assert with something more aligned with the
|
|
32
|
+
# rest of your code examples. You are using rspec, after all.
|
|
33
|
+
#
|
|
34
|
+
# The other benefit you get is that you can use the negative version
|
|
35
|
+
# of the matcher:
|
|
36
|
+
#
|
|
37
|
+
# describe Cat do
|
|
38
|
+
# it "does not eat cheese" do
|
|
39
|
+
# Cat.new.should_not eat_cheese
|
|
40
|
+
# end
|
|
41
|
+
# end
|
|
42
|
+
#
|
|
43
|
+
# So in the event there is no assert_does_not_eat_cheese available,
|
|
44
|
+
# you're all set!
|
|
45
|
+
def wrap_expectation(matcher, &block)
|
|
46
|
+
begin
|
|
47
|
+
block.call(matcher)
|
|
48
|
+
return true
|
|
49
|
+
rescue Exception => e
|
|
50
|
+
matcher.failure_message = e.message
|
|
51
|
+
return false
|
|
52
|
+
end
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
end
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
require 'spec/matchers/operator_matcher'
|
|
2
|
+
require 'spec/matchers/generated_descriptions'
|
|
3
|
+
require 'spec/matchers/errors'
|
|
4
|
+
require 'spec/matchers/method_missing'
|
|
5
|
+
require 'spec/matchers/simple_matcher'
|
|
6
|
+
require 'spec/matchers/be'
|
|
7
|
+
require 'spec/matchers/be_close'
|
|
8
|
+
require 'spec/matchers/change'
|
|
9
|
+
require 'spec/matchers/match_array'
|
|
10
|
+
require 'spec/matchers/eql'
|
|
11
|
+
require 'spec/matchers/equal'
|
|
12
|
+
require 'spec/matchers/exist'
|
|
13
|
+
require 'spec/matchers/has'
|
|
14
|
+
require 'spec/matchers/have'
|
|
15
|
+
require 'spec/matchers/include'
|
|
16
|
+
require 'spec/matchers/match'
|
|
17
|
+
require 'spec/matchers/raise_error'
|
|
18
|
+
require 'spec/matchers/respond_to'
|
|
19
|
+
require 'spec/matchers/satisfy'
|
|
20
|
+
require 'spec/matchers/throw_symbol'
|
|
21
|
+
require 'spec/matchers/wrap_expectation'
|
|
22
|
+
|
|
23
|
+
module Spec
|
|
24
|
+
|
|
25
|
+
# RSpec ships with a number of useful Expression Matchers. An Expression Matcher
|
|
26
|
+
# is any object that responds to the following methods:
|
|
27
|
+
#
|
|
28
|
+
# matches?(actual)
|
|
29
|
+
# failure_message
|
|
30
|
+
# negative_failure_message #optional
|
|
31
|
+
# description #optional
|
|
32
|
+
#
|
|
33
|
+
# See Spec::Expectations to learn how to use these as Expectation Matchers.
|
|
34
|
+
# See Spec::Mocks to learn how to use them as Mock Argument Matchers.
|
|
35
|
+
#
|
|
36
|
+
# == Predicates
|
|
37
|
+
#
|
|
38
|
+
# In addition to those Expression Matchers that are defined explicitly, RSpec will
|
|
39
|
+
# create custom Matchers on the fly for any arbitrary predicate, giving your specs
|
|
40
|
+
# a much more natural language feel.
|
|
41
|
+
#
|
|
42
|
+
# A Ruby predicate is a method that ends with a "?" and returns true or false.
|
|
43
|
+
# Common examples are +empty?+, +nil?+, and +instance_of?+.
|
|
44
|
+
#
|
|
45
|
+
# All you need to do is write +should be_+ followed by the predicate without
|
|
46
|
+
# the question mark, and RSpec will figure it out from there. For example:
|
|
47
|
+
#
|
|
48
|
+
# [].should be_empty => [].empty? #passes
|
|
49
|
+
# [].should_not be_empty => [].empty? #fails
|
|
50
|
+
#
|
|
51
|
+
# In addtion to prefixing the predicate matchers with "be_", you can also use "be_a_"
|
|
52
|
+
# and "be_an_", making your specs read much more naturally:
|
|
53
|
+
#
|
|
54
|
+
# "a string".should be_an_instance_of(String) =>"a string".instance_of?(String) #passes
|
|
55
|
+
#
|
|
56
|
+
# 3.should be_a_kind_of(Fixnum) => 3.kind_of?(Numeric) #passes
|
|
57
|
+
# 3.should be_a_kind_of(Numeric) => 3.kind_of?(Numeric) #passes
|
|
58
|
+
# 3.should be_an_instance_of(Fixnum) => 3.instance_of?(Fixnum) #passes
|
|
59
|
+
# 3.should_not be_instance_of(Numeric) => 3.instance_of?(Numeric) #fails
|
|
60
|
+
#
|
|
61
|
+
# RSpec will also create custom matchers for predicates like +has_key?+. To
|
|
62
|
+
# use this feature, just state that the object should have_key(:key) and RSpec will
|
|
63
|
+
# call has_key?(:key) on the target. For example:
|
|
64
|
+
#
|
|
65
|
+
# {:a => "A"}.should have_key(:a) => {:a => "A"}.has_key?(:a) #passes
|
|
66
|
+
# {:a => "A"}.should have_key(:b) => {:a => "A"}.has_key?(:b) #fails
|
|
67
|
+
#
|
|
68
|
+
# You can use this feature to invoke any predicate that begins with "has_", whether it is
|
|
69
|
+
# part of the Ruby libraries (like +Hash#has_key?+) or a method you wrote on your own class.
|
|
70
|
+
#
|
|
71
|
+
# == Custom Expectation Matchers
|
|
72
|
+
#
|
|
73
|
+
# When you find that none of the stock Expectation Matchers provide a natural
|
|
74
|
+
# feeling expectation, you can very easily write your own.
|
|
75
|
+
#
|
|
76
|
+
# For example, imagine that you are writing a game in which players can
|
|
77
|
+
# be in various zones on a virtual board. To specify that bob should
|
|
78
|
+
# be in zone 4, you could say:
|
|
79
|
+
#
|
|
80
|
+
# bob.current_zone.should eql(Zone.new("4"))
|
|
81
|
+
#
|
|
82
|
+
# But you might find it more expressive to say:
|
|
83
|
+
#
|
|
84
|
+
# bob.should be_in_zone("4")
|
|
85
|
+
#
|
|
86
|
+
# and/or
|
|
87
|
+
#
|
|
88
|
+
# bob.should_not be_in_zone("3")
|
|
89
|
+
#
|
|
90
|
+
# To do this, you would need to write a class like this:
|
|
91
|
+
#
|
|
92
|
+
# class BeInZone
|
|
93
|
+
# def initialize(expected)
|
|
94
|
+
# @expected = expected
|
|
95
|
+
# end
|
|
96
|
+
# def matches?(target)
|
|
97
|
+
# @target = target
|
|
98
|
+
# @target.current_zone.eql?(Zone.new(@expected))
|
|
99
|
+
# end
|
|
100
|
+
# def failure_message
|
|
101
|
+
# "expected #{@target.inspect} to be in Zone #{@expected}"
|
|
102
|
+
# end
|
|
103
|
+
# def negative_failure_message
|
|
104
|
+
# "expected #{@target.inspect} not to be in Zone #{@expected}"
|
|
105
|
+
# end
|
|
106
|
+
# end
|
|
107
|
+
#
|
|
108
|
+
# ... and a method like this:
|
|
109
|
+
#
|
|
110
|
+
# def be_in_zone(expected)
|
|
111
|
+
# BeInZone.new(expected)
|
|
112
|
+
# end
|
|
113
|
+
#
|
|
114
|
+
# And then expose the method to your specs. This is normally done
|
|
115
|
+
# by including the method and the class in a module, which is then
|
|
116
|
+
# included in your spec:
|
|
117
|
+
#
|
|
118
|
+
# module CustomGameMatchers
|
|
119
|
+
# class BeInZone
|
|
120
|
+
# ...
|
|
121
|
+
# end
|
|
122
|
+
#
|
|
123
|
+
# def be_in_zone(expected)
|
|
124
|
+
# ...
|
|
125
|
+
# end
|
|
126
|
+
# end
|
|
127
|
+
#
|
|
128
|
+
# describe "Player behaviour" do
|
|
129
|
+
# include CustomGameMatchers
|
|
130
|
+
# ...
|
|
131
|
+
# end
|
|
132
|
+
#
|
|
133
|
+
# or you can include in globally in a spec_helper.rb file <tt>require</tt>d
|
|
134
|
+
# from your spec file(s):
|
|
135
|
+
#
|
|
136
|
+
# Spec::Runner.configure do |config|
|
|
137
|
+
# config.include(CustomGameMatchers)
|
|
138
|
+
# end
|
|
139
|
+
#
|
|
140
|
+
module Matchers; end
|
|
141
|
+
end
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
module Spec
|
|
2
|
+
module Mocks
|
|
3
|
+
|
|
4
|
+
class ArgumentExpectation
|
|
5
|
+
attr_reader :args
|
|
6
|
+
|
|
7
|
+
def initialize(args, &block)
|
|
8
|
+
@args = args
|
|
9
|
+
@matchers_block = block
|
|
10
|
+
|
|
11
|
+
if ArgumentMatchers::AnyArgsMatcher === args.first
|
|
12
|
+
@match_any_args = true
|
|
13
|
+
elsif ArgumentMatchers::NoArgsMatcher === args.first
|
|
14
|
+
@matchers = []
|
|
15
|
+
else
|
|
16
|
+
@matchers = args.collect {|arg| matcher_for(arg)}
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def matcher_for(arg)
|
|
21
|
+
return ArgumentMatchers::MatcherMatcher.new(arg) if is_matcher?(arg)
|
|
22
|
+
return ArgumentMatchers::RegexpMatcher.new(arg) if arg.is_a?(Regexp)
|
|
23
|
+
return ArgumentMatchers::EqualityProxy.new(arg)
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def is_matcher?(obj)
|
|
27
|
+
return obj.respond_to?(:matches?) && obj.respond_to?(:description)
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def args_match?(given_args)
|
|
31
|
+
match_any_args? || matchers_block_matches?(given_args) || matchers_match?(given_args)
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
def matchers_block_matches?(given_args)
|
|
35
|
+
@matchers_block ? @matchers_block.call(*given_args) : nil
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
def matchers_match?(given_args)
|
|
39
|
+
@matchers == given_args
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
def match_any_args?
|
|
43
|
+
@match_any_args
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
end
|
|
49
|
+
end
|
|
@@ -0,0 +1,237 @@
|
|
|
1
|
+
module Spec
|
|
2
|
+
module Mocks
|
|
3
|
+
|
|
4
|
+
# ArgumentMatchers are messages that you can include in message
|
|
5
|
+
# expectations to match arguments against a broader check than simple
|
|
6
|
+
# equality.
|
|
7
|
+
#
|
|
8
|
+
# With the exception of any_args() and no_args(), the matchers
|
|
9
|
+
# are all positional - they match against the arg in the given position.
|
|
10
|
+
module ArgumentMatchers
|
|
11
|
+
|
|
12
|
+
class AnyArgsMatcher
|
|
13
|
+
def description
|
|
14
|
+
"any args"
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
class AnyArgMatcher
|
|
19
|
+
def initialize(ignore)
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def ==(other)
|
|
23
|
+
true
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
class NoArgsMatcher
|
|
28
|
+
def description
|
|
29
|
+
"no args"
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
def ==(args)
|
|
33
|
+
args == []
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
class RegexpMatcher
|
|
38
|
+
def initialize(regexp)
|
|
39
|
+
@regexp = regexp
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
def ==(value)
|
|
43
|
+
return value =~ @regexp unless value.is_a?(Regexp)
|
|
44
|
+
value == @regexp
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
class BooleanMatcher
|
|
49
|
+
def initialize(ignore)
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
def ==(value)
|
|
53
|
+
TrueClass === value || FalseClass === value
|
|
54
|
+
end
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
class HashIncludingMatcher
|
|
58
|
+
def initialize(expected)
|
|
59
|
+
@expected = expected
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
def ==(actual)
|
|
63
|
+
@expected.each do | key, value |
|
|
64
|
+
return false unless actual.has_key?(key) && value == actual[key]
|
|
65
|
+
end
|
|
66
|
+
true
|
|
67
|
+
rescue NoMethodError => ex
|
|
68
|
+
return false
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
def description
|
|
72
|
+
"hash_including(#{@expected.inspect.sub(/^\{/,"").sub(/\}$/,"")})"
|
|
73
|
+
end
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
class HashNotIncludingMatcher
|
|
77
|
+
def initialize(expected)
|
|
78
|
+
@expected = expected
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
def ==(actual)
|
|
82
|
+
@expected.each do | key, value |
|
|
83
|
+
return false if actual.has_key?(key) && value == actual[key]
|
|
84
|
+
end
|
|
85
|
+
true
|
|
86
|
+
rescue NoMethodError => ex
|
|
87
|
+
return false
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
def description
|
|
91
|
+
"hash_not_including(#{@expected.inspect.sub(/^\{/,"").sub(/\}$/,"")})"
|
|
92
|
+
end
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
class DuckTypeMatcher
|
|
96
|
+
def initialize(*methods_to_respond_to)
|
|
97
|
+
@methods_to_respond_to = methods_to_respond_to
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
def ==(value)
|
|
101
|
+
@methods_to_respond_to.all? { |sym| value.respond_to?(sym) }
|
|
102
|
+
end
|
|
103
|
+
end
|
|
104
|
+
|
|
105
|
+
class MatcherMatcher
|
|
106
|
+
def initialize(matcher)
|
|
107
|
+
@matcher = matcher
|
|
108
|
+
end
|
|
109
|
+
|
|
110
|
+
def ==(value)
|
|
111
|
+
@matcher.matches?(value)
|
|
112
|
+
end
|
|
113
|
+
end
|
|
114
|
+
|
|
115
|
+
class EqualityProxy
|
|
116
|
+
def initialize(given)
|
|
117
|
+
@given = given
|
|
118
|
+
end
|
|
119
|
+
|
|
120
|
+
def ==(expected)
|
|
121
|
+
@given == expected
|
|
122
|
+
end
|
|
123
|
+
end
|
|
124
|
+
|
|
125
|
+
class InstanceOf
|
|
126
|
+
def initialize(klass)
|
|
127
|
+
@klass = klass
|
|
128
|
+
end
|
|
129
|
+
|
|
130
|
+
def ==(actual)
|
|
131
|
+
actual.instance_of?(@klass)
|
|
132
|
+
end
|
|
133
|
+
end
|
|
134
|
+
|
|
135
|
+
class KindOf
|
|
136
|
+
def initialize(klass)
|
|
137
|
+
@klass = klass
|
|
138
|
+
end
|
|
139
|
+
|
|
140
|
+
def ==(actual)
|
|
141
|
+
actual.kind_of?(@klass)
|
|
142
|
+
end
|
|
143
|
+
end
|
|
144
|
+
|
|
145
|
+
# :call-seq:
|
|
146
|
+
# object.should_receive(:message).with(any_args())
|
|
147
|
+
#
|
|
148
|
+
# Passes if object receives :message with any args at all. This is
|
|
149
|
+
# really a more explicit variation of object.should_receive(:message)
|
|
150
|
+
def any_args
|
|
151
|
+
AnyArgsMatcher.new
|
|
152
|
+
end
|
|
153
|
+
|
|
154
|
+
# :call-seq:
|
|
155
|
+
# object.should_receive(:message).with(anything())
|
|
156
|
+
#
|
|
157
|
+
# Passes as long as there is an argument.
|
|
158
|
+
def anything
|
|
159
|
+
AnyArgMatcher.new(nil)
|
|
160
|
+
end
|
|
161
|
+
|
|
162
|
+
# :call-seq:
|
|
163
|
+
# object.should_receive(:message).with(no_args)
|
|
164
|
+
#
|
|
165
|
+
# Passes if no arguments are passed along with the message
|
|
166
|
+
def no_args
|
|
167
|
+
NoArgsMatcher.new
|
|
168
|
+
end
|
|
169
|
+
|
|
170
|
+
# :call-seq:
|
|
171
|
+
# object.should_receive(:message).with(duck_type(:hello))
|
|
172
|
+
# object.should_receive(:message).with(duck_type(:hello, :goodbye))
|
|
173
|
+
#
|
|
174
|
+
# Passes if the argument responds to the specified messages.
|
|
175
|
+
#
|
|
176
|
+
# == Examples
|
|
177
|
+
#
|
|
178
|
+
# array = []
|
|
179
|
+
# display = mock('display')
|
|
180
|
+
# display.should_receive(:present_names).with(duck_type(:length, :each))
|
|
181
|
+
# => passes
|
|
182
|
+
def duck_type(*args)
|
|
183
|
+
DuckTypeMatcher.new(*args)
|
|
184
|
+
end
|
|
185
|
+
|
|
186
|
+
# :call-seq:
|
|
187
|
+
# object.should_receive(:message).with(boolean())
|
|
188
|
+
#
|
|
189
|
+
# Passes if the argument is boolean.
|
|
190
|
+
def boolean
|
|
191
|
+
BooleanMatcher.new(nil)
|
|
192
|
+
end
|
|
193
|
+
|
|
194
|
+
# :call-seq:
|
|
195
|
+
# object.should_receive(:message).with(hash_including(:key => val))
|
|
196
|
+
# object.should_receive(:message).with(hash_including(:key))
|
|
197
|
+
# object.should_receive(:message).with(hash_including(:key, :key2 => val2))
|
|
198
|
+
# Passes if the argument is a hash that includes the specified key(s) or key/value
|
|
199
|
+
# pairs. If the hash includes other keys, it will still pass.
|
|
200
|
+
def hash_including(*args)
|
|
201
|
+
HashIncludingMatcher.new(anythingize_lonely_keys(*args))
|
|
202
|
+
end
|
|
203
|
+
|
|
204
|
+
# :call-seq:
|
|
205
|
+
# object.should_receive(:message).with(hash_not_including(:key => val))
|
|
206
|
+
# object.should_receive(:message).with(hash_not_including(:key))
|
|
207
|
+
# object.should_receive(:message).with(hash_not_including(:key, :key2 => :val2))
|
|
208
|
+
#
|
|
209
|
+
# Passes if the argument is a hash that doesn't include the specified key(s) or key/value
|
|
210
|
+
def hash_not_including(*args)
|
|
211
|
+
HashNotIncludingMatcher.new(anythingize_lonely_keys(*args))
|
|
212
|
+
end
|
|
213
|
+
|
|
214
|
+
# Passes if arg.instance_of?(klass)
|
|
215
|
+
def instance_of(klass)
|
|
216
|
+
InstanceOf.new(klass)
|
|
217
|
+
end
|
|
218
|
+
|
|
219
|
+
alias_method :an_instance_of, :instance_of
|
|
220
|
+
|
|
221
|
+
# Passes if arg.kind_of?(klass)
|
|
222
|
+
def kind_of(klass)
|
|
223
|
+
KindOf.new(klass)
|
|
224
|
+
end
|
|
225
|
+
|
|
226
|
+
alias_method :a_kind_of, :kind_of
|
|
227
|
+
|
|
228
|
+
private
|
|
229
|
+
|
|
230
|
+
def anythingize_lonely_keys(*args)
|
|
231
|
+
hash = args.last.class == Hash ? args.delete_at(-1) : {}
|
|
232
|
+
args.each { | arg | hash[arg] = anything }
|
|
233
|
+
hash
|
|
234
|
+
end
|
|
235
|
+
end
|
|
236
|
+
end
|
|
237
|
+
end
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
module Spec
|
|
2
|
+
module Mocks
|
|
3
|
+
class ErrorGenerator
|
|
4
|
+
attr_writer :opts
|
|
5
|
+
|
|
6
|
+
def initialize(target, name)
|
|
7
|
+
@target = target
|
|
8
|
+
@name = name
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
def opts
|
|
12
|
+
@opts ||= {}
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def raise_unexpected_message_error(sym, *args)
|
|
16
|
+
__raise "#{intro} received unexpected message :#{sym}#{arg_message(*args)}"
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def raise_unexpected_message_args_error(expectation, *args)
|
|
20
|
+
expected_args = format_args(*expectation.expected_args)
|
|
21
|
+
actual_args = args.empty? ? "(no args)" : format_args(*args)
|
|
22
|
+
__raise "#{intro} expected #{expectation.sym.inspect} with #{expected_args} but received it with #{actual_args}"
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def raise_expectation_error(sym, expected_received_count, actual_received_count, *args)
|
|
26
|
+
__raise "#{intro} expected :#{sym}#{arg_message(*args)} #{count_message(expected_received_count)}, but received it #{count_message(actual_received_count)}"
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
def raise_out_of_order_error(sym)
|
|
30
|
+
__raise "#{intro} received :#{sym} out of order"
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
def raise_block_failed_error(sym, detail)
|
|
34
|
+
__raise "#{intro} received :#{sym} but passed block failed with: #{detail}"
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
def raise_missing_block_error(args_to_yield)
|
|
38
|
+
__raise "#{intro} asked to yield |#{arg_list(*args_to_yield)}| but no block was passed"
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
def raise_wrong_arity_error(args_to_yield, arity)
|
|
42
|
+
__raise "#{intro} yielded |#{arg_list(*args_to_yield)}| to block with arity of #{arity}"
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
private
|
|
46
|
+
def intro
|
|
47
|
+
@name ? "Mock '#{@name}'" : @target.class == Class ? "<#{@target.inspect} (class)>" : (@target.nil? ? "nil" : @target.to_s)
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
def __raise(message)
|
|
51
|
+
message = opts[:message] unless opts[:message].nil?
|
|
52
|
+
Kernel::raise(Spec::Mocks::MockExpectationError, message)
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
def arg_message(*args)
|
|
56
|
+
" with " + format_args(*args)
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
def format_args(*args)
|
|
60
|
+
args.empty? ? "(no args)" : "(" + arg_list(*args) + ")"
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
def arg_list(*args)
|
|
64
|
+
args.collect do |arg|
|
|
65
|
+
arg.respond_to?(:description) ? arg.description : arg.inspect
|
|
66
|
+
end.join(", ")
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
def count_message(count)
|
|
70
|
+
return "at least #{pretty_print(count.abs)}" if count < 0
|
|
71
|
+
return pretty_print(count)
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
def pretty_print(count)
|
|
75
|
+
return "once" if count == 1
|
|
76
|
+
return "twice" if count == 2
|
|
77
|
+
return "#{count} times"
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
end
|
|
81
|
+
end
|
|
82
|
+
end
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
require 'spec/mocks/extensions/object'
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
# Require everything except the global extensions of class and object. This
|
|
2
|
+
# supports wrapping rspec's mocking functionality without invading every
|
|
3
|
+
# object in the system.
|
|
4
|
+
|
|
5
|
+
require 'spec/mocks/methods'
|
|
6
|
+
require 'spec/mocks/argument_matchers'
|
|
7
|
+
require 'spec/mocks/spec_methods'
|
|
8
|
+
require 'spec/mocks/proxy'
|
|
9
|
+
require 'spec/mocks/mock'
|
|
10
|
+
require 'spec/mocks/argument_expectation'
|
|
11
|
+
require 'spec/mocks/message_expectation'
|
|
12
|
+
require 'spec/mocks/order_group'
|
|
13
|
+
require 'spec/mocks/errors'
|
|
14
|
+
require 'spec/mocks/error_generator'
|
|
15
|
+
require 'spec/mocks/space'
|