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.
Files changed (194) hide show
  1. data/CHANGES +60 -1
  2. data/EXAMPLES.rd +38 -19
  3. data/MIT-LICENSE +1 -1
  4. data/README +24 -17
  5. data/RELEASE-PLAN +117 -0
  6. data/Rakefile +24 -18
  7. data/TODO.0.8.0 +5 -0
  8. data/examples/auto_spec_name_generation_example.rb +18 -0
  9. data/examples/custom_expectation_matchers.rb +53 -0
  10. data/examples/dynamic_spec.rb +9 -0
  11. data/examples/io_processor_spec.rb +2 -2
  12. data/examples/mocking_example.rb +4 -4
  13. data/examples/partial_mock_example.rb +2 -2
  14. data/examples/predicate_example.rb +2 -2
  15. data/examples/stack_spec.rb +32 -36
  16. data/examples/stubbing_example.rb +19 -19
  17. data/examples/test_case_spec.rb +6 -6
  18. data/lib/spec.rb +3 -0
  19. data/lib/spec/callback.rb +8 -0
  20. data/lib/spec/callback/extensions/object.rb +4 -0
  21. data/lib/spec/deprecated.rb +3 -0
  22. data/lib/spec/expectations.rb +44 -17
  23. data/lib/spec/expectations/extensions.rb +1 -2
  24. data/lib/spec/expectations/extensions/object.rb +78 -130
  25. data/lib/spec/expectations/extensions/string_and_symbol.rb +17 -0
  26. data/lib/spec/expectations/handler.rb +47 -0
  27. data/lib/spec/expectations/should/base.rb +32 -29
  28. data/lib/spec/expectations/should/change.rb +1 -1
  29. data/lib/spec/expectations/should/have.rb +9 -17
  30. data/lib/spec/expectations/should/not.rb +54 -56
  31. data/lib/spec/expectations/should/should.rb +59 -65
  32. data/lib/spec/expectations/sugar.rb +27 -4
  33. data/lib/spec/matchers.rb +160 -0
  34. data/lib/spec/matchers/be.rb +161 -0
  35. data/lib/spec/matchers/be_close.rb +37 -0
  36. data/lib/spec/matchers/change.rb +120 -0
  37. data/lib/spec/matchers/eql.rb +43 -0
  38. data/lib/spec/matchers/equal.rb +43 -0
  39. data/lib/spec/matchers/has.rb +44 -0
  40. data/lib/spec/matchers/have.rb +140 -0
  41. data/lib/spec/matchers/include.rb +50 -0
  42. data/lib/spec/matchers/match.rb +41 -0
  43. data/lib/spec/matchers/raise_error.rb +100 -0
  44. data/lib/spec/matchers/respond_to.rb +35 -0
  45. data/lib/spec/matchers/satisfy.rb +47 -0
  46. data/lib/spec/matchers/throw_symbol.rb +75 -0
  47. data/lib/spec/mocks.rb +224 -1
  48. data/lib/spec/mocks/argument_expectation.rb +16 -2
  49. data/lib/spec/mocks/error_generator.rb +5 -3
  50. data/lib/spec/mocks/errors.rb +2 -2
  51. data/lib/spec/mocks/extensions/object.rb +1 -1
  52. data/lib/spec/mocks/message_expectation.rb +29 -19
  53. data/lib/spec/mocks/{mock_methods.rb → methods.rb} +5 -5
  54. data/lib/spec/mocks/mock.rb +2 -2
  55. data/lib/spec/mocks/mock_handler.rb +81 -68
  56. data/lib/spec/rake/spectask.rb +7 -12
  57. data/lib/spec/rake/verify_rcov.rb +1 -1
  58. data/lib/spec/runner.rb +117 -0
  59. data/lib/spec/runner/command_line.rb +8 -5
  60. data/lib/spec/runner/context.rb +13 -37
  61. data/lib/spec/runner/context_eval.rb +4 -3
  62. data/lib/spec/runner/context_runner.rb +7 -4
  63. data/lib/spec/runner/drb_command_line.rb +1 -1
  64. data/lib/spec/runner/execution_context.rb +3 -11
  65. data/lib/spec/runner/extensions/kernel.rb +7 -5
  66. data/lib/spec/runner/extensions/object.rb +4 -1
  67. data/lib/spec/runner/formatter/base_text_formatter.rb +11 -3
  68. data/lib/spec/runner/formatter/html_formatter.rb +21 -10
  69. data/lib/spec/runner/heckle_runner.rb +24 -8
  70. data/lib/spec/runner/heckle_runner_win.rb +10 -0
  71. data/lib/spec/runner/option_parser.rb +58 -13
  72. data/lib/spec/runner/spec_matcher.rb +22 -29
  73. data/lib/spec/runner/spec_parser.rb +1 -0
  74. data/lib/spec/runner/specification.rb +36 -22
  75. data/lib/spec/translator.rb +87 -0
  76. data/lib/spec/version.rb +16 -7
  77. data/spec/spec/callback/callback_container_spec.rb +27 -0
  78. data/spec/spec/callback/module_spec.rb +37 -0
  79. data/spec/spec/callback/object_spec.rb +90 -0
  80. data/spec/spec/callback/object_with_class_callback_spec.rb +19 -0
  81. data/spec/spec/expectations/differs/default_spec.rb +107 -0
  82. data/spec/spec/expectations/extensions/object_spec.rb +46 -0
  83. data/spec/spec/expectations/fail_with_spec.rb +71 -0
  84. data/spec/spec/expectations/should/should_==_spec.rb +19 -0
  85. data/spec/spec/expectations/should/should_=~_spec.rb +13 -0
  86. data/spec/spec/expectations/should/should_be_a_kind_of_spec.rb +21 -0
  87. data/spec/spec/expectations/should/should_be_an_instance_of_spec.rb +30 -0
  88. data/spec/spec/expectations/should/should_be_arbitrary_predicate_spec.rb +81 -0
  89. data/spec/spec/expectations/should/should_be_close_spec.rb +18 -0
  90. data/spec/spec/expectations/should/should_be_comparison_operator_spec.rb +44 -0
  91. data/spec/spec/expectations/should/should_be_false_spec.rb +39 -0
  92. data/spec/spec/expectations/should/should_be_spec.rb +11 -0
  93. data/spec/spec/expectations/should/should_be_true_spec.rb +27 -0
  94. data/spec/spec/expectations/should/should_change_spec.rb +184 -0
  95. data/spec/spec/expectations/should/should_eql_spec.rb +11 -0
  96. data/spec/spec/expectations/should/should_equal_spec.rb +11 -0
  97. data/spec/spec/expectations/should/should_have_at_least_spec.rb +53 -0
  98. data/spec/spec/expectations/should/should_have_at_most_spec.rb +45 -0
  99. data/spec/spec/expectations/should/should_have_key_spec.rb +21 -0
  100. data/spec/spec/expectations/should/should_have_spec.rb +64 -0
  101. data/spec/spec/expectations/should/should_include_spec.rb +59 -0
  102. data/spec/spec/expectations/should/should_match_spec.rb +25 -0
  103. data/spec/spec/expectations/should/should_not_==_spec.rb +15 -0
  104. data/spec/spec/expectations/should/should_not_be_a_kind_of_spec.rb +21 -0
  105. data/spec/spec/expectations/should/should_not_be_an_instance_of_spec.rb +11 -0
  106. data/spec/spec/expectations/should/should_not_be_arbitrary_predicate_spec.rb +68 -0
  107. data/spec/spec/expectations/should/should_not_be_spec.rb +11 -0
  108. data/spec/spec/expectations/should/should_not_change_spec.rb +24 -0
  109. data/spec/spec/expectations/should/should_not_eql_spec.rb +11 -0
  110. data/spec/spec/expectations/should/should_not_equal_spec.rb +11 -0
  111. data/spec/spec/expectations/should/should_not_have_key_spec.rb +15 -0
  112. data/spec/spec/expectations/should/should_not_include_spec.rb +58 -0
  113. data/spec/spec/expectations/should/should_not_match_spec.rb +11 -0
  114. data/spec/spec/expectations/should/should_not_raise_spec.rb +75 -0
  115. data/spec/spec/expectations/should/should_not_respond_to_spec.rb +15 -0
  116. data/spec/spec/expectations/should/should_not_throw_spec.rb +35 -0
  117. data/spec/spec/expectations/should/should_raise_spec.rb +66 -0
  118. data/spec/spec/expectations/should/should_respond_to_spec.rb +15 -0
  119. data/spec/spec/expectations/should/should_satisfy_spec.rb +35 -0
  120. data/spec/spec/expectations/should/should_throw_spec.rb +27 -0
  121. data/spec/spec/matchers/be_close_spec.rb +33 -0
  122. data/spec/spec/matchers/be_spec.rb +182 -0
  123. data/spec/spec/matchers/change_spec.rb +232 -0
  124. data/spec/spec/matchers/description_generation_spec.rb +147 -0
  125. data/spec/spec/matchers/eql_spec.rb +41 -0
  126. data/spec/spec/matchers/equal_spec.rb +41 -0
  127. data/spec/spec/matchers/handler_spec.rb +75 -0
  128. data/spec/spec/matchers/has_spec.rb +37 -0
  129. data/spec/spec/matchers/have_spec.rb +259 -0
  130. data/spec/spec/matchers/include_spec.rb +33 -0
  131. data/spec/spec/matchers/match_spec.rb +37 -0
  132. data/spec/spec/matchers/matcher_methods_spec.rb +85 -0
  133. data/spec/spec/matchers/raise_error_spec.rb +147 -0
  134. data/spec/spec/matchers/respond_to_spec.rb +30 -0
  135. data/spec/spec/matchers/satisfy_spec.rb +36 -0
  136. data/spec/spec/matchers/throw_symbol_spec.rb +59 -0
  137. data/spec/spec/mocks/any_number_of_times_spec.rb +34 -0
  138. data/spec/spec/mocks/at_least_spec.rb +97 -0
  139. data/spec/spec/mocks/at_most_spec.rb +97 -0
  140. data/spec/spec/mocks/bug_report_7611_spec.rb +19 -0
  141. data/spec/spec/mocks/bug_report_7805_spec.rb +22 -0
  142. data/spec/spec/mocks/bug_report_8165_spec.rb +31 -0
  143. data/spec/spec/mocks/bug_report_8302_spec.rb +26 -0
  144. data/spec/spec/mocks/failing_mock_argument_constraints_spec.rb +74 -0
  145. data/spec/spec/mocks/mock_ordering_spec.rb +80 -0
  146. data/spec/spec/mocks/mock_spec.rb +407 -0
  147. data/spec/spec/mocks/multiple_return_value_spec.rb +113 -0
  148. data/spec/spec/mocks/null_object_mock_spec.rb +40 -0
  149. data/spec/spec/mocks/once_counts_spec.rb +56 -0
  150. data/spec/spec/mocks/options_hash_spec.rb +31 -0
  151. data/spec/spec/mocks/partial_mock_spec.rb +52 -0
  152. data/spec/spec/mocks/partial_mock_using_mocks_directly_spec.rb +64 -0
  153. data/spec/spec/mocks/passing_mock_argument_constraints_spec.rb +92 -0
  154. data/spec/spec/mocks/precise_counts_spec.rb +56 -0
  155. data/spec/spec/mocks/record_messages_spec.rb +26 -0
  156. data/spec/spec/mocks/stub_spec.rb +159 -0
  157. data/spec/spec/mocks/twice_counts_spec.rb +67 -0
  158. data/spec/spec/runner/command_line_spec.rb +32 -0
  159. data/spec/spec/runner/context_matching_spec.rb +28 -0
  160. data/spec/spec/runner/context_runner_spec.rb +100 -0
  161. data/spec/spec/runner/context_spec.rb +405 -0
  162. data/spec/spec/runner/drb_command_line_spec.rb +74 -0
  163. data/spec/spec/runner/execution_context_spec.rb +52 -0
  164. data/spec/spec/runner/formatter/html_formatter_spec.rb +40 -0
  165. data/spec/spec/runner/formatter/progress_bar_formatter_dry_run_spec.rb +21 -0
  166. data/spec/spec/runner/formatter/progress_bar_formatter_failure_dump_spec.rb +36 -0
  167. data/spec/spec/runner/formatter/progress_bar_formatter_spec.rb +78 -0
  168. data/spec/spec/runner/formatter/rdoc_formatter_dry_run_spec.rb +18 -0
  169. data/spec/spec/runner/formatter/rdoc_formatter_spec.rb +41 -0
  170. data/spec/spec/runner/formatter/specdoc_formatter_dry_run_spec.rb +21 -0
  171. data/spec/spec/runner/formatter/specdoc_formatter_spec.rb +46 -0
  172. data/spec/spec/runner/heckle_runner_spec.rb +63 -0
  173. data/spec/spec/runner/heckler_spec.rb +14 -0
  174. data/spec/spec/runner/kernel_ext_spec.rb +16 -0
  175. data/spec/spec/runner/noisy_backtrace_tweaker_spec.rb +45 -0
  176. data/spec/spec/runner/object_ext_spec.rb +11 -0
  177. data/spec/spec/runner/option_parser_spec.rb +269 -0
  178. data/spec/spec/runner/quiet_backtrace_tweaker_spec.rb +47 -0
  179. data/spec/spec/runner/reporter_spec.rb +126 -0
  180. data/spec/spec/runner/spec_matcher_spec.rb +107 -0
  181. data/spec/spec/runner/spec_name_generation_spec.rb +102 -0
  182. data/spec/spec/runner/spec_parser_spec.rb +37 -0
  183. data/spec/spec/runner/specification_class_spec.rb +72 -0
  184. data/spec/spec/runner/specification_instance_spec.rb +160 -0
  185. data/spec/spec/runner/specification_should_raise_spec.rb +136 -0
  186. data/spec/spec/spec_classes.rb +102 -0
  187. data/spec/spec/translator_spec.rb +79 -0
  188. data/spec/spec_helper.rb +35 -0
  189. metadata +141 -9
  190. data/bin/drbspec +0 -3
  191. data/lib/spec/expectations/diff.rb +0 -28
  192. data/lib/spec/expectations/extensions/numeric.rb +0 -19
  193. data/lib/spec/expectations/extensions/string.rb +0 -22
  194. 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
+