rspec 0.8.2 → 0.9.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 +125 -9
- data/EXAMPLES.rd +50 -27
- data/README +14 -1
- data/Rakefile +95 -42
- data/UPGRADE +31 -0
- data/bin/spec +0 -1
- data/bin/spec_translator +6 -0
- data/examples/auto_spec_description_example.rb +19 -0
- data/examples/{setup_teardown_example.rb → before_and_after_example.rb} +6 -6
- data/examples/behave_as_example.rb +45 -0
- data/examples/custom_expectation_matchers.rb +13 -12
- data/examples/dynamic_spec.rb +2 -2
- data/examples/file_accessor_spec.rb +2 -2
- data/examples/greeter_spec.rb +3 -3
- data/examples/helper_method_example.rb +2 -2
- data/examples/io_processor_spec.rb +4 -4
- data/examples/legacy_spec.rb +10 -0
- data/examples/mocking_example.rb +5 -5
- data/examples/multi_threaded_behaviour_runner.rb +25 -0
- data/examples/partial_mock_example.rb +4 -4
- data/examples/predicate_example.rb +4 -4
- data/examples/priority.txt +1 -0
- data/examples/shared_behaviours_example.rb +31 -0
- data/examples/stack_spec.rb +52 -69
- data/examples/stubbing_example.rb +10 -10
- data/examples/test_case_adapter_example.rb +26 -0
- data/examples/test_case_spec.rb +6 -6
- data/lib/spec.rb +9 -4
- data/lib/spec/dsl.rb +10 -0
- data/lib/spec/dsl/behaviour.rb +189 -0
- data/lib/spec/dsl/behaviour_callbacks.rb +43 -0
- data/lib/spec/dsl/behaviour_eval.rb +170 -0
- data/lib/spec/dsl/behaviour_factory.rb +32 -0
- data/lib/spec/dsl/composite_proc_builder.rb +28 -0
- data/lib/spec/dsl/configuration.rb +38 -0
- data/lib/spec/dsl/description.rb +34 -0
- data/lib/spec/dsl/example.rb +114 -0
- data/lib/spec/dsl/example_matcher.rb +28 -0
- data/lib/spec/{runner/spec_should_raise_handler.rb → dsl/example_should_raise_handler.rb} +4 -4
- data/lib/spec/expectations.rb +0 -3
- data/lib/spec/expectations/differs/default.rb +0 -1
- data/lib/spec/expectations/extensions.rb +0 -1
- data/lib/spec/expectations/extensions/object.rb +10 -53
- data/lib/spec/expectations/handler.rb +14 -18
- data/lib/spec/extensions.rb +1 -0
- data/lib/spec/extensions/object.rb +6 -0
- data/lib/spec/matchers.rb +19 -21
- data/lib/spec/matchers/be.rb +40 -11
- data/lib/spec/matchers/be_close.rb +2 -2
- data/lib/spec/matchers/operator_matcher.rb +52 -0
- data/lib/spec/matchers/respond_to.rb +21 -11
- data/lib/spec/mocks.rb +5 -28
- data/lib/spec/mocks/argument_constraint_matchers.rb +12 -0
- data/lib/spec/mocks/argument_expectation.rb +7 -4
- data/lib/spec/mocks/methods.rb +11 -16
- data/lib/spec/mocks/mock.rb +6 -3
- data/lib/spec/mocks/{mock_handler.rb → proxy.rb} +4 -7
- data/lib/spec/mocks/space.rb +28 -0
- data/lib/spec/mocks/spec_methods.rb +30 -0
- data/lib/spec/rake/spectask.rb +23 -21
- data/lib/spec/rake/verify_rcov.rb +1 -0
- data/lib/spec/runner.rb +88 -35
- data/lib/spec/runner/backtrace_tweaker.rb +2 -1
- data/lib/spec/runner/behaviour_runner.rb +102 -0
- data/lib/spec/runner/command_line.rb +5 -17
- data/lib/spec/runner/drb_command_line.rb +2 -2
- data/lib/spec/runner/extensions/kernel.rb +22 -9
- data/lib/spec/runner/formatter.rb +4 -0
- data/lib/spec/runner/formatter/base_formatter.rb +63 -0
- data/lib/spec/runner/formatter/base_text_formatter.rb +22 -52
- data/lib/spec/runner/formatter/failing_behaviours_formatter.rb +25 -0
- data/lib/spec/runner/formatter/failing_examples_formatter.rb +22 -0
- data/lib/spec/runner/formatter/html_formatter.rb +74 -29
- data/lib/spec/runner/formatter/progress_bar_formatter.rb +6 -8
- data/lib/spec/runner/formatter/rdoc_formatter.rb +6 -6
- data/lib/spec/runner/formatter/snippet_extractor.rb +52 -0
- data/lib/spec/runner/formatter/specdoc_formatter.rb +6 -6
- data/lib/spec/runner/heckle_runner.rb +8 -7
- data/lib/spec/runner/option_parser.rb +136 -55
- data/lib/spec/runner/options.rb +26 -0
- data/lib/spec/runner/reporter.rb +38 -31
- data/lib/spec/runner/spec_parser.rb +22 -13
- data/lib/spec/test_case_adapter.rb +10 -0
- data/lib/spec/translator.rb +103 -86
- data/lib/spec/version.rb +7 -15
- data/plugins/mock_frameworks/flexmock.rb +27 -0
- data/plugins/mock_frameworks/mocha.rb +21 -0
- data/plugins/mock_frameworks/rspec.rb +18 -0
- data/spec/spec/dsl/behaviour_eval_spec.rb +49 -0
- data/spec/spec/dsl/behaviour_factory_spec.rb +30 -0
- data/spec/spec/dsl/behaviour_spec.rb +508 -0
- data/spec/spec/dsl/composite_proc_builder_spec.rb +57 -0
- data/spec/spec/dsl/configuration_spec.rb +43 -0
- data/spec/spec/dsl/description_spec.rb +51 -0
- data/spec/spec/dsl/example_class_spec.rb +24 -0
- data/spec/spec/dsl/example_instance_spec.rb +140 -0
- data/spec/spec/dsl/example_should_raise_spec.rb +137 -0
- data/spec/spec/dsl/predicate_matcher_spec.rb +21 -0
- data/spec/spec/dsl/shared_behaviour_spec.rb +186 -0
- data/spec/spec/expectations/differs/default_spec.rb +12 -12
- data/spec/spec/expectations/extensions/object_spec.rb +10 -10
- data/spec/spec/expectations/fail_with_spec.rb +20 -20
- data/spec/spec/matchers/be_close_spec.rb +37 -31
- data/spec/spec/matchers/be_spec.rb +50 -41
- data/spec/spec/matchers/change_spec.rb +54 -54
- data/spec/spec/matchers/description_generation_spec.rb +43 -31
- data/spec/spec/matchers/eql_spec.rb +24 -37
- data/spec/spec/matchers/equal_spec.rb +24 -37
- data/spec/spec/matchers/exist_spec.rb +48 -0
- data/spec/spec/matchers/handler_spec.rb +36 -23
- data/spec/spec/matchers/has_spec.rb +8 -8
- data/spec/spec/matchers/have_spec.rb +38 -38
- data/spec/spec/matchers/include_spec.rb +6 -6
- data/spec/spec/matchers/match_spec.rb +8 -8
- data/spec/spec/matchers/matcher_methods_spec.rb +24 -31
- data/spec/spec/matchers/raise_error_spec.rb +34 -34
- data/spec/spec/matchers/respond_to_spec.rb +32 -8
- data/spec/spec/matchers/satisfy_spec.rb +6 -6
- data/spec/spec/matchers/should_===_spec.rb +38 -0
- data/spec/spec/matchers/should_==_spec.rb +37 -0
- data/spec/spec/matchers/should_=~_spec.rb +36 -0
- data/spec/spec/matchers/throw_symbol_spec.rb +47 -55
- data/spec/spec/mocks/any_number_of_times_spec.rb +16 -21
- data/spec/spec/mocks/argument_expectation_spec.rb +3 -3
- data/spec/spec/mocks/at_least_spec.rb +30 -30
- data/spec/spec/mocks/at_most_spec.rb +53 -57
- data/spec/spec/mocks/bug_report_10260_spec.rb +8 -0
- data/spec/spec/mocks/bug_report_7611_spec.rb +3 -3
- data/spec/spec/mocks/bug_report_7805_spec.rb +3 -3
- data/spec/spec/mocks/bug_report_8165_spec.rb +5 -5
- data/spec/spec/mocks/bug_report_8302_spec.rb +5 -5
- data/spec/spec/mocks/failing_mock_argument_constraints_spec.rb +26 -27
- data/spec/spec/mocks/mock_ordering_spec.rb +19 -15
- data/spec/spec/mocks/mock_space_spec.rb +54 -0
- data/spec/spec/mocks/mock_spec.rb +111 -141
- data/spec/spec/mocks/multiple_return_value_spec.rb +48 -48
- data/spec/spec/mocks/null_object_mock_spec.rb +10 -10
- data/spec/spec/mocks/once_counts_spec.rb +32 -35
- data/spec/spec/mocks/options_hash_spec.rb +12 -10
- data/spec/spec/mocks/partial_mock_spec.rb +15 -15
- data/spec/spec/mocks/partial_mock_using_mocks_directly_spec.rb +24 -22
- data/spec/spec/mocks/passing_mock_argument_constraints_spec.rb +19 -19
- data/spec/spec/mocks/precise_counts_spec.rb +28 -32
- data/spec/spec/mocks/record_messages_spec.rb +10 -10
- data/spec/spec/mocks/stub_spec.rb +45 -45
- data/spec/spec/mocks/twice_counts_spec.rb +21 -21
- data/spec/spec/package/bin_spec_spec.rb +12 -0
- data/spec/spec/runner/behaviour_runner_spec.rb +114 -0
- data/spec/spec/runner/command_line_spec.rb +8 -8
- data/spec/spec/runner/context_matching_spec.rb +14 -15
- data/spec/spec/runner/drb_command_line_spec.rb +12 -12
- data/spec/spec/runner/execution_context_spec.rb +8 -29
- data/spec/spec/runner/extensions/kernel_spec.rb +36 -0
- data/spec/spec/runner/formatter/failing_behaviours_formatter_spec.rb +27 -0
- data/spec/spec/runner/formatter/failing_examples_formatter_spec.rb +28 -0
- data/spec/spec/runner/formatter/html_formatter_spec.rb +9 -8
- data/spec/spec/runner/formatter/progress_bar_formatter_dry_run_spec.rb +6 -6
- data/spec/spec/runner/formatter/progress_bar_formatter_failure_dump_spec.rb +10 -10
- data/spec/spec/runner/formatter/progress_bar_formatter_spec.rb +22 -27
- data/spec/spec/runner/formatter/rdoc_formatter_dry_run_spec.rb +6 -5
- data/spec/spec/runner/formatter/rdoc_formatter_spec.rb +17 -17
- data/spec/spec/runner/formatter/snippet_extractor_spec.rb +11 -0
- data/spec/spec/runner/formatter/specdoc_formatter_dry_run_spec.rb +6 -6
- data/spec/spec/runner/formatter/specdoc_formatter_spec.rb +17 -17
- data/spec/spec/runner/heckle_runner_spec.rb +21 -21
- data/spec/spec/runner/heckler_spec.rb +5 -5
- data/spec/spec/runner/noisy_backtrace_tweaker_spec.rb +12 -12
- data/spec/spec/runner/object_ext_spec.rb +3 -3
- data/spec/spec/runner/option_parser_spec.rb +171 -102
- data/spec/spec/runner/quiet_backtrace_tweaker_spec.rb +21 -12
- data/spec/spec/runner/reporter_spec.rb +106 -97
- data/spec/spec/runner/spec_matcher_spec.rb +46 -51
- data/spec/spec/runner/spec_parser_spec.rb +72 -16
- data/spec/spec/spec_classes.rb +12 -3
- data/spec/spec/translator_spec.rb +165 -36
- metadata +66 -76
- data/RELEASE-PLAN +0 -117
- data/examples/auto_spec_name_generation_example.rb +0 -18
- data/lib/spec/callback.rb +0 -11
- data/lib/spec/callback/callback_container.rb +0 -60
- data/lib/spec/callback/extensions/module.rb +0 -24
- data/lib/spec/callback/extensions/object.rb +0 -37
- data/lib/spec/deprecated.rb +0 -3
- data/lib/spec/expectations/extensions/proc.rb +0 -57
- data/lib/spec/expectations/should.rb +0 -5
- data/lib/spec/expectations/should/base.rb +0 -64
- data/lib/spec/expectations/should/change.rb +0 -69
- data/lib/spec/expectations/should/have.rb +0 -128
- data/lib/spec/expectations/should/not.rb +0 -74
- data/lib/spec/expectations/should/should.rb +0 -81
- data/lib/spec/expectations/sugar.rb +0 -47
- data/lib/spec/runner/context.rb +0 -154
- data/lib/spec/runner/context_eval.rb +0 -142
- data/lib/spec/runner/context_runner.rb +0 -55
- data/lib/spec/runner/execution_context.rb +0 -17
- data/lib/spec/runner/spec_matcher.rb +0 -25
- data/lib/spec/runner/specification.rb +0 -114
- data/spec/spec/callback/callback_container_spec.rb +0 -27
- data/spec/spec/callback/module_spec.rb +0 -37
- data/spec/spec/callback/object_spec.rb +0 -90
- data/spec/spec/callback/object_with_class_callback_spec.rb +0 -19
- data/spec/spec/expectations/should/should_==_spec.rb +0 -19
- data/spec/spec/expectations/should/should_=~_spec.rb +0 -13
- data/spec/spec/expectations/should/should_be_a_kind_of_spec.rb +0 -21
- data/spec/spec/expectations/should/should_be_an_instance_of_spec.rb +0 -30
- data/spec/spec/expectations/should/should_be_arbitrary_predicate_spec.rb +0 -81
- data/spec/spec/expectations/should/should_be_close_spec.rb +0 -18
- data/spec/spec/expectations/should/should_be_comparison_operator_spec.rb +0 -44
- data/spec/spec/expectations/should/should_be_false_spec.rb +0 -39
- data/spec/spec/expectations/should/should_be_spec.rb +0 -11
- data/spec/spec/expectations/should/should_be_true_spec.rb +0 -27
- data/spec/spec/expectations/should/should_change_spec.rb +0 -184
- data/spec/spec/expectations/should/should_eql_spec.rb +0 -11
- data/spec/spec/expectations/should/should_equal_spec.rb +0 -11
- data/spec/spec/expectations/should/should_have_at_least_spec.rb +0 -53
- data/spec/spec/expectations/should/should_have_at_most_spec.rb +0 -45
- data/spec/spec/expectations/should/should_have_key_spec.rb +0 -21
- data/spec/spec/expectations/should/should_have_spec.rb +0 -64
- data/spec/spec/expectations/should/should_include_spec.rb +0 -59
- data/spec/spec/expectations/should/should_match_spec.rb +0 -25
- data/spec/spec/expectations/should/should_not_==_spec.rb +0 -15
- data/spec/spec/expectations/should/should_not_be_a_kind_of_spec.rb +0 -21
- data/spec/spec/expectations/should/should_not_be_an_instance_of_spec.rb +0 -11
- data/spec/spec/expectations/should/should_not_be_arbitrary_predicate_spec.rb +0 -68
- data/spec/spec/expectations/should/should_not_be_spec.rb +0 -11
- data/spec/spec/expectations/should/should_not_change_spec.rb +0 -24
- data/spec/spec/expectations/should/should_not_eql_spec.rb +0 -11
- data/spec/spec/expectations/should/should_not_equal_spec.rb +0 -11
- data/spec/spec/expectations/should/should_not_have_key_spec.rb +0 -15
- data/spec/spec/expectations/should/should_not_include_spec.rb +0 -58
- data/spec/spec/expectations/should/should_not_match_spec.rb +0 -11
- data/spec/spec/expectations/should/should_not_raise_spec.rb +0 -75
- data/spec/spec/expectations/should/should_not_respond_to_spec.rb +0 -15
- data/spec/spec/expectations/should/should_not_throw_spec.rb +0 -35
- data/spec/spec/expectations/should/should_raise_spec.rb +0 -66
- data/spec/spec/expectations/should/should_respond_to_spec.rb +0 -15
- data/spec/spec/expectations/should/should_satisfy_spec.rb +0 -35
- data/spec/spec/expectations/should/should_throw_spec.rb +0 -27
- data/spec/spec/runner/context_runner_spec.rb +0 -100
- data/spec/spec/runner/context_spec.rb +0 -405
- data/spec/spec/runner/kernel_ext_spec.rb +0 -16
- data/spec/spec/runner/spec_name_generation_spec.rb +0 -102
- data/spec/spec/runner/specification_class_spec.rb +0 -72
- data/spec/spec/runner/specification_instance_spec.rb +0 -160
- data/spec/spec/runner/specification_should_raise_spec.rb +0 -136
|
@@ -0,0 +1 @@
|
|
|
1
|
+
require 'spec/extensions/object'
|
data/lib/spec/matchers.rb
CHANGED
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
require 'spec/deprecated'
|
|
2
|
-
require 'spec/callback'
|
|
3
1
|
require 'spec/matchers/be'
|
|
4
2
|
require 'spec/matchers/be_close'
|
|
5
3
|
require 'spec/matchers/change'
|
|
@@ -13,6 +11,7 @@ require 'spec/matchers/raise_error'
|
|
|
13
11
|
require 'spec/matchers/respond_to'
|
|
14
12
|
require 'spec/matchers/satisfy'
|
|
15
13
|
require 'spec/matchers/throw_symbol'
|
|
14
|
+
require 'spec/matchers/operator_matcher'
|
|
16
15
|
|
|
17
16
|
module Spec
|
|
18
17
|
|
|
@@ -124,13 +123,27 @@ module Spec
|
|
|
124
123
|
# ...
|
|
125
124
|
# end
|
|
126
125
|
module Matchers
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
126
|
+
module ModuleMethods
|
|
127
|
+
def description_generated(&callback)
|
|
128
|
+
description_generated_callbacks << callback
|
|
129
|
+
end
|
|
130
|
+
|
|
131
|
+
def unregister_description_generated(callback)
|
|
132
|
+
description_generated_callbacks.delete(callback)
|
|
133
|
+
end
|
|
134
|
+
|
|
130
135
|
def generated_description=(name)
|
|
131
|
-
|
|
136
|
+
description_generated_callbacks.each do |callback|
|
|
137
|
+
callback.call(name)
|
|
138
|
+
end
|
|
139
|
+
end
|
|
140
|
+
|
|
141
|
+
private
|
|
142
|
+
def description_generated_callbacks
|
|
143
|
+
@description_generated_callbacks ||= []
|
|
132
144
|
end
|
|
133
145
|
end
|
|
146
|
+
extend ModuleMethods
|
|
134
147
|
|
|
135
148
|
def method_missing(sym, *args, &block) # :nodoc:
|
|
136
149
|
return Matchers::Be.new(sym, *args) if sym.starts_with?("be_")
|
|
@@ -138,21 +151,6 @@ module Spec
|
|
|
138
151
|
super
|
|
139
152
|
end
|
|
140
153
|
|
|
141
|
-
deprecated do
|
|
142
|
-
# This supports sugar delegating to Matchers
|
|
143
|
-
class Matcher #:nodoc:
|
|
144
|
-
include Matchers
|
|
145
|
-
|
|
146
|
-
def respond_to?(sym)
|
|
147
|
-
if sym.to_s[0..2] == "be_"
|
|
148
|
-
return true
|
|
149
|
-
else
|
|
150
|
-
super
|
|
151
|
-
end
|
|
152
|
-
end
|
|
153
|
-
end
|
|
154
|
-
end
|
|
155
|
-
|
|
156
154
|
class MatcherError < StandardError
|
|
157
155
|
end
|
|
158
156
|
|
data/lib/spec/matchers/be.rb
CHANGED
|
@@ -2,8 +2,8 @@ module Spec
|
|
|
2
2
|
module Matchers
|
|
3
3
|
|
|
4
4
|
class Be #:nodoc:
|
|
5
|
-
def initialize(
|
|
6
|
-
@expected = parse_expected(
|
|
5
|
+
def initialize(*args)
|
|
6
|
+
@expected = parse_expected(args.shift)
|
|
7
7
|
@args = args
|
|
8
8
|
@comparison = ""
|
|
9
9
|
end
|
|
@@ -89,19 +89,25 @@ module Spec
|
|
|
89
89
|
end
|
|
90
90
|
|
|
91
91
|
def description
|
|
92
|
-
"
|
|
92
|
+
"#{prefix_to_sentence}#{comparison}#{expected_to_sentence}#{args_to_sentence}"
|
|
93
93
|
end
|
|
94
94
|
|
|
95
95
|
private
|
|
96
96
|
def parse_expected(expected)
|
|
97
97
|
if Symbol === expected
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
return "#{expected.to_s.sub(prefix,"")}".to_sym if expected.starts_with?(prefix)
|
|
98
|
+
@handling_predicate = true
|
|
99
|
+
["be_an_","be_a_","be_"].each do |@prefix|
|
|
100
|
+
return "#{expected.to_s.sub(@prefix,"")}".to_sym if expected.starts_with?(@prefix)
|
|
101
101
|
end
|
|
102
102
|
end
|
|
103
|
+
@prefix = "be "
|
|
103
104
|
return expected
|
|
104
105
|
end
|
|
106
|
+
|
|
107
|
+
def handling_predicate?
|
|
108
|
+
return false if [:true, :false, :nil].include?(@expected)
|
|
109
|
+
return @handling_predicate
|
|
110
|
+
end
|
|
105
111
|
|
|
106
112
|
def predicate
|
|
107
113
|
"#{@expected.to_s}?".to_sym
|
|
@@ -113,14 +119,37 @@ module Spec
|
|
|
113
119
|
|
|
114
120
|
def args_to_s
|
|
115
121
|
return "" if @args.empty?
|
|
116
|
-
|
|
117
|
-
return "(#{
|
|
122
|
+
inspected_args = @args.collect{|a| a.inspect}
|
|
123
|
+
return "(#{inspected_args.join(', ')})"
|
|
118
124
|
end
|
|
119
125
|
|
|
120
|
-
def
|
|
121
|
-
|
|
122
|
-
|
|
126
|
+
def comparison
|
|
127
|
+
@comparison
|
|
128
|
+
end
|
|
129
|
+
|
|
130
|
+
def expected_to_sentence
|
|
131
|
+
split_words(@expected)
|
|
132
|
+
end
|
|
133
|
+
|
|
134
|
+
def prefix_to_sentence
|
|
135
|
+
split_words(@prefix)
|
|
136
|
+
end
|
|
137
|
+
|
|
138
|
+
def split_words(sym)
|
|
139
|
+
sym.to_s.gsub(/_/,' ')
|
|
123
140
|
end
|
|
141
|
+
|
|
142
|
+
def args_to_sentence
|
|
143
|
+
case @args.length
|
|
144
|
+
when 0
|
|
145
|
+
""
|
|
146
|
+
when 1
|
|
147
|
+
" #{@args[0]}"
|
|
148
|
+
else
|
|
149
|
+
" #{@args[0...-1].join(', ')} and #{@args[-1]}"
|
|
150
|
+
end
|
|
151
|
+
end
|
|
152
|
+
|
|
124
153
|
end
|
|
125
154
|
|
|
126
155
|
# :call-seq:
|
|
@@ -13,11 +13,11 @@ module Spec
|
|
|
13
13
|
end
|
|
14
14
|
|
|
15
15
|
def failure_message
|
|
16
|
-
"expected #{@expected} +/- (
|
|
16
|
+
"expected #{@expected} +/- (< #{@delta}), got #{@actual}"
|
|
17
17
|
end
|
|
18
18
|
|
|
19
19
|
def description
|
|
20
|
-
"be close to #{@expected} (+- #{@delta})"
|
|
20
|
+
"be close to #{@expected} (within +- #{@delta})"
|
|
21
21
|
end
|
|
22
22
|
end
|
|
23
23
|
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
module Spec
|
|
2
|
+
module Matchers
|
|
3
|
+
class BaseOperatorMatcher
|
|
4
|
+
|
|
5
|
+
def initialize(target)
|
|
6
|
+
@target = target
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
def ==(expected)
|
|
10
|
+
@expected = expected
|
|
11
|
+
__delegate_method_missing_to_target("==", expected)
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def ===(expected)
|
|
15
|
+
@expected = expected
|
|
16
|
+
__delegate_method_missing_to_target("===", expected)
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def =~(expected)
|
|
20
|
+
@expected = expected
|
|
21
|
+
__delegate_method_missing_to_target("=~", expected)
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def fail_with_message(message)
|
|
25
|
+
Spec::Expectations.fail_with(message, @expected, @target)
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
class PositiveOperatorMatcher < BaseOperatorMatcher #:nodoc:
|
|
31
|
+
|
|
32
|
+
def __delegate_method_missing_to_target(operator, expected)
|
|
33
|
+
::Spec::Matchers.generated_description = "should #{operator} #{expected.inspect}"
|
|
34
|
+
return if @target.send(operator, expected)
|
|
35
|
+
return fail_with_message("expected #{expected.inspect}, got #{@target.inspect} (using #{operator})") if ['==','==='].include?(operator)
|
|
36
|
+
return fail_with_message("expected =~ #{expected.inspect}, got #{@target.inspect}")
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
class NegativeOperatorMatcher < BaseOperatorMatcher #:nodoc:
|
|
42
|
+
|
|
43
|
+
def __delegate_method_missing_to_target(operator, expected)
|
|
44
|
+
::Spec::Matchers.generated_description = "should not #{operator} #{expected.inspect}"
|
|
45
|
+
return unless @target.send(operator, expected)
|
|
46
|
+
return fail_with_message("expected not #{operator} #{expected.inspect}, got #{@target.inspect}")
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
end
|
|
52
|
+
end
|
|
@@ -2,34 +2,44 @@ module Spec
|
|
|
2
2
|
module Matchers
|
|
3
3
|
|
|
4
4
|
class RespondTo #:nodoc:
|
|
5
|
-
def initialize(
|
|
6
|
-
@
|
|
5
|
+
def initialize(*names)
|
|
6
|
+
@names = names
|
|
7
|
+
@names_not_responded_to = []
|
|
7
8
|
end
|
|
8
9
|
|
|
9
10
|
def matches?(target)
|
|
10
|
-
|
|
11
|
+
@names.each do |name|
|
|
12
|
+
unless target.respond_to?(name)
|
|
13
|
+
@names_not_responded_to << name
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
return @names_not_responded_to.empty?
|
|
11
17
|
end
|
|
12
18
|
|
|
13
19
|
def failure_message
|
|
14
|
-
"expected target to respond to #{@
|
|
20
|
+
"expected target to respond to #{@names_not_responded_to.collect {|name| name.inspect }.join(', ')}"
|
|
15
21
|
end
|
|
16
22
|
|
|
17
23
|
def negative_failure_message
|
|
18
|
-
"expected target not to respond to #{@
|
|
24
|
+
"expected target not to respond to #{@names.collect {|name| name.inspect }.join(', ')}"
|
|
19
25
|
end
|
|
20
26
|
|
|
21
27
|
def description
|
|
22
|
-
"respond to ##{@
|
|
28
|
+
"respond to ##{@names.to_s}"
|
|
23
29
|
end
|
|
24
30
|
end
|
|
25
31
|
|
|
26
32
|
# :call-seq:
|
|
27
|
-
# should respond_to(
|
|
28
|
-
# should_not respond_to(
|
|
33
|
+
# should respond_to(*names)
|
|
34
|
+
# should_not respond_to(*names)
|
|
29
35
|
#
|
|
30
|
-
# Matches if the target object responds to
|
|
31
|
-
|
|
32
|
-
|
|
36
|
+
# Matches if the target object responds to all of the names
|
|
37
|
+
# provided. Names can be Strings or Symbols.
|
|
38
|
+
#
|
|
39
|
+
# == Examples
|
|
40
|
+
#
|
|
41
|
+
def respond_to(*names)
|
|
42
|
+
Matchers::RespondTo.new(*names)
|
|
33
43
|
end
|
|
34
44
|
end
|
|
35
45
|
end
|
data/lib/spec/mocks.rb
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
require 'spec/mocks/methods'
|
|
2
|
-
require 'spec/mocks/
|
|
2
|
+
require 'spec/mocks/argument_constraint_matchers'
|
|
3
|
+
require 'spec/mocks/spec_methods'
|
|
4
|
+
require 'spec/mocks/proxy'
|
|
3
5
|
require 'spec/mocks/mock'
|
|
4
6
|
require 'spec/mocks/argument_expectation'
|
|
5
7
|
require 'spec/mocks/message_expectation'
|
|
@@ -7,6 +9,8 @@ require 'spec/mocks/order_group'
|
|
|
7
9
|
require 'spec/mocks/errors'
|
|
8
10
|
require 'spec/mocks/error_generator'
|
|
9
11
|
require 'spec/mocks/extensions/object'
|
|
12
|
+
require 'spec/mocks/space'
|
|
13
|
+
|
|
10
14
|
|
|
11
15
|
module Spec
|
|
12
16
|
# == Mocks and Stubs
|
|
@@ -201,32 +205,5 @@ module Spec
|
|
|
201
205
|
#
|
|
202
206
|
# my_mock.should_receive(:<<).with("illegal value").once.and_raise(ArgumentError)
|
|
203
207
|
module Mocks
|
|
204
|
-
# Shortcut for creating an instance of Spec::Mocks::Mock.
|
|
205
|
-
def mock(name, options={})
|
|
206
|
-
Spec::Mocks::Mock.new(name, options)
|
|
207
|
-
end
|
|
208
|
-
|
|
209
|
-
# Shortcut for creating an instance of Spec::Mocks::Mock with
|
|
210
|
-
# predefined method stubs.
|
|
211
|
-
#
|
|
212
|
-
# == Examples
|
|
213
|
-
#
|
|
214
|
-
# stub_thing = stub("thing", :a => "A")
|
|
215
|
-
# stub_thing.a == "A" => true
|
|
216
|
-
#
|
|
217
|
-
# stub_person = stub("thing", :name => "Joe", :email => "joe@domain.com")
|
|
218
|
-
# stub_person.name => "Joe"
|
|
219
|
-
# stub_person.email => "joe@domain.com"
|
|
220
|
-
def stub(name, stubs={})
|
|
221
|
-
object_stub = mock(name)
|
|
222
|
-
stubs.each { |key, value| object_stub.stub!(key).and_return(value) }
|
|
223
|
-
object_stub
|
|
224
|
-
end
|
|
225
|
-
|
|
226
|
-
# Shortcut for creating an instance of Spec::Mocks::DuckTypeArgConstraint
|
|
227
|
-
def duck_type(*args)
|
|
228
|
-
return Spec::Mocks::DuckTypeArgConstraint.new(*args)
|
|
229
|
-
end
|
|
230
|
-
|
|
231
208
|
end
|
|
232
209
|
end
|
|
@@ -71,12 +71,16 @@ module Spec
|
|
|
71
71
|
end
|
|
72
72
|
|
|
73
73
|
class DuckTypeArgConstraint
|
|
74
|
-
def initialize(*
|
|
75
|
-
@
|
|
74
|
+
def initialize(*methods_to_respond_to)
|
|
75
|
+
@methods_to_respond_to = methods_to_respond_to
|
|
76
76
|
end
|
|
77
77
|
|
|
78
78
|
def matches?(value)
|
|
79
|
-
@
|
|
79
|
+
@methods_to_respond_to.all? { |sym| value.respond_to?(sym) }
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
def description
|
|
83
|
+
"duck_type"
|
|
80
84
|
end
|
|
81
85
|
end
|
|
82
86
|
|
|
@@ -104,7 +108,6 @@ module Spec
|
|
|
104
108
|
|
|
105
109
|
def convert_constraint(constraint)
|
|
106
110
|
return @@constraint_classes[constraint].new(constraint) if constraint.is_a?(Symbol)
|
|
107
|
-
return constraint if constraint.is_a?(DuckTypeArgConstraint)
|
|
108
111
|
return MatcherConstraint.new(constraint) if is_matcher?(constraint)
|
|
109
112
|
return RegexpArgConstraint.new(constraint) if constraint.is_a?(Regexp)
|
|
110
113
|
return LiteralArgConstraint.new(constraint)
|
data/lib/spec/mocks/methods.rb
CHANGED
|
@@ -2,38 +2,33 @@ module Spec
|
|
|
2
2
|
module Mocks
|
|
3
3
|
module Methods
|
|
4
4
|
def should_receive(sym, opts={}, &block)
|
|
5
|
-
|
|
5
|
+
__mock_proxy.add_message_expectation(opts[:expected_from] || caller(1)[0], sym, opts, &block)
|
|
6
6
|
end
|
|
7
7
|
|
|
8
8
|
def should_not_receive(sym, &block)
|
|
9
|
-
|
|
9
|
+
__mock_proxy.add_negative_message_expectation(caller(1)[0], sym, &block)
|
|
10
10
|
end
|
|
11
11
|
|
|
12
12
|
def stub!(sym)
|
|
13
|
-
|
|
13
|
+
__mock_proxy.add_stub(caller(1)[0], sym)
|
|
14
14
|
end
|
|
15
15
|
|
|
16
16
|
def received_message?(sym, *args, &block) #:nodoc:
|
|
17
|
-
|
|
17
|
+
__mock_proxy.received_message?(sym, *args, &block)
|
|
18
18
|
end
|
|
19
19
|
|
|
20
|
-
def
|
|
21
|
-
|
|
20
|
+
def rspec_verify #:nodoc:
|
|
21
|
+
__mock_proxy.verify
|
|
22
22
|
end
|
|
23
23
|
|
|
24
|
-
def
|
|
25
|
-
|
|
24
|
+
def rspec_reset #:nodoc:
|
|
25
|
+
__mock_proxy.reset
|
|
26
26
|
end
|
|
27
27
|
|
|
28
|
-
|
|
29
|
-
__mock_handler.instance_eval {@messages_received << [sym, args, block]}
|
|
30
|
-
super(sym, *args, &block)
|
|
31
|
-
end
|
|
32
|
-
|
|
33
|
-
private
|
|
28
|
+
private
|
|
34
29
|
|
|
35
|
-
def
|
|
36
|
-
@
|
|
30
|
+
def __mock_proxy
|
|
31
|
+
@mock_proxy ||= Proxy.new(self, @name, @options)
|
|
37
32
|
end
|
|
38
33
|
end
|
|
39
34
|
end
|
data/lib/spec/mocks/mock.rb
CHANGED
|
@@ -12,15 +12,18 @@ module Spec
|
|
|
12
12
|
end
|
|
13
13
|
|
|
14
14
|
def method_missing(sym, *args, &block)
|
|
15
|
-
|
|
15
|
+
__mock_proxy.instance_eval {@messages_received << [sym, args, block]}
|
|
16
16
|
begin
|
|
17
|
-
return self if
|
|
17
|
+
return self if __mock_proxy.null_object?
|
|
18
18
|
super(sym, *args, &block)
|
|
19
19
|
rescue NoMethodError
|
|
20
|
-
|
|
20
|
+
__mock_proxy.raise_unexpected_message_error sym, *args
|
|
21
21
|
end
|
|
22
22
|
end
|
|
23
23
|
|
|
24
|
+
def inspect
|
|
25
|
+
"#<#{self.class}:#{sprintf '0x%x', self.object_id} @name=#{@name.inspect}>"
|
|
26
|
+
end
|
|
24
27
|
end
|
|
25
28
|
end
|
|
26
29
|
end
|