rspec 1.0.8 → 1.1.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.
- data/CHANGES +122 -2
- data/README +10 -9
- data/Rakefile +22 -49
- data/TODO +2 -0
- data/bin/spec +1 -1
- data/bin/spec_translator +8 -8
- data/examples/{auto_spec_description_example.rb → pure/autogenerated_docstrings_example.rb} +0 -0
- data/examples/{before_and_after_example.rb → pure/before_and_after_example.rb} +1 -0
- data/examples/{behave_as_example.rb → pure/behave_as_example.rb} +0 -0
- data/examples/{custom_expectation_matchers.rb → pure/custom_expectation_matchers.rb} +0 -0
- data/examples/{custom_formatter.rb → pure/custom_formatter.rb} +1 -0
- data/examples/{dynamic_spec.rb → pure/dynamic_spec.rb} +0 -0
- data/examples/{file_accessor.rb → pure/file_accessor.rb} +1 -0
- data/examples/{file_accessor_spec.rb → pure/file_accessor_spec.rb} +0 -0
- data/examples/{greeter_spec.rb → pure/greeter_spec.rb} +1 -0
- data/examples/{helper_method_example.rb → pure/helper_method_example.rb} +0 -0
- data/examples/{io_processor.rb → pure/io_processor.rb} +0 -0
- data/examples/{io_processor_spec.rb → pure/io_processor_spec.rb} +0 -0
- data/examples/{legacy_spec.rb → pure/legacy_spec.rb} +1 -0
- data/examples/{mocking_example.rb → pure/mocking_example.rb} +0 -0
- data/examples/pure/multi_threaded_behaviour_runner.rb +28 -0
- data/examples/pure/nested_classes_example.rb +36 -0
- data/examples/{partial_mock_example.rb → pure/partial_mock_example.rb} +0 -0
- data/examples/{pending_example.rb → pure/pending_example.rb} +0 -0
- data/examples/{predicate_example.rb → pure/predicate_example.rb} +0 -0
- data/examples/{priority.txt → pure/priority.txt} +0 -0
- data/examples/pure/shared_example_group_example.rb +66 -0
- data/examples/pure/shared_stack_examples.rb +38 -0
- data/examples/pure/spec_helper.rb +3 -0
- data/examples/{stack.rb → pure/stack.rb} +0 -0
- data/examples/{stack_spec.rb → pure/stack_spec.rb} +1 -35
- data/examples/pure/stack_spec_with_nested_example_groups.rb +67 -0
- data/examples/{stubbing_example.rb → pure/stubbing_example.rb} +0 -0
- data/examples/stories/adder.rb +13 -0
- data/examples/stories/addition +34 -0
- data/examples/stories/addition.rb +9 -0
- data/examples/stories/calculator.rb +65 -0
- data/examples/stories/game-of-life/README.txt +21 -0
- data/examples/stories/game-of-life/behaviour/everything.rb +6 -0
- data/examples/stories/game-of-life/behaviour/examples/examples.rb +3 -0
- data/examples/stories/game-of-life/behaviour/examples/game_behaviour.rb +35 -0
- data/examples/stories/game-of-life/behaviour/examples/grid_behaviour.rb +66 -0
- data/examples/stories/game-of-life/behaviour/stories/CellsWithLessThanTwoNeighboursDie.story +21 -0
- data/examples/stories/game-of-life/behaviour/stories/CellsWithMoreThanThreeNeighboursDie.story +21 -0
- data/examples/stories/game-of-life/behaviour/stories/EmptySpacesWithThreeNeighboursCreateACell.story +42 -0
- data/examples/stories/game-of-life/behaviour/stories/ICanCreateACell.story +42 -0
- data/examples/stories/game-of-life/behaviour/stories/ICanKillACell.story +17 -0
- data/examples/stories/game-of-life/behaviour/stories/TheGridWraps.story +53 -0
- data/examples/stories/game-of-life/behaviour/stories/create_a_cell.rb +52 -0
- data/examples/stories/game-of-life/behaviour/stories/helper.rb +6 -0
- data/examples/stories/game-of-life/behaviour/stories/kill_a_cell.rb +26 -0
- data/examples/stories/game-of-life/behaviour/stories/steps.rb +5 -0
- data/examples/stories/game-of-life/behaviour/stories/stories.rb +3 -0
- data/examples/stories/game-of-life/behaviour/stories/stories.txt +22 -0
- data/examples/stories/game-of-life/life.rb +3 -0
- data/examples/stories/game-of-life/life/game.rb +23 -0
- data/examples/stories/game-of-life/life/grid.rb +43 -0
- data/examples/stories/helper.rb +9 -0
- data/examples/stories/steps/addition_steps.rb +18 -0
- data/lib/autotest/rspec.rb +1 -2
- data/lib/spec.rb +30 -6
- data/lib/spec/example.rb +12 -0
- data/lib/spec/{dsl → example}/configuration.rb +48 -39
- data/lib/spec/{dsl → example}/errors.rb +2 -2
- data/lib/spec/example/example_group.rb +16 -0
- data/lib/spec/example/example_group_factory.rb +62 -0
- data/lib/spec/example/example_group_methods.rb +412 -0
- data/lib/spec/example/example_matcher.rb +42 -0
- data/lib/spec/example/example_methods.rb +101 -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 +58 -0
- data/lib/spec/expectations/differs/default.rb +15 -10
- data/lib/spec/expectations/errors.rb +7 -1
- data/lib/spec/expectations/extensions/object.rb +12 -7
- data/lib/spec/expectations/handler.rb +13 -4
- data/lib/spec/extensions.rb +2 -0
- data/lib/spec/extensions/class.rb +24 -0
- data/lib/spec/extensions/main.rb +54 -0
- data/lib/spec/extensions/object.rb +5 -1
- data/lib/spec/interop/test.rb +10 -0
- data/lib/spec/interop/test/unit/autorunner.rb +6 -0
- data/lib/spec/interop/test/unit/testcase.rb +61 -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 +60 -0
- data/lib/spec/matchers.rb +11 -15
- data/lib/spec/matchers/be.rb +23 -6
- data/lib/spec/matchers/change.rb +25 -1
- data/lib/spec/matchers/exist.rb +17 -0
- data/lib/spec/matchers/operator_matcher.rb +1 -0
- data/lib/spec/matchers/simple_matcher.rb +29 -0
- data/lib/spec/matchers/throw_symbol.rb +2 -0
- data/lib/spec/mocks.rb +5 -2
- data/lib/spec/mocks/argument_expectation.rb +1 -1
- data/lib/spec/mocks/message_expectation.rb +62 -44
- data/lib/spec/mocks/methods.rb +2 -2
- data/lib/spec/mocks/mock.rb +24 -3
- data/lib/spec/mocks/proxy.rb +26 -23
- data/lib/spec/mocks/space.rb +1 -1
- data/lib/spec/mocks/spec_methods.rb +20 -12
- data/lib/spec/rake/spectask.rb +19 -1
- data/lib/spec/rake/verify_rcov.rb +1 -1
- data/lib/spec/runner.rb +33 -10
- data/lib/spec/runner/backtrace_tweaker.rb +3 -3
- data/lib/spec/runner/class_and_arguments_parser.rb +16 -0
- data/lib/spec/runner/command_line.rb +18 -12
- data/lib/spec/runner/drb_command_line.rb +4 -5
- data/lib/spec/runner/example_group_runner.rb +59 -0
- data/lib/spec/runner/formatter/base_formatter.rb +10 -8
- data/lib/spec/runner/formatter/base_text_formatter.rb +18 -18
- data/lib/spec/runner/formatter/failing_example_groups_formatter.rb +31 -0
- data/lib/spec/runner/formatter/failing_examples_formatter.rb +3 -5
- data/lib/spec/runner/formatter/html_formatter.rb +37 -27
- data/lib/spec/runner/formatter/profile_formatter.rb +47 -0
- data/lib/spec/runner/formatter/progress_bar_formatter.rb +3 -4
- data/lib/spec/runner/formatter/specdoc_formatter.rb +27 -13
- data/lib/spec/runner/formatter/story/html_formatter.rb +124 -0
- data/lib/spec/runner/formatter/story/plain_text_formatter.rb +123 -0
- data/lib/spec/runner/formatter/text_mate_formatter.rb +16 -0
- data/lib/spec/runner/heckle_runner.rb +9 -9
- data/lib/spec/runner/option_parser.rb +140 -138
- data/lib/spec/runner/options.rb +168 -90
- data/lib/spec/runner/reporter.rb +58 -40
- data/lib/spec/runner/spec_parser.rb +11 -8
- data/lib/spec/story.rb +10 -0
- data/lib/spec/story/extensions.rb +1 -0
- data/lib/spec/story/extensions/main.rb +86 -0
- data/lib/spec/story/given_scenario.rb +14 -0
- data/lib/spec/story/runner.rb +58 -0
- data/lib/spec/story/runner/plain_text_story_runner.rb +48 -0
- data/lib/spec/story/runner/scenario_collector.rb +18 -0
- data/lib/spec/story/runner/scenario_runner.rb +46 -0
- data/lib/spec/story/runner/story_mediator.rb +123 -0
- data/lib/spec/story/runner/story_parser.rb +227 -0
- data/lib/spec/story/runner/story_runner.rb +67 -0
- data/lib/spec/story/scenario.rb +14 -0
- data/lib/spec/story/step.rb +48 -0
- data/lib/spec/story/step_group.rb +89 -0
- data/lib/spec/story/step_mother.rb +37 -0
- data/lib/spec/story/story.rb +42 -0
- data/lib/spec/story/world.rb +124 -0
- data/lib/spec/version.rb +4 -5
- data/plugins/mock_frameworks/rspec.rb +1 -1
- data/spec/autotest/rspec_spec.rb +13 -7
- data/spec/autotest_helper.rb +4 -3
- data/spec/rspec_suite.rb +7 -0
- data/spec/ruby_forker.rb +13 -0
- data/spec/spec/example/configuration_spec.rb +290 -0
- data/spec/spec/example/example_group_class_definition_spec.rb +48 -0
- data/spec/spec/example/example_group_factory_spec.rb +129 -0
- data/spec/spec/example/example_group_methods_spec.rb +465 -0
- data/spec/spec/example/example_group_spec.rb +711 -0
- data/spec/spec/{dsl → example}/example_matcher_spec.rb +23 -18
- data/spec/spec/example/example_methods_spec.rb +75 -0
- data/spec/spec/example/example_runner_spec.rb +194 -0
- data/spec/spec/example/example_spec.rb +53 -0
- data/spec/spec/example/nested_example_group_spec.rb +59 -0
- data/spec/spec/example/pending_module_spec.rb +31 -0
- data/spec/spec/{dsl → example}/predicate_matcher_spec.rb +1 -1
- data/spec/spec/example/shared_example_group_spec.rb +265 -0
- data/spec/spec/example/subclassing_example_group_spec.rb +25 -0
- data/spec/spec/expectations/differs/default_spec.rb +5 -3
- data/spec/spec/expectations/extensions/object_spec.rb +63 -2
- data/spec/spec/extensions/main_spec.rb +50 -0
- data/spec/spec/interop/test/unit/test_unit_spec_helper.rb +14 -0
- data/spec/spec/interop/test/unit/testcase_spec.rb +10 -0
- data/spec/spec/interop/test/unit/testcase_spec_with_test_unit.rb +20 -0
- data/spec/spec/interop/test/unit/testsuite_adapter_spec.rb +9 -0
- data/spec/spec/interop/test/unit/testsuite_adapter_spec_with_test_unit.rb +34 -0
- data/spec/spec/matchers/be_spec.rb +15 -0
- data/spec/spec/matchers/change_spec.rb +87 -0
- data/spec/spec/matchers/description_generation_spec.rb +31 -37
- data/spec/spec/matchers/exist_spec.rb +31 -22
- data/spec/spec/matchers/handler_spec.rb +42 -1
- data/spec/spec/matchers/have_spec.rb +1 -1
- data/spec/spec/matchers/mock_constraint_matchers_spec.rb +1 -1
- data/spec/spec/matchers/operator_matcher_spec.rb +1 -1
- data/spec/spec/matchers/simple_matcher_spec.rb +31 -0
- data/spec/spec/matchers/throw_symbol_spec.rb +4 -1
- data/spec/spec/mocks/bug_report_10263.rb +24 -0
- data/spec/spec/mocks/bug_report_15719_spec.rb +30 -0
- data/spec/spec/mocks/bug_report_8165_spec.rb +2 -2
- data/spec/spec/mocks/failing_mock_argument_constraints_spec.rb +1 -0
- data/spec/spec/mocks/mock_spec.rb +200 -102
- data/spec/spec/mocks/multiple_return_value_spec.rb +1 -1
- data/spec/spec/mocks/options_hash_spec.rb +19 -7
- data/spec/spec/mocks/partial_mock_spec.rb +31 -9
- data/spec/spec/mocks/passing_mock_argument_constraints_spec.rb +6 -0
- data/spec/spec/mocks/stub_spec.rb +120 -98
- data/spec/spec/package/bin_spec_spec.rb +7 -5
- data/spec/spec/runner/class_and_argument_parser_spec.rb +23 -0
- data/spec/spec/runner/command_line_spec.rb +140 -27
- data/spec/spec/runner/drb_command_line_spec.rb +39 -31
- data/spec/spec/runner/formatter/failing_example_groups_formatter_spec.rb +44 -0
- data/spec/spec/runner/formatter/failing_examples_formatter_spec.rb +16 -11
- data/spec/spec/runner/formatter/html_formatter_spec.rb +60 -50
- data/spec/spec/runner/formatter/profile_formatter_spec.rb +65 -0
- data/spec/spec/runner/formatter/progress_bar_formatter_spec.rb +29 -13
- data/spec/spec/runner/formatter/snippet_extractor_spec.rb +14 -7
- data/spec/spec/runner/formatter/spec_mate_formatter_spec.rb +103 -0
- data/spec/spec/runner/formatter/specdoc_formatter_spec.rb +103 -39
- data/spec/spec/runner/formatter/story/html_formatter_spec.rb +56 -0
- data/spec/spec/runner/formatter/story/plain_text_formatter_spec.rb +289 -0
- data/spec/spec/runner/heckle_runner_spec.rb +29 -14
- data/spec/spec/runner/heckler_spec.rb +4 -5
- data/spec/spec/runner/noisy_backtrace_tweaker_spec.rb +5 -5
- data/spec/spec/runner/option_parser_spec.rb +86 -58
- data/spec/spec/runner/options_spec.rb +239 -120
- 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 +6 -6
- data/spec/spec/runner/reporter_spec.rb +147 -163
- data/spec/spec/runner/spec_parser_spec.rb +31 -0
- data/spec/spec/runner_spec.rb +11 -0
- data/spec/spec/spec_classes.rb +12 -5
- data/spec/spec/story/builders.rb +46 -0
- data/spec/spec/story/extensions/main_spec.rb +161 -0
- data/spec/spec/story/extensions_spec.rb +14 -0
- data/spec/spec/story/given_scenario_spec.rb +27 -0
- data/spec/spec/story/runner/plain_text_story_runner_spec.rb +92 -0
- data/spec/spec/story/runner/scenario_collector_spec.rb +27 -0
- data/spec/spec/story/runner/scenario_runner_spec.rb +142 -0
- data/spec/spec/story/runner/story_mediator_spec.rb +133 -0
- data/spec/spec/story/runner/story_parser_spec.rb +384 -0
- data/spec/spec/story/runner/story_runner_spec.rb +219 -0
- data/spec/spec/story/runner_spec.rb +106 -0
- data/spec/spec/story/scenario_spec.rb +20 -0
- data/spec/spec/story/step_group_spec.rb +157 -0
- data/spec/spec/story/step_mother_spec.rb +72 -0
- data/spec/spec/story/step_spec.rb +147 -0
- data/spec/spec/story/story_helper.rb +2 -0
- data/spec/spec/story/story_spec.rb +86 -0
- data/spec/spec/story/world_spec.rb +416 -0
- data/spec/spec/translator_spec.rb +2 -1
- data/spec/spec_helper.rb +59 -2
- data/stories/all.rb +5 -0
- data/stories/example_groups/autogenerated_docstrings +26 -0
- data/stories/example_groups/example_group_with_should_methods +17 -0
- data/stories/example_groups/nested_groups +17 -0
- data/stories/example_groups/output +20 -0
- data/stories/example_groups/stories.rb +7 -0
- data/stories/helper.rb +6 -0
- data/stories/interop/examples_and_tests_together +30 -0
- data/stories/interop/stories.rb +7 -0
- data/stories/interop/test_case_with_should_methods +17 -0
- data/stories/pending_stories/README +3 -0
- data/stories/resources/helpers/cmdline.rb +9 -0
- data/stories/resources/helpers/story_helper.rb +16 -0
- data/stories/resources/matchers/smart_match.rb +37 -0
- data/stories/resources/spec/example_group_with_should_methods.rb +12 -0
- data/stories/resources/spec/simple_spec.rb +8 -0
- data/stories/resources/steps/running_rspec.rb +50 -0
- data/stories/resources/test/spec_and_test_together.rb +57 -0
- data/stories/resources/test/test_case_with_should_methods.rb +30 -0
- metadata +232 -106
- data/EXAMPLES.rd +0 -111
- data/examples/multi_threaded_behaviour_runner.rb +0 -25
- data/examples/shared_behaviours_example.rb +0 -39
- data/examples/spec_helper.rb +0 -1
- data/examples/test_case_adapter_example.rb +0 -26
- data/examples/test_case_spec.rb +0 -65
- data/lib/spec/dsl.rb +0 -11
- data/lib/spec/dsl/behaviour.rb +0 -220
- data/lib/spec/dsl/behaviour_callbacks.rb +0 -82
- data/lib/spec/dsl/behaviour_eval.rb +0 -231
- data/lib/spec/dsl/behaviour_factory.rb +0 -42
- data/lib/spec/dsl/composite_proc_builder.rb +0 -33
- data/lib/spec/dsl/description.rb +0 -76
- data/lib/spec/dsl/example.rb +0 -135
- data/lib/spec/dsl/example_matcher.rb +0 -40
- data/lib/spec/dsl/example_should_raise_handler.rb +0 -74
- data/lib/spec/runner/behaviour_runner.rb +0 -123
- data/lib/spec/runner/extensions/kernel.rb +0 -50
- data/lib/spec/runner/extensions/object.rb +0 -32
- data/lib/spec/runner/formatter.rb +0 -9
- data/lib/spec/runner/formatter/failing_behaviours_formatter.rb +0 -29
- data/lib/spec/runner/formatter/rdoc_formatter.rb +0 -24
- data/lib/spec/test_case_adapter.rb +0 -10
- data/spec/spec/dsl/behaviour_eval_spec.rb +0 -79
- data/spec/spec/dsl/behaviour_factory_spec.rb +0 -48
- data/spec/spec/dsl/behaviour_spec.rb +0 -661
- data/spec/spec/dsl/composite_proc_builder_spec.rb +0 -44
- data/spec/spec/dsl/configuration_spec.rb +0 -55
- data/spec/spec/dsl/description_spec.rb +0 -89
- data/spec/spec/dsl/example_class_spec.rb +0 -24
- data/spec/spec/dsl/example_instance_spec.rb +0 -160
- data/spec/spec/dsl/example_should_raise_spec.rb +0 -137
- data/spec/spec/dsl/shared_behaviour_spec.rb +0 -252
- data/spec/spec/runner/behaviour_runner_spec.rb +0 -229
- data/spec/spec/runner/context_matching_spec.rb +0 -27
- data/spec/spec/runner/extensions/bug_report_10577_spec.rb +0 -35
- data/spec/spec/runner/extensions/kernel_spec.rb +0 -36
- data/spec/spec/runner/formatter/failing_behaviours_formatter_spec.rb +0 -40
- data/spec/spec/runner/formatter/progress_bar_formatter_dry_run_spec.rb +0 -20
- data/spec/spec/runner/formatter/progress_bar_formatter_failure_dump_spec.rb +0 -36
- data/spec/spec/runner/formatter/rdoc_formatter_dry_run_spec.rb +0 -19
- data/spec/spec/runner/formatter/rdoc_formatter_spec.rb +0 -46
- data/spec/spec/runner/formatter/specdoc_formatter_dry_run_spec.rb +0 -21
- data/spec/spec/runner/object_ext_spec.rb +0 -11
@@ -0,0 +1,29 @@
|
|
1
|
+
module Spec
|
2
|
+
module Matchers
|
3
|
+
class SimpleMatcher
|
4
|
+
attr_reader :description
|
5
|
+
|
6
|
+
def initialize(description, &match_block)
|
7
|
+
@description = description
|
8
|
+
@match_block = match_block
|
9
|
+
end
|
10
|
+
|
11
|
+
def matches?(actual)
|
12
|
+
@actual = actual
|
13
|
+
return @match_block.call(@actual)
|
14
|
+
end
|
15
|
+
|
16
|
+
def failure_message()
|
17
|
+
return %[expected #{@description.inspect} but got #{@actual.inspect}]
|
18
|
+
end
|
19
|
+
|
20
|
+
def negative_failure_message()
|
21
|
+
return %[expected not to get #{@description.inspect}, but got #{@actual.inspect}]
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
def simple_matcher(message, &match_block)
|
26
|
+
SimpleMatcher.new(message, &match_block)
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -4,12 +4,14 @@ module Spec
|
|
4
4
|
class ThrowSymbol #:nodoc:
|
5
5
|
def initialize(expected=nil)
|
6
6
|
@expected = expected
|
7
|
+
@actual = nil
|
7
8
|
end
|
8
9
|
|
9
10
|
def matches?(proc)
|
10
11
|
begin
|
11
12
|
proc.call
|
12
13
|
rescue NameError => e
|
14
|
+
raise e unless e.message =~ /uncaught throw/
|
13
15
|
@actual = e.name.to_sym
|
14
16
|
ensure
|
15
17
|
if @expected.nil?
|
data/lib/spec/mocks.rb
CHANGED
@@ -170,7 +170,9 @@ module Spec
|
|
170
170
|
# #error can be an instantiated object or a class
|
171
171
|
# #if it is a class, it must be instantiable with no args
|
172
172
|
# my_mock.should_receive(:sym).and_throw(:sym)
|
173
|
-
# my_mock.should_receive(:sym).and_yield(
|
173
|
+
# my_mock.should_receive(:sym).and_yield(values,to,yield)
|
174
|
+
# my_mock.should_receive(:sym).and_yield(values,to,yield).and_yield(some,other,values,this,time)
|
175
|
+
# # for methods that yield to a block multiple times
|
174
176
|
#
|
175
177
|
# Any of these responses can be applied to a stub as well, but stubs do
|
176
178
|
# not support any qualifiers about the message received (i.e. you can't specify arguments
|
@@ -180,7 +182,8 @@ module Spec
|
|
180
182
|
# my_mock.stub!(:sym).and_return(value1, value2, value3)
|
181
183
|
# my_mock.stub!(:sym).and_raise(error)
|
182
184
|
# my_mock.stub!(:sym).and_throw(:sym)
|
183
|
-
# my_mock.stub!(:sym).and_yield(
|
185
|
+
# my_mock.stub!(:sym).and_yield(values,to,yield)
|
186
|
+
# my_mock.stub!(:sym).and_yield(values,to,yield).and_yield(some,other,values,this,time)
|
184
187
|
#
|
185
188
|
# == Arbitrary Handling
|
186
189
|
#
|
@@ -138,7 +138,7 @@ module Spec
|
|
138
138
|
end
|
139
139
|
|
140
140
|
def warn_deprecated(deprecated_method, instead)
|
141
|
-
|
141
|
+
Kernel.warn "The #{deprecated_method} constraint is deprecated. Use #{instead} instead."
|
142
142
|
end
|
143
143
|
|
144
144
|
def convert_constraint(constraint)
|
@@ -10,8 +10,8 @@ module Spec
|
|
10
10
|
@expected_from = expected_from
|
11
11
|
@sym = sym
|
12
12
|
@method_block = method_block
|
13
|
-
@return_block =
|
14
|
-
@
|
13
|
+
@return_block = nil
|
14
|
+
@actual_received_count = 0
|
15
15
|
@expected_received_count = expected_received_count
|
16
16
|
@args_expectation = ArgumentExpectation.new([AnyArgsConstraint.new])
|
17
17
|
@consecutive = false
|
@@ -20,7 +20,7 @@ module Spec
|
|
20
20
|
@order_group = expectation_ordering
|
21
21
|
@at_least = nil
|
22
22
|
@at_most = nil
|
23
|
-
@args_to_yield =
|
23
|
+
@args_to_yield = []
|
24
24
|
end
|
25
25
|
|
26
26
|
def expected_args
|
@@ -29,14 +29,13 @@ module Spec
|
|
29
29
|
|
30
30
|
def and_return(*values, &return_block)
|
31
31
|
Kernel::raise AmbiguousReturnError unless @method_block.nil?
|
32
|
-
|
33
|
-
value = nil
|
34
|
-
|
35
|
-
value = values[0]
|
32
|
+
case values.size
|
33
|
+
when 0 then value = nil
|
34
|
+
when 1 then value = values[0]
|
36
35
|
else
|
37
36
|
value = values
|
38
37
|
@consecutive = true
|
39
|
-
@expected_received_count = values.size if
|
38
|
+
@expected_received_count = values.size if !ignoring_args? &&
|
40
39
|
@expected_received_count < values.size
|
41
40
|
end
|
42
41
|
@return_block = block_given? ? return_block : lambda { value }
|
@@ -62,7 +61,8 @@ module Spec
|
|
62
61
|
end
|
63
62
|
|
64
63
|
def and_yield(*args)
|
65
|
-
@args_to_yield
|
64
|
+
@args_to_yield << args
|
65
|
+
self
|
66
66
|
end
|
67
67
|
|
68
68
|
def matches(sym, args)
|
@@ -73,25 +73,26 @@ module Spec
|
|
73
73
|
@order_group.handle_order_constraint self
|
74
74
|
|
75
75
|
begin
|
76
|
-
if @exception_to_raise.class == Class
|
77
|
-
@exception_instance_to_raise = @exception_to_raise.new
|
78
|
-
else
|
79
|
-
@exception_instance_to_raise = @exception_to_raise
|
80
|
-
end
|
81
76
|
Kernel::raise @exception_to_raise unless @exception_to_raise.nil?
|
82
77
|
Kernel::throw @symbol_to_throw unless @symbol_to_throw.nil?
|
83
|
-
|
78
|
+
|
84
79
|
if !@method_block.nil?
|
85
|
-
|
86
|
-
elsif
|
87
|
-
|
88
|
-
elsif @consecutive
|
89
|
-
return invoke_consecutive_return_block(args, block)
|
80
|
+
default_return_val = invoke_method_block(args)
|
81
|
+
elsif @args_to_yield.size > 0
|
82
|
+
default_return_val = invoke_with_yield(block)
|
90
83
|
else
|
84
|
+
default_return_val = nil
|
85
|
+
end
|
86
|
+
|
87
|
+
if @consecutive
|
88
|
+
return invoke_consecutive_return_block(args, block)
|
89
|
+
elsif @return_block
|
91
90
|
return invoke_return_block(args, block)
|
91
|
+
else
|
92
|
+
return default_return_val
|
92
93
|
end
|
93
94
|
ensure
|
94
|
-
@
|
95
|
+
@actual_received_count += 1
|
95
96
|
end
|
96
97
|
end
|
97
98
|
|
@@ -109,17 +110,19 @@ module Spec
|
|
109
110
|
if block.nil?
|
110
111
|
@error_generator.raise_missing_block_error @args_to_yield
|
111
112
|
end
|
112
|
-
|
113
|
-
|
113
|
+
@args_to_yield.each do |args_to_yield_this_time|
|
114
|
+
if block.arity > -1 && args_to_yield_this_time.length != block.arity
|
115
|
+
@error_generator.raise_wrong_arity_error args_to_yield_this_time, block.arity
|
116
|
+
end
|
117
|
+
block.call(*args_to_yield_this_time)
|
114
118
|
end
|
115
|
-
block.call(*@args_to_yield)
|
116
119
|
end
|
117
120
|
|
118
121
|
def invoke_consecutive_return_block(args, block)
|
119
122
|
args << block unless block.nil?
|
120
123
|
value = @return_block.call(*args)
|
121
124
|
|
122
|
-
index = [@
|
125
|
+
index = [@actual_received_count, value.size-1].min
|
123
126
|
value[index]
|
124
127
|
end
|
125
128
|
|
@@ -138,17 +141,33 @@ module Spec
|
|
138
141
|
end
|
139
142
|
|
140
143
|
def verify_messages_received
|
141
|
-
return if
|
142
|
-
|
143
|
-
return if (@at_most) && (@received_count <= @expected_received_count)
|
144
|
-
return if @expected_received_count == @received_count
|
144
|
+
return if ignoring_args? || matches_exact_count? ||
|
145
|
+
matches_at_least_count? || matches_at_most_count?
|
145
146
|
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
147
|
+
generate_error
|
148
|
+
rescue Spec::Mocks::MockExpectationError => error
|
149
|
+
error.backtrace.insert(0, @expected_from)
|
150
|
+
Kernel::raise error
|
151
|
+
end
|
152
|
+
|
153
|
+
def ignoring_args?
|
154
|
+
@expected_received_count == :any
|
155
|
+
end
|
156
|
+
|
157
|
+
def matches_at_least_count?
|
158
|
+
@at_least && @actual_received_count >= @expected_received_count
|
159
|
+
end
|
160
|
+
|
161
|
+
def matches_at_most_count?
|
162
|
+
@at_most && @actual_received_count <= @expected_received_count
|
163
|
+
end
|
164
|
+
|
165
|
+
def matches_exact_count?
|
166
|
+
@expected_received_count == @actual_received_count
|
167
|
+
end
|
168
|
+
|
169
|
+
def generate_error
|
170
|
+
@error_generator.raise_expectation_error(@sym, @expected_received_count, @actual_received_count, *@args_expectation.args)
|
152
171
|
end
|
153
172
|
|
154
173
|
def with(*args, &block)
|
@@ -215,9 +234,14 @@ module Spec
|
|
215
234
|
def set_expected_received_count(relativity, n)
|
216
235
|
@at_least = (relativity == :at_least)
|
217
236
|
@at_most = (relativity == :at_most)
|
218
|
-
@expected_received_count =
|
219
|
-
|
220
|
-
|
237
|
+
@expected_received_count = case n
|
238
|
+
when Numeric
|
239
|
+
n
|
240
|
+
when :once
|
241
|
+
1
|
242
|
+
when :twice
|
243
|
+
2
|
244
|
+
end
|
221
245
|
end
|
222
246
|
|
223
247
|
end
|
@@ -232,11 +256,5 @@ module Spec
|
|
232
256
|
end
|
233
257
|
end
|
234
258
|
|
235
|
-
class MethodStub < BaseExpectation
|
236
|
-
def initialize(message, expectation_ordering, expected_from, sym, method_block)
|
237
|
-
super(message, expectation_ordering, expected_from, sym, method_block, 0)
|
238
|
-
@expected_received_count = :any
|
239
|
-
end
|
240
|
-
end
|
241
259
|
end
|
242
260
|
end
|
data/lib/spec/mocks/methods.rb
CHANGED
@@ -9,8 +9,8 @@ module Spec
|
|
9
9
|
__mock_proxy.add_negative_message_expectation(caller(1)[0], sym.to_sym, &block)
|
10
10
|
end
|
11
11
|
|
12
|
-
def stub!(sym)
|
13
|
-
__mock_proxy.add_stub(caller(1)[0], sym.to_sym)
|
12
|
+
def stub!(sym, opts={})
|
13
|
+
__mock_proxy.add_stub(caller(1)[0], sym.to_sym, opts)
|
14
14
|
end
|
15
15
|
|
16
16
|
def received_message?(sym, *args, &block) #:nodoc:
|
data/lib/spec/mocks/mock.rb
CHANGED
@@ -6,9 +6,18 @@ module Spec
|
|
6
6
|
# Creates a new mock with a +name+ (that will be used in error messages only)
|
7
7
|
# == Options:
|
8
8
|
# * <tt>:null_object</tt> - if true, the mock object acts as a forgiving null object allowing any message to be sent to it.
|
9
|
-
def initialize(name,
|
9
|
+
def initialize(name, stubs_and_options={})
|
10
10
|
@name = name
|
11
|
-
@options =
|
11
|
+
@options = parse_options(stubs_and_options)
|
12
|
+
assign_stubs(stubs_and_options)
|
13
|
+
end
|
14
|
+
|
15
|
+
# This allows for comparing the mock to other objects that proxy
|
16
|
+
# such as ActiveRecords belongs_to proxy objects
|
17
|
+
# By making the other object run the comparison, we're sure the call gets delegated to the proxy target
|
18
|
+
# This is an unfortunate side effect from ActiveRecord, but this should be safe unless the RHS redefines == in a nonsensical manner
|
19
|
+
def ==(other)
|
20
|
+
other == __mock_proxy
|
12
21
|
end
|
13
22
|
|
14
23
|
def method_missing(sym, *args, &block)
|
@@ -16,7 +25,7 @@ module Spec
|
|
16
25
|
begin
|
17
26
|
return self if __mock_proxy.null_object?
|
18
27
|
super(sym, *args, &block)
|
19
|
-
rescue
|
28
|
+
rescue NameError
|
20
29
|
__mock_proxy.raise_unexpected_message_error sym, *args
|
21
30
|
end
|
22
31
|
end
|
@@ -24,6 +33,18 @@ module Spec
|
|
24
33
|
def inspect
|
25
34
|
"#<#{self.class}:#{sprintf '0x%x', self.object_id} @name=#{@name.inspect}>"
|
26
35
|
end
|
36
|
+
|
37
|
+
private
|
38
|
+
|
39
|
+
def parse_options(options)
|
40
|
+
options.has_key?(:null_object) ? {:null_object => options.delete(:null_object)} : {}
|
41
|
+
end
|
42
|
+
|
43
|
+
def assign_stubs(stubs)
|
44
|
+
stubs.each_pair do |message, response|
|
45
|
+
stub!(message).and_return(response)
|
46
|
+
end
|
47
|
+
end
|
27
48
|
end
|
28
49
|
end
|
29
50
|
end
|
data/lib/spec/mocks/proxy.rb
CHANGED
@@ -22,29 +22,27 @@ module Spec
|
|
22
22
|
end
|
23
23
|
|
24
24
|
def add_message_expectation(expected_from, sym, opts={}, &block)
|
25
|
-
__add sym
|
25
|
+
__add sym
|
26
26
|
@expectations << MessageExpectation.new(@error_generator, @expectation_ordering, expected_from, sym, block_given? ? block : nil, 1, opts)
|
27
27
|
@expectations.last
|
28
28
|
end
|
29
29
|
|
30
30
|
def add_negative_message_expectation(expected_from, sym, &block)
|
31
|
-
__add sym
|
31
|
+
__add sym
|
32
32
|
@expectations << NegativeMessageExpectation.new(@error_generator, @expectation_ordering, expected_from, sym, block_given? ? block : nil)
|
33
33
|
@expectations.last
|
34
34
|
end
|
35
35
|
|
36
|
-
def add_stub(expected_from, sym)
|
37
|
-
__add sym
|
38
|
-
@stubs.unshift
|
36
|
+
def add_stub(expected_from, sym, opts={})
|
37
|
+
__add sym
|
38
|
+
@stubs.unshift MessageExpectation.new(@error_generator, @expectation_ordering, expected_from, sym, nil, :any, opts)
|
39
39
|
@stubs.first
|
40
40
|
end
|
41
41
|
|
42
42
|
def verify #:nodoc:
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
reset
|
47
|
-
end
|
43
|
+
verify_expectations
|
44
|
+
ensure
|
45
|
+
reset
|
48
46
|
end
|
49
47
|
|
50
48
|
def reset
|
@@ -55,8 +53,7 @@ module Spec
|
|
55
53
|
end
|
56
54
|
|
57
55
|
def received_message?(sym, *args, &block)
|
58
|
-
|
59
|
-
return false
|
56
|
+
@messages_received.any? {|array| array == [sym, args, block]}
|
60
57
|
end
|
61
58
|
|
62
59
|
def has_negative_expectation?(sym)
|
@@ -66,7 +63,7 @@ module Spec
|
|
66
63
|
def message_received(sym, *args, &block)
|
67
64
|
if expectation = find_matching_expectation(sym, *args)
|
68
65
|
expectation.invoke(args, block)
|
69
|
-
elsif stub = find_matching_method_stub(sym)
|
66
|
+
elsif stub = find_matching_method_stub(sym, *args)
|
70
67
|
stub.invoke([], block)
|
71
68
|
elsif expectation = find_almost_matching_expectation(sym, *args)
|
72
69
|
raise_unexpected_message_args_error(expectation, *args) unless has_negative_expectation?(sym) unless null_object?
|
@@ -85,14 +82,17 @@ module Spec
|
|
85
82
|
|
86
83
|
private
|
87
84
|
|
88
|
-
def __add(sym
|
85
|
+
def __add(sym)
|
89
86
|
$rspec_mocks.add(@target) unless $rspec_mocks.nil?
|
90
87
|
define_expected_method(sym)
|
91
88
|
end
|
92
89
|
|
93
90
|
def define_expected_method(sym)
|
94
|
-
if target_responds_to?(sym) &&
|
95
|
-
|
91
|
+
if target_responds_to?(sym) && !metaclass.method_defined?(munge(sym))
|
92
|
+
munged_sym = munge(sym)
|
93
|
+
metaclass.instance_eval do
|
94
|
+
alias_method munged_sym, sym if method_defined?(sym.to_s)
|
95
|
+
end
|
96
96
|
@proxied_methods << sym
|
97
97
|
end
|
98
98
|
|
@@ -141,11 +141,14 @@ module Spec
|
|
141
141
|
|
142
142
|
def reset_proxied_methods
|
143
143
|
@proxied_methods.each do |sym|
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
144
|
+
munged_sym = munge(sym)
|
145
|
+
metaclass.instance_eval do
|
146
|
+
if method_defined?(munged_sym.to_s)
|
147
|
+
alias_method sym, munged_sym
|
148
|
+
undef_method munged_sym
|
149
|
+
else
|
150
|
+
undef_method sym
|
151
|
+
end
|
149
152
|
end
|
150
153
|
end
|
151
154
|
end
|
@@ -158,8 +161,8 @@ module Spec
|
|
158
161
|
@expectations.find {|expectation| expectation.matches_name_but_not_args(sym, args)}
|
159
162
|
end
|
160
163
|
|
161
|
-
def find_matching_method_stub(sym)
|
162
|
-
@stubs.find {|stub| stub.matches(sym,
|
164
|
+
def find_matching_method_stub(sym, *args)
|
165
|
+
@stubs.find {|stub| stub.matches(sym, args)}
|
163
166
|
end
|
164
167
|
|
165
168
|
end
|
data/lib/spec/mocks/space.rb
CHANGED
@@ -1,30 +1,38 @@
|
|
1
1
|
module Spec
|
2
2
|
module Mocks
|
3
|
-
module
|
3
|
+
module ExampleMethods
|
4
4
|
include Spec::Mocks::ArgumentConstraintMatchers
|
5
5
|
|
6
6
|
# Shortcut for creating an instance of Spec::Mocks::Mock.
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
#
|
12
|
-
#
|
7
|
+
#
|
8
|
+
# +name+ is used for failure reporting, so you should use the
|
9
|
+
# role that the mock is playing in the example.
|
10
|
+
#
|
11
|
+
# +stubs_and_options+ lets you assign options and stub values
|
12
|
+
# at the same time. The only option available is :null_object.
|
13
|
+
# Anything else is treated as a stub value.
|
13
14
|
#
|
14
15
|
# == Examples
|
15
16
|
#
|
16
|
-
# stub_thing =
|
17
|
+
# stub_thing = mock("thing", :a => "A")
|
17
18
|
# stub_thing.a == "A" => true
|
18
19
|
#
|
19
20
|
# stub_person = stub("thing", :name => "Joe", :email => "joe@domain.com")
|
20
21
|
# stub_person.name => "Joe"
|
21
22
|
# stub_person.email => "joe@domain.com"
|
22
|
-
def
|
23
|
-
|
24
|
-
stubs.each { |key, value| object_stub.stub!(key).and_return(value) }
|
25
|
-
object_stub
|
23
|
+
def mock(name, stubs_and_options={})
|
24
|
+
Spec::Mocks::Mock.new(name, stubs_and_options)
|
26
25
|
end
|
27
26
|
|
27
|
+
alias :stub :mock
|
28
|
+
|
29
|
+
# Shortcut for creating a mock object that will return itself in response
|
30
|
+
# to any message it receives that it hasn't been explicitly instructed
|
31
|
+
# to respond to.
|
32
|
+
def stub_everything(name = 'stub')
|
33
|
+
mock(name, :null_object => true)
|
34
|
+
end
|
35
|
+
|
28
36
|
end
|
29
37
|
end
|
30
38
|
end
|