rspec 0.7.5.1 → 0.8.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 +60 -1
- data/EXAMPLES.rd +38 -19
- data/MIT-LICENSE +1 -1
- data/README +24 -17
- data/RELEASE-PLAN +117 -0
- data/Rakefile +24 -18
- data/TODO.0.8.0 +5 -0
- data/examples/auto_spec_name_generation_example.rb +18 -0
- data/examples/custom_expectation_matchers.rb +53 -0
- data/examples/dynamic_spec.rb +9 -0
- data/examples/io_processor_spec.rb +2 -2
- data/examples/mocking_example.rb +4 -4
- data/examples/partial_mock_example.rb +2 -2
- data/examples/predicate_example.rb +2 -2
- data/examples/stack_spec.rb +32 -36
- data/examples/stubbing_example.rb +19 -19
- data/examples/test_case_spec.rb +6 -6
- data/lib/spec.rb +3 -0
- data/lib/spec/callback.rb +8 -0
- data/lib/spec/callback/extensions/object.rb +4 -0
- data/lib/spec/deprecated.rb +3 -0
- data/lib/spec/expectations.rb +44 -17
- data/lib/spec/expectations/extensions.rb +1 -2
- data/lib/spec/expectations/extensions/object.rb +78 -130
- data/lib/spec/expectations/extensions/string_and_symbol.rb +17 -0
- data/lib/spec/expectations/handler.rb +47 -0
- data/lib/spec/expectations/should/base.rb +32 -29
- data/lib/spec/expectations/should/change.rb +1 -1
- data/lib/spec/expectations/should/have.rb +9 -17
- data/lib/spec/expectations/should/not.rb +54 -56
- data/lib/spec/expectations/should/should.rb +59 -65
- data/lib/spec/expectations/sugar.rb +27 -4
- data/lib/spec/matchers.rb +160 -0
- data/lib/spec/matchers/be.rb +161 -0
- data/lib/spec/matchers/be_close.rb +37 -0
- data/lib/spec/matchers/change.rb +120 -0
- data/lib/spec/matchers/eql.rb +43 -0
- data/lib/spec/matchers/equal.rb +43 -0
- data/lib/spec/matchers/has.rb +44 -0
- data/lib/spec/matchers/have.rb +140 -0
- data/lib/spec/matchers/include.rb +50 -0
- data/lib/spec/matchers/match.rb +41 -0
- data/lib/spec/matchers/raise_error.rb +100 -0
- data/lib/spec/matchers/respond_to.rb +35 -0
- data/lib/spec/matchers/satisfy.rb +47 -0
- data/lib/spec/matchers/throw_symbol.rb +75 -0
- data/lib/spec/mocks.rb +224 -1
- data/lib/spec/mocks/argument_expectation.rb +16 -2
- data/lib/spec/mocks/error_generator.rb +5 -3
- data/lib/spec/mocks/errors.rb +2 -2
- data/lib/spec/mocks/extensions/object.rb +1 -1
- data/lib/spec/mocks/message_expectation.rb +29 -19
- data/lib/spec/mocks/{mock_methods.rb → methods.rb} +5 -5
- data/lib/spec/mocks/mock.rb +2 -2
- data/lib/spec/mocks/mock_handler.rb +81 -68
- data/lib/spec/rake/spectask.rb +7 -12
- data/lib/spec/rake/verify_rcov.rb +1 -1
- data/lib/spec/runner.rb +117 -0
- data/lib/spec/runner/command_line.rb +8 -5
- data/lib/spec/runner/context.rb +13 -37
- data/lib/spec/runner/context_eval.rb +4 -3
- data/lib/spec/runner/context_runner.rb +7 -4
- data/lib/spec/runner/drb_command_line.rb +1 -1
- data/lib/spec/runner/execution_context.rb +3 -11
- data/lib/spec/runner/extensions/kernel.rb +7 -5
- data/lib/spec/runner/extensions/object.rb +4 -1
- data/lib/spec/runner/formatter/base_text_formatter.rb +11 -3
- data/lib/spec/runner/formatter/html_formatter.rb +21 -10
- data/lib/spec/runner/heckle_runner.rb +24 -8
- data/lib/spec/runner/heckle_runner_win.rb +10 -0
- data/lib/spec/runner/option_parser.rb +58 -13
- data/lib/spec/runner/spec_matcher.rb +22 -29
- data/lib/spec/runner/spec_parser.rb +1 -0
- data/lib/spec/runner/specification.rb +36 -22
- data/lib/spec/translator.rb +87 -0
- data/lib/spec/version.rb +16 -7
- data/spec/spec/callback/callback_container_spec.rb +27 -0
- data/spec/spec/callback/module_spec.rb +37 -0
- data/spec/spec/callback/object_spec.rb +90 -0
- data/spec/spec/callback/object_with_class_callback_spec.rb +19 -0
- data/spec/spec/expectations/differs/default_spec.rb +107 -0
- data/spec/spec/expectations/extensions/object_spec.rb +46 -0
- data/spec/spec/expectations/fail_with_spec.rb +71 -0
- data/spec/spec/expectations/should/should_==_spec.rb +19 -0
- data/spec/spec/expectations/should/should_=~_spec.rb +13 -0
- data/spec/spec/expectations/should/should_be_a_kind_of_spec.rb +21 -0
- data/spec/spec/expectations/should/should_be_an_instance_of_spec.rb +30 -0
- data/spec/spec/expectations/should/should_be_arbitrary_predicate_spec.rb +81 -0
- data/spec/spec/expectations/should/should_be_close_spec.rb +18 -0
- data/spec/spec/expectations/should/should_be_comparison_operator_spec.rb +44 -0
- data/spec/spec/expectations/should/should_be_false_spec.rb +39 -0
- data/spec/spec/expectations/should/should_be_spec.rb +11 -0
- data/spec/spec/expectations/should/should_be_true_spec.rb +27 -0
- data/spec/spec/expectations/should/should_change_spec.rb +184 -0
- data/spec/spec/expectations/should/should_eql_spec.rb +11 -0
- data/spec/spec/expectations/should/should_equal_spec.rb +11 -0
- data/spec/spec/expectations/should/should_have_at_least_spec.rb +53 -0
- data/spec/spec/expectations/should/should_have_at_most_spec.rb +45 -0
- data/spec/spec/expectations/should/should_have_key_spec.rb +21 -0
- data/spec/spec/expectations/should/should_have_spec.rb +64 -0
- data/spec/spec/expectations/should/should_include_spec.rb +59 -0
- data/spec/spec/expectations/should/should_match_spec.rb +25 -0
- data/spec/spec/expectations/should/should_not_==_spec.rb +15 -0
- data/spec/spec/expectations/should/should_not_be_a_kind_of_spec.rb +21 -0
- data/spec/spec/expectations/should/should_not_be_an_instance_of_spec.rb +11 -0
- data/spec/spec/expectations/should/should_not_be_arbitrary_predicate_spec.rb +68 -0
- data/spec/spec/expectations/should/should_not_be_spec.rb +11 -0
- data/spec/spec/expectations/should/should_not_change_spec.rb +24 -0
- data/spec/spec/expectations/should/should_not_eql_spec.rb +11 -0
- data/spec/spec/expectations/should/should_not_equal_spec.rb +11 -0
- data/spec/spec/expectations/should/should_not_have_key_spec.rb +15 -0
- data/spec/spec/expectations/should/should_not_include_spec.rb +58 -0
- data/spec/spec/expectations/should/should_not_match_spec.rb +11 -0
- data/spec/spec/expectations/should/should_not_raise_spec.rb +75 -0
- data/spec/spec/expectations/should/should_not_respond_to_spec.rb +15 -0
- data/spec/spec/expectations/should/should_not_throw_spec.rb +35 -0
- data/spec/spec/expectations/should/should_raise_spec.rb +66 -0
- data/spec/spec/expectations/should/should_respond_to_spec.rb +15 -0
- data/spec/spec/expectations/should/should_satisfy_spec.rb +35 -0
- data/spec/spec/expectations/should/should_throw_spec.rb +27 -0
- data/spec/spec/matchers/be_close_spec.rb +33 -0
- data/spec/spec/matchers/be_spec.rb +182 -0
- data/spec/spec/matchers/change_spec.rb +232 -0
- data/spec/spec/matchers/description_generation_spec.rb +147 -0
- data/spec/spec/matchers/eql_spec.rb +41 -0
- data/spec/spec/matchers/equal_spec.rb +41 -0
- data/spec/spec/matchers/handler_spec.rb +75 -0
- data/spec/spec/matchers/has_spec.rb +37 -0
- data/spec/spec/matchers/have_spec.rb +259 -0
- data/spec/spec/matchers/include_spec.rb +33 -0
- data/spec/spec/matchers/match_spec.rb +37 -0
- data/spec/spec/matchers/matcher_methods_spec.rb +85 -0
- data/spec/spec/matchers/raise_error_spec.rb +147 -0
- data/spec/spec/matchers/respond_to_spec.rb +30 -0
- data/spec/spec/matchers/satisfy_spec.rb +36 -0
- data/spec/spec/matchers/throw_symbol_spec.rb +59 -0
- data/spec/spec/mocks/any_number_of_times_spec.rb +34 -0
- data/spec/spec/mocks/at_least_spec.rb +97 -0
- data/spec/spec/mocks/at_most_spec.rb +97 -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_mock_argument_constraints_spec.rb +74 -0
- data/spec/spec/mocks/mock_ordering_spec.rb +80 -0
- data/spec/spec/mocks/mock_spec.rb +407 -0
- data/spec/spec/mocks/multiple_return_value_spec.rb +113 -0
- data/spec/spec/mocks/null_object_mock_spec.rb +40 -0
- data/spec/spec/mocks/once_counts_spec.rb +56 -0
- data/spec/spec/mocks/options_hash_spec.rb +31 -0
- data/spec/spec/mocks/partial_mock_spec.rb +52 -0
- data/spec/spec/mocks/partial_mock_using_mocks_directly_spec.rb +64 -0
- data/spec/spec/mocks/passing_mock_argument_constraints_spec.rb +92 -0
- data/spec/spec/mocks/precise_counts_spec.rb +56 -0
- data/spec/spec/mocks/record_messages_spec.rb +26 -0
- data/spec/spec/mocks/stub_spec.rb +159 -0
- data/spec/spec/mocks/twice_counts_spec.rb +67 -0
- data/spec/spec/runner/command_line_spec.rb +32 -0
- data/spec/spec/runner/context_matching_spec.rb +28 -0
- data/spec/spec/runner/context_runner_spec.rb +100 -0
- data/spec/spec/runner/context_spec.rb +405 -0
- data/spec/spec/runner/drb_command_line_spec.rb +74 -0
- data/spec/spec/runner/execution_context_spec.rb +52 -0
- data/spec/spec/runner/formatter/html_formatter_spec.rb +40 -0
- data/spec/spec/runner/formatter/progress_bar_formatter_dry_run_spec.rb +21 -0
- data/spec/spec/runner/formatter/progress_bar_formatter_failure_dump_spec.rb +36 -0
- data/spec/spec/runner/formatter/progress_bar_formatter_spec.rb +78 -0
- data/spec/spec/runner/formatter/rdoc_formatter_dry_run_spec.rb +18 -0
- data/spec/spec/runner/formatter/rdoc_formatter_spec.rb +41 -0
- data/spec/spec/runner/formatter/specdoc_formatter_dry_run_spec.rb +21 -0
- data/spec/spec/runner/formatter/specdoc_formatter_spec.rb +46 -0
- data/spec/spec/runner/heckle_runner_spec.rb +63 -0
- data/spec/spec/runner/heckler_spec.rb +14 -0
- data/spec/spec/runner/kernel_ext_spec.rb +16 -0
- data/spec/spec/runner/noisy_backtrace_tweaker_spec.rb +45 -0
- data/spec/spec/runner/object_ext_spec.rb +11 -0
- data/spec/spec/runner/option_parser_spec.rb +269 -0
- data/spec/spec/runner/quiet_backtrace_tweaker_spec.rb +47 -0
- data/spec/spec/runner/reporter_spec.rb +126 -0
- data/spec/spec/runner/spec_matcher_spec.rb +107 -0
- data/spec/spec/runner/spec_name_generation_spec.rb +102 -0
- data/spec/spec/runner/spec_parser_spec.rb +37 -0
- data/spec/spec/runner/specification_class_spec.rb +72 -0
- data/spec/spec/runner/specification_instance_spec.rb +160 -0
- data/spec/spec/runner/specification_should_raise_spec.rb +136 -0
- data/spec/spec/spec_classes.rb +102 -0
- data/spec/spec/translator_spec.rb +79 -0
- data/spec/spec_helper.rb +35 -0
- metadata +141 -9
- data/bin/drbspec +0 -3
- data/lib/spec/expectations/diff.rb +0 -28
- data/lib/spec/expectations/extensions/numeric.rb +0 -19
- data/lib/spec/expectations/extensions/string.rb +0 -22
- data/lib/spec/expectations/message_builder.rb +0 -13
@@ -0,0 +1,407 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/../../spec_helper'
|
2
|
+
|
3
|
+
module Spec
|
4
|
+
module Mocks
|
5
|
+
context "a Mock expectation" do
|
6
|
+
|
7
|
+
setup do
|
8
|
+
@mock = Mock.new("test mock", :auto_verify => false)
|
9
|
+
end
|
10
|
+
|
11
|
+
specify "should report line number of expectation of unreceived message" do
|
12
|
+
@mock.should_receive(:wont_happen).with("x", 3)
|
13
|
+
#NOTE - this test is quite ticklish because it specifies that
|
14
|
+
#the above statement appears on line 12 of this file.
|
15
|
+
|
16
|
+
begin
|
17
|
+
@mock.__verify
|
18
|
+
violated
|
19
|
+
rescue MockExpectationError => e
|
20
|
+
e.backtrace[0].should_match(/mock_spec\.rb:12/)
|
21
|
+
end
|
22
|
+
|
23
|
+
end
|
24
|
+
|
25
|
+
specify "should pass when not receiving message specified as not to be received" do
|
26
|
+
@mock.should_not_receive(:not_expected)
|
27
|
+
@mock.__verify
|
28
|
+
end
|
29
|
+
|
30
|
+
specify "should pass when receiving message specified as not to be received with different args" do
|
31
|
+
@mock.should_not_receive(:message).with("unwanted text")
|
32
|
+
@mock.should_receive(:message).with("other text")
|
33
|
+
@mock.message "other text"
|
34
|
+
@mock.__verify
|
35
|
+
end
|
36
|
+
|
37
|
+
specify "should fail when receiving message specified as not to be received" do
|
38
|
+
@mock.should_not_receive(:not_expected)
|
39
|
+
@mock.not_expected
|
40
|
+
begin
|
41
|
+
@mock.__verify
|
42
|
+
violated
|
43
|
+
rescue MockExpectationError => e
|
44
|
+
e.message.should_eql "Mock 'test mock' expected :not_expected with (any args) 0 times, but received it once"
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
specify "should fail when receiving message specified as not to be received with args" do
|
49
|
+
@mock.should_not_receive(:not_expected).with("unexpected text")
|
50
|
+
@mock.not_expected("unexpected text")
|
51
|
+
begin
|
52
|
+
@mock.__verify
|
53
|
+
violated
|
54
|
+
rescue MockExpectationError => e
|
55
|
+
e.message.should_eql "Mock 'test mock' expected :not_expected with (\"unexpected text\") 0 times, but received it once"
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
specify "should pass when receiving message specified as not to be received with wrong args" do
|
60
|
+
@mock.should_not_receive(:not_expected).with("unexpected text")
|
61
|
+
@mock.not_expected "really unexpected text"
|
62
|
+
@mock.__verify
|
63
|
+
end
|
64
|
+
|
65
|
+
specify "should allow block to calculate return values" do
|
66
|
+
@mock.should_receive(:something).with("a","b","c").and_return { |a,b,c| c+b+a }
|
67
|
+
@mock.something("a","b","c").should_eql "cba"
|
68
|
+
@mock.__verify
|
69
|
+
end
|
70
|
+
|
71
|
+
specify "should allow parameter as return value" do
|
72
|
+
@mock.should_receive(:something).with("a","b","c").and_return("booh")
|
73
|
+
@mock.something("a","b","c").should_eql "booh"
|
74
|
+
@mock.__verify
|
75
|
+
end
|
76
|
+
|
77
|
+
specify "should return nil if no return value set" do
|
78
|
+
@mock.should_receive(:something).with("a","b","c")
|
79
|
+
@mock.something("a","b","c").should be(nil)
|
80
|
+
@mock.__verify
|
81
|
+
end
|
82
|
+
|
83
|
+
specify "should raise exception if args dont match when method called" do
|
84
|
+
@mock.should_receive(:something).with("a","b","c").and_return("booh")
|
85
|
+
begin
|
86
|
+
@mock.something("a","d","c")
|
87
|
+
violated
|
88
|
+
rescue MockExpectationError => e
|
89
|
+
e.message.should_eql "Mock 'test mock' expected :something with (\"a\", \"b\", \"c\") but received it with (\"a\", \"d\", \"c\")"
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
93
|
+
specify "should fail if unexpected method called" do
|
94
|
+
begin
|
95
|
+
@mock.something("a","b","c")
|
96
|
+
violated
|
97
|
+
rescue MockExpectationError => e
|
98
|
+
e.message.should_eql "Mock 'test mock' received unexpected message :something with (\"a\", \"b\", \"c\")"
|
99
|
+
end
|
100
|
+
end
|
101
|
+
|
102
|
+
specify "should use block for expectation if provided" do
|
103
|
+
@mock.should_receive(:something) do | a, b |
|
104
|
+
a.should_eql "a"
|
105
|
+
b.should_eql "b"
|
106
|
+
"booh"
|
107
|
+
end
|
108
|
+
@mock.something("a", "b").should_eql "booh"
|
109
|
+
@mock.__verify
|
110
|
+
end
|
111
|
+
|
112
|
+
specify "should fail if expectation block fails" do
|
113
|
+
@mock.should_receive(:something) {| bool | bool.should be(true)}
|
114
|
+
begin
|
115
|
+
@mock.something false
|
116
|
+
rescue MockExpectationError => e
|
117
|
+
e.message.should_match /Mock 'test mock' received :something but passed block failed with: expected true, got false/
|
118
|
+
end
|
119
|
+
end
|
120
|
+
|
121
|
+
specify "should fail when method defined as never is received" do
|
122
|
+
@mock.should_receive(:not_expected).never
|
123
|
+
begin
|
124
|
+
@mock.not_expected
|
125
|
+
rescue MockExpectationError => e
|
126
|
+
e.message.should_eql "Mock 'test mock' expected :not_expected 0 times, but received it 1 times"
|
127
|
+
end
|
128
|
+
end
|
129
|
+
|
130
|
+
specify "should raise when told to" do
|
131
|
+
@mock.should_receive(:something).and_raise(RuntimeError)
|
132
|
+
lambda do
|
133
|
+
@mock.something
|
134
|
+
end.should_raise(RuntimeError)
|
135
|
+
end
|
136
|
+
|
137
|
+
specify "should raise passed an Exception instance" do
|
138
|
+
error = RuntimeError.new("error message")
|
139
|
+
@mock.should_receive(:something).and_raise(error)
|
140
|
+
begin
|
141
|
+
@mock.something
|
142
|
+
rescue RuntimeError => e
|
143
|
+
e.message.should_eql("error message")
|
144
|
+
end
|
145
|
+
end
|
146
|
+
|
147
|
+
specify "should raise RuntimeError with passed message" do
|
148
|
+
@mock.should_receive(:something).and_raise("error message")
|
149
|
+
begin
|
150
|
+
@mock.something
|
151
|
+
rescue RuntimeError => e
|
152
|
+
e.message.should_eql("error message")
|
153
|
+
end
|
154
|
+
end
|
155
|
+
|
156
|
+
specify "should not raise when told to if args dont match" do
|
157
|
+
@mock.should_receive(:something).with(2).and_raise(RuntimeError)
|
158
|
+
lambda do
|
159
|
+
@mock.something 1
|
160
|
+
end.should_raise(MockExpectationError)
|
161
|
+
end
|
162
|
+
|
163
|
+
specify "should throw when told to" do
|
164
|
+
@mock.should_receive(:something).and_throw(:blech)
|
165
|
+
lambda do
|
166
|
+
@mock.something
|
167
|
+
end.should_throw(:blech)
|
168
|
+
end
|
169
|
+
|
170
|
+
specify "should raise when explicit return and block constrained" do
|
171
|
+
lambda do
|
172
|
+
@mock.should_receive(:fruit) do |colour|
|
173
|
+
:strawberry
|
174
|
+
end.and_return :apple
|
175
|
+
end.should_raise(AmbiguousReturnError)
|
176
|
+
end
|
177
|
+
|
178
|
+
specify "should ignore args on any args" do
|
179
|
+
@mock.should_receive(:something).at_least(:once).with(:any_args)
|
180
|
+
@mock.something
|
181
|
+
@mock.something 1
|
182
|
+
@mock.something "a", 2
|
183
|
+
@mock.something [], {}, "joe", 7
|
184
|
+
@mock.__verify
|
185
|
+
end
|
186
|
+
|
187
|
+
specify "should fail on no args if any args received" do
|
188
|
+
@mock.should_receive(:something).with(:no_args)
|
189
|
+
begin
|
190
|
+
@mock.something 1
|
191
|
+
rescue MockExpectationError => e
|
192
|
+
e.message.should_eql "Mock 'test mock' expected :something with (no args) but received it with (1)"
|
193
|
+
end
|
194
|
+
end
|
195
|
+
|
196
|
+
specify "should fail when args are expected but none are received" do
|
197
|
+
@mock.should_receive(:something).with(1)
|
198
|
+
begin
|
199
|
+
@mock.something
|
200
|
+
rescue MockExpectationError => e
|
201
|
+
e.message.should_eql "Mock 'test mock' expected :something with (1) but received it with (no args)"
|
202
|
+
end
|
203
|
+
end
|
204
|
+
|
205
|
+
specify "should yield 0 args to blocks that take a variable number of arguments" do
|
206
|
+
@mock.should_receive(:yield_back).with(:no_args).once.and_yield
|
207
|
+
a = nil
|
208
|
+
@mock.yield_back {|*a|}
|
209
|
+
a.should_eql []
|
210
|
+
@mock.__verify
|
211
|
+
end
|
212
|
+
|
213
|
+
specify "should yield one arg to blocks that take a variable number of arguments" do
|
214
|
+
@mock.should_receive(:yield_back).with(:no_args).once.and_yield(99)
|
215
|
+
a = nil
|
216
|
+
@mock.yield_back {|*a|}
|
217
|
+
a.should_eql [99]
|
218
|
+
@mock.__verify
|
219
|
+
end
|
220
|
+
|
221
|
+
specify "should yield many args to blocks that take a variable number of arguments" do
|
222
|
+
@mock.should_receive(:yield_back).with(:no_args).once.and_yield(99, 27, "go")
|
223
|
+
a = nil
|
224
|
+
@mock.yield_back {|*a|}
|
225
|
+
a.should_eql [99, 27, "go"]
|
226
|
+
@mock.__verify
|
227
|
+
end
|
228
|
+
|
229
|
+
specify "should yield single value" do
|
230
|
+
@mock.should_receive(:yield_back).with(:no_args).once.and_yield(99)
|
231
|
+
a = nil
|
232
|
+
@mock.yield_back {|a|}
|
233
|
+
a.should_eql 99
|
234
|
+
@mock.__verify
|
235
|
+
end
|
236
|
+
|
237
|
+
specify "should yield two values" do
|
238
|
+
@mock.should_receive(:yield_back).with(:no_args).once.and_yield('wha', 'zup')
|
239
|
+
a, b = nil
|
240
|
+
@mock.yield_back {|a,b|}
|
241
|
+
a.should_eql 'wha'
|
242
|
+
b.should_eql 'zup'
|
243
|
+
@mock.__verify
|
244
|
+
end
|
245
|
+
|
246
|
+
specify "should fail when calling yielding method with wrong arity" do
|
247
|
+
@mock.should_receive(:yield_back).with(:no_args).once.and_yield('wha', 'zup')
|
248
|
+
begin
|
249
|
+
@mock.yield_back {|a|}
|
250
|
+
rescue MockExpectationError => e
|
251
|
+
e.message.should_eql "Mock 'test mock' yielded |\"wha\", \"zup\"| to block with arity of 1"
|
252
|
+
end
|
253
|
+
end
|
254
|
+
|
255
|
+
specify "should fail when calling yielding method without block" do
|
256
|
+
@mock.should_receive(:yield_back).with(:no_args).once.and_yield('wha', 'zup')
|
257
|
+
begin
|
258
|
+
@mock.yield_back
|
259
|
+
rescue MockExpectationError => e
|
260
|
+
e.message.should_eql "Mock 'test mock' asked to yield |\"wha\", \"zup\"| but no block was passed"
|
261
|
+
end
|
262
|
+
end
|
263
|
+
|
264
|
+
specify "should be able to mock send" do
|
265
|
+
@mock.should_receive(:send).with(:any_args)
|
266
|
+
@mock.send 'hi'
|
267
|
+
@mock.__verify
|
268
|
+
end
|
269
|
+
|
270
|
+
specify "should be able to raise from method calling yielding mock" do
|
271
|
+
@mock.should_receive(:yield_me).and_yield 44
|
272
|
+
|
273
|
+
lambda do
|
274
|
+
@mock.yield_me do |x|
|
275
|
+
raise "Bang"
|
276
|
+
end
|
277
|
+
end.should_raise(StandardError)
|
278
|
+
|
279
|
+
@mock.__verify
|
280
|
+
end
|
281
|
+
|
282
|
+
specify "should clear expectations after verify" do
|
283
|
+
@mock.should_receive(:foobar)
|
284
|
+
@mock.foobar
|
285
|
+
@mock.__verify
|
286
|
+
begin
|
287
|
+
@mock.foobar
|
288
|
+
rescue MockExpectationError => e
|
289
|
+
e.message.should_eql "Mock 'test mock' received unexpected message :foobar with (no args)"
|
290
|
+
end
|
291
|
+
end
|
292
|
+
|
293
|
+
specify "should verify if auto verify is set to true" do
|
294
|
+
reporter = Spec::Mocks::Mock.new("reporter", :null_object => true)
|
295
|
+
reporter.should_receive(:spec_finished) do |name, error, location|
|
296
|
+
error.to_s.should_match /expected :abcde with \(any args\) once, but received it 0 times/
|
297
|
+
end
|
298
|
+
Runner::Specification.new("spec") do
|
299
|
+
mock = Spec::Mocks::Mock.new("mock", :auto_verify => true)
|
300
|
+
mock.should_receive(:abcde)
|
301
|
+
end.run(reporter, nil, nil, nil, nil)
|
302
|
+
reporter.__verify
|
303
|
+
end
|
304
|
+
|
305
|
+
specify "should verify if auto verify not set explicitly" do
|
306
|
+
reporter = Spec::Mocks::Mock.new("reporter", :null_object => true)
|
307
|
+
reporter.should_receive(:spec_finished) do |name, error, location|
|
308
|
+
error.to_s.should_match /expected :abcde with \(any args\) once, but received it 0 times/
|
309
|
+
end
|
310
|
+
Runner::Specification.new("spec") do
|
311
|
+
mock = Spec::Mocks::Mock.new("mock")
|
312
|
+
mock.should_receive(:abcde)
|
313
|
+
end.run(reporter, nil, nil, nil, nil)
|
314
|
+
reporter.__verify
|
315
|
+
end
|
316
|
+
|
317
|
+
specify "should not verify if auto verify is set to false" do
|
318
|
+
reporter = Spec::Mocks::Mock.new("reporter", :null_object => true)
|
319
|
+
reporter.should_receive(:spec_finished) do |name, error, location|
|
320
|
+
error.should_be_nil
|
321
|
+
end
|
322
|
+
Runner::Specification.new("spec") do
|
323
|
+
mock = Spec::Mocks::Mock.new("mock", :auto_verify => false)
|
324
|
+
mock.should_receive(:abcde)
|
325
|
+
end.run(reporter, nil, nil, nil, nil)
|
326
|
+
reporter.__verify
|
327
|
+
end
|
328
|
+
|
329
|
+
specify "should reset on __reset_mock_methods" do
|
330
|
+
mock = mock("this is a mock")
|
331
|
+
mock.should_receive(:blah)
|
332
|
+
mock.__reset_mock
|
333
|
+
end
|
334
|
+
|
335
|
+
end
|
336
|
+
|
337
|
+
context "a mock message receiving a block" do
|
338
|
+
setup do
|
339
|
+
@mock = mock("mock")
|
340
|
+
@calls = 0
|
341
|
+
end
|
342
|
+
|
343
|
+
def add_call
|
344
|
+
@calls = @calls + 1
|
345
|
+
end
|
346
|
+
|
347
|
+
specify "should call the block after #should_receive" do
|
348
|
+
@mock.should_receive(:foo) { add_call }
|
349
|
+
|
350
|
+
@mock.foo
|
351
|
+
|
352
|
+
@calls.should == 1
|
353
|
+
end
|
354
|
+
|
355
|
+
specify "should call the block after #once" do
|
356
|
+
@mock.should_receive(:foo).once { add_call }
|
357
|
+
|
358
|
+
@mock.foo
|
359
|
+
|
360
|
+
@calls.should == 1
|
361
|
+
end
|
362
|
+
|
363
|
+
specify "should call the block after #twice" do
|
364
|
+
@mock.should_receive(:foo).twice { add_call }
|
365
|
+
|
366
|
+
@mock.foo
|
367
|
+
@mock.foo
|
368
|
+
|
369
|
+
@calls.should == 2
|
370
|
+
end
|
371
|
+
|
372
|
+
specify "should call the block after #times" do
|
373
|
+
@mock.should_receive(:foo).exactly(10).times { add_call }
|
374
|
+
|
375
|
+
(1..10).each { @mock.foo }
|
376
|
+
|
377
|
+
@calls.should == 10
|
378
|
+
end
|
379
|
+
|
380
|
+
specify "should call the block after #any_number_of_times" do
|
381
|
+
@mock.should_receive(:foo).any_number_of_times { add_call }
|
382
|
+
|
383
|
+
(1..7).each { @mock.foo }
|
384
|
+
|
385
|
+
@calls.should == 7
|
386
|
+
end
|
387
|
+
|
388
|
+
specify "should call the block after #with" do
|
389
|
+
@mock.should_receive(:foo).with(:arg) { add_call }
|
390
|
+
|
391
|
+
@mock.foo(:arg)
|
392
|
+
|
393
|
+
@calls.should == 1
|
394
|
+
end
|
395
|
+
|
396
|
+
specify "should call the block after #ordered" do
|
397
|
+
@mock.should_receive(:foo).ordered { add_call }
|
398
|
+
@mock.should_receive(:bar).ordered { add_call }
|
399
|
+
|
400
|
+
@mock.foo
|
401
|
+
@mock.bar
|
402
|
+
|
403
|
+
@calls.should == 2
|
404
|
+
end
|
405
|
+
end
|
406
|
+
end
|
407
|
+
end
|
@@ -0,0 +1,113 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/../../spec_helper'
|
2
|
+
|
3
|
+
module Spec
|
4
|
+
module Mocks
|
5
|
+
context "a Mock expectation with multiple return values and no specified count" do
|
6
|
+
setup do
|
7
|
+
@mock = Mock.new("mock")
|
8
|
+
@return_values = ["1",2,Object.new]
|
9
|
+
@mock.should_receive(:message).and_return(@return_values[0],@return_values[1],@return_values[2])
|
10
|
+
end
|
11
|
+
|
12
|
+
specify "should return values in order to consecutive calls" do
|
13
|
+
@mock.message.should_eql @return_values[0]
|
14
|
+
@mock.message.should_eql @return_values[1]
|
15
|
+
@mock.message.should_eql @return_values[2]
|
16
|
+
@mock.__verify
|
17
|
+
end
|
18
|
+
|
19
|
+
specify "should complain when there are too few calls" do
|
20
|
+
third = Object.new
|
21
|
+
@mock.message.should_eql @return_values[0]
|
22
|
+
@mock.message.should_eql @return_values[1]
|
23
|
+
lambda { @mock.__verify }.should_raise MockExpectationError, "Mock 'mock' expected :message with (any args) 3 times, but received it twice"
|
24
|
+
end
|
25
|
+
|
26
|
+
specify "should complain when there are too many calls" do
|
27
|
+
third = Object.new
|
28
|
+
@mock.message.should_eql @return_values[0]
|
29
|
+
@mock.message.should_eql @return_values[1]
|
30
|
+
@mock.message.should_eql @return_values[2]
|
31
|
+
@mock.message.should_eql @return_values[2]
|
32
|
+
lambda { @mock.__verify }.should_raise MockExpectationError, "Mock 'mock' expected :message with (any args) 3 times, but received it 4 times"
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
context "a Mock expectation with multiple return values with a specified count equal to the number of values" do
|
37
|
+
setup do
|
38
|
+
@mock = Mock.new("mock")
|
39
|
+
@return_values = ["1",2,Object.new]
|
40
|
+
@mock.should_receive(:message).exactly(3).times.and_return(@return_values[0],@return_values[1],@return_values[2])
|
41
|
+
end
|
42
|
+
|
43
|
+
specify "should return values in order to consecutive calls" do
|
44
|
+
@mock.message.should_eql @return_values[0]
|
45
|
+
@mock.message.should_eql @return_values[1]
|
46
|
+
@mock.message.should_eql @return_values[2]
|
47
|
+
@mock.__verify
|
48
|
+
end
|
49
|
+
|
50
|
+
specify "should complain when there are too few calls" do
|
51
|
+
third = Object.new
|
52
|
+
@mock.message.should_eql @return_values[0]
|
53
|
+
@mock.message.should_eql @return_values[1]
|
54
|
+
lambda { @mock.__verify }.should_raise MockExpectationError, "Mock 'mock' expected :message with (any args) 3 times, but received it twice"
|
55
|
+
end
|
56
|
+
|
57
|
+
specify "should complain when there are too many calls" do
|
58
|
+
third = Object.new
|
59
|
+
@mock.message.should_eql @return_values[0]
|
60
|
+
@mock.message.should_eql @return_values[1]
|
61
|
+
@mock.message.should_eql @return_values[2]
|
62
|
+
@mock.message.should_eql @return_values[2]
|
63
|
+
lambda { @mock.__verify }.should_raise MockExpectationError, "Mock 'mock' expected :message with (any args) 3 times, but received it 4 times"
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
context "a Mock expectation with multiple return values specifying at_least less than the number of values" do
|
68
|
+
setup do
|
69
|
+
@mock = Mock.new("mock")
|
70
|
+
@mock.should_receive(:message).at_least(:twice).with(:no_args).and_return(11, 22)
|
71
|
+
end
|
72
|
+
|
73
|
+
specify "should use last return value for subsequent calls" do
|
74
|
+
@mock.message.should equal(11)
|
75
|
+
@mock.message.should equal(22)
|
76
|
+
@mock.message.should equal(22)
|
77
|
+
@mock.__verify
|
78
|
+
end
|
79
|
+
|
80
|
+
specify "should fail when called less than the specified number" do
|
81
|
+
@mock.message.should equal(11)
|
82
|
+
lambda { @mock.__verify }.should_raise MockExpectationError, "Mock 'mock' expected :message with (no args) twice, but received it once"
|
83
|
+
end
|
84
|
+
end
|
85
|
+
context "a Mock expectation with multiple return values with a specified count larger than the number of values" do
|
86
|
+
setup do
|
87
|
+
@mock = Mock.new("mock")
|
88
|
+
@mock.should_receive(:message).exactly(3).times.and_return(11, 22)
|
89
|
+
end
|
90
|
+
|
91
|
+
specify "should use last return value for subsequent calls" do
|
92
|
+
@mock.message.should equal(11)
|
93
|
+
@mock.message.should equal(22)
|
94
|
+
@mock.message.should equal(22)
|
95
|
+
@mock.__verify
|
96
|
+
end
|
97
|
+
|
98
|
+
specify "should fail when called less than the specified number" do
|
99
|
+
@mock.message.should equal(11)
|
100
|
+
lambda { @mock.__verify }.should_raise MockExpectationError, "Mock 'mock' expected :message with (any args) 3 times, but received it once"
|
101
|
+
end
|
102
|
+
|
103
|
+
specify "should fail when called greater than the specified number" do
|
104
|
+
@mock.message.should equal(11)
|
105
|
+
@mock.message.should equal(22)
|
106
|
+
@mock.message.should equal(22)
|
107
|
+
@mock.message.should equal(22)
|
108
|
+
lambda { @mock.__verify }.should_raise MockExpectationError, "Mock 'mock' expected :message with (any args) 3 times, but received it 4 times"
|
109
|
+
end
|
110
|
+
end
|
111
|
+
end
|
112
|
+
end
|
113
|
+
|