rspec 0.5.1 → 0.5.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (47) hide show
  1. data/CHANGES +9 -1
  2. data/README +1 -0
  3. data/Rakefile +14 -6
  4. data/doc/README +1 -1
  5. data/doc/reference/rspec reference.page +0 -0
  6. data/doc/src/community.page +0 -1
  7. data/doc/src/default.template +1 -3
  8. data/doc/src/documentation/api.page +36 -35
  9. data/doc/src/documentation/index.page +9 -4
  10. data/doc/src/documentation/meta.info +22 -0
  11. data/doc/src/documentation/mocks.page +68 -32
  12. data/doc/src/download.page +0 -1
  13. data/doc/src/examples.page +1 -2
  14. data/doc/src/index.page +0 -1
  15. data/doc/src/meta.info +23 -0
  16. data/doc/src/tools/index.page +139 -4
  17. data/doc/src/tools/meta.info +12 -0
  18. data/doc/src/tools/rails.page +0 -1
  19. data/doc/src/tools/rake.page +0 -1
  20. data/doc/src/tools/test2rspec.page +10 -3
  21. data/doc/src/why_rspec.page +0 -1
  22. data/examples/airport_spec.rb +14 -4
  23. data/examples/empty_stack_spec.rb +21 -0
  24. data/examples/stack_spec.rb +4 -1
  25. data/lib/spec.rb +2 -1
  26. data/lib/spec/api/helper/should_helper.rb +5 -4
  27. data/lib/spec/api/helper/should_negator.rb +2 -0
  28. data/lib/spec/api/mock.rb +4 -7
  29. data/lib/spec/runner/backtrace_tweaker.rb +3 -4
  30. data/lib/spec/runner/execution_context.rb +4 -0
  31. data/lib/spec/runner/kernel_ext.rb +1 -2
  32. data/lib/spec/runner/option_parser.rb +12 -7
  33. data/lib/spec/version.rb +10 -7
  34. data/test/spec/api/helper/raising_test.rb +12 -0
  35. data/test/spec/api/helper/should_satisfy_test.rb +8 -6
  36. data/test/spec/api/mock_arg_constraints_test.rb +1 -10
  37. data/test/spec/api/mock_test.rb +71 -2
  38. data/test/spec/runner/context_runner_test.rb +23 -0
  39. data/test/spec/runner/context_test.rb +41 -0
  40. data/test/spec/runner/execution_context_test.rb +7 -0
  41. data/test/spec/runner/kernel_ext_test.rb +14 -0
  42. data/test/spec/runner/option_parser_test.rb +17 -10
  43. metadata +8 -8
  44. data/doc/src/documentation/specs.page +0 -20
  45. data/doc/src/tools/rcov.page +0 -8
  46. data/doc/src/tools/spec_runner.page +0 -8
  47. data/doc/src/tools/specdoc.page +0 -8
data/CHANGES CHANGED
@@ -1,5 +1,12 @@
1
1
  = RSpec Changelog
2
2
 
3
+ == Version 0.5.2
4
+ This release has minor improvements to the commandline and fixes some gem warnings
5
+
6
+ * Readded README to avoid RDoc warnings [aslak_hellesoy]
7
+ * Added --version switch to commandline [aslak_hellesoy]
8
+ * More changes to the mock API [dastels], [dchelimsky]
9
+
3
10
  == Version 0.5.1
4
11
  This release is the first release of RSpec with a new website. It will look better soon.
5
12
 
@@ -7,7 +14,8 @@ This release is the first release of RSpec with a new website. It will look bett
7
14
  * Added website based on webgen [aslak_hellesoy]
8
15
  * Modified test task to use rcov [aslak_hellesoy]
9
16
  * Deleted unused code (thanks, rcov!) [aslak_hellesoy]
10
- * Various changes to the mock API [dastels]
17
+ * Various changes to the mock API [dastels], [dchelimsky]
18
+ * Various improvements to failure reporting [dchelimsky]
11
19
 
12
20
  == Version 0.5.0
13
21
 
data/README ADDED
@@ -0,0 +1 @@
1
+ See http://rspec.rubyforge.org
data/Rakefile CHANGED
@@ -136,19 +136,27 @@ task :clobber do
136
136
  rm_rf 'doc/output'
137
137
  end
138
138
 
139
- task :release => [:clobber, :test, :verify_env_vars, :upload_releases, :publish_website, :publish_news]
139
+ task :release => [:clobber, :verify_user, :verify_password, :test, :upload_releases, :publish_website, :publish_news]
140
140
 
141
- task :rcov do
141
+ desc "Build the website with rdoc and rcov, but do not publish it"
142
+ task :website => [:clobber, :test, :doc, :rdoc, :rcov]
143
+
144
+ task :rcov => [:test] do
145
+ rm_rf 'doc/output/coverage'
146
+ mkdir 'doc/output' unless File.exists? 'doc/output'
142
147
  mv 'coverage', 'doc/output'
143
148
  end
144
149
 
145
- task :verify_env_vars do
150
+ task :verify_user do
146
151
  raise "RUBYFORGE_USER environment variable not set!" unless ENV['RUBYFORGE_USER']
152
+ end
153
+
154
+ task :verify_password do
147
155
  raise "RUBYFORGE_PASSWORD environment variable not set!" unless ENV['RUBYFORGE_PASSWORD']
148
156
  end
149
157
 
150
158
  desc "Upload Website to RubyForge"
151
- task :publish_website => [:doc, :rdoc, :rcov] do
159
+ task :publish_website => [:verify_user, :website] do
152
160
  publisher = Rake::SshDirPublisher.new(
153
161
  "#{ENV['RUBYFORGE_USER']}@rubyforge.org",
154
162
  "/var/www/gforge-projects/#{PKG_NAME}",
@@ -159,7 +167,7 @@ task :publish_website => [:doc, :rdoc, :rcov] do
159
167
  end
160
168
 
161
169
  desc "Release gem to RubyForge. You must make sure lib/version.rb is aligned with the CHANGELOG file"
162
- task :upload_releases => :package do
170
+ task :upload_releases => [:verify_user, :verify_password, :package] do
163
171
 
164
172
  release_files = FileList[
165
173
  "pkg/#{PKG_FILE_NAME}.gem",
@@ -177,7 +185,7 @@ task :upload_releases => :package do
177
185
  end
178
186
 
179
187
  desc "Publish news on RubyForge"
180
- task :publish_news do
188
+ task :publish_news => [:verify_user, :verify_password] do
181
189
  Rake::XForge::NewsPublisher.new(MetaProject::Project::XForge::RubyForge.new(PKG_NAME)) do |news|
182
190
  # Never hardcode user name and password in the Rakefile!
183
191
  news.user_name = ENV['RUBYFORGE_USER']
data/doc/README CHANGED
@@ -2,4 +2,4 @@ The website can be generated with
2
2
  webgen
3
3
  (Install the following gems: webgen, redcloth, bluecloth)
4
4
 
5
- TODO: write rake task that will generate website, put rdoc underneath it and upload everyhing.
5
+ TODO: write rake task that will generate website, put rdoc underneath it and upload everything.
@@ -1,7 +1,6 @@
1
1
  ---
2
2
  title: Community
3
3
  inMenu: true
4
- ordering: 5
5
4
  ---
6
5
  h2. Community
7
6
 
@@ -16,9 +16,7 @@
16
16
 
17
17
  <div id="navigation">
18
18
  <!-- Not sure how to get this in the menu -->
19
- <a href="rdoc/index.html">RDoc</a>
20
- <a href="coverage/index.html">RCov</a>
21
- {menu: }
19
+ {menu: {menuStyle: horizontal}}
22
20
  </div>
23
21
 
24
22
  <div id="content">
@@ -9,7 +9,7 @@ When RSpec executes specifications, it defines a method *should* on every object
9
9
  This *should* method is your entry to the magic of RSpec.
10
10
 
11
11
  Almost all expectation forms have a corresponding negated form. It is listed
12
- when it is supported and is met when ever the non negated form would be
12
+ when it is supported and, in general, is met when ever the non negated form would be
13
13
  violated.
14
14
 
15
15
  h3. General
@@ -23,9 +23,9 @@ target.should.not.satisfy {|arg| ...}
23
23
  </code>
24
24
  </pre>
25
25
 
26
- The supplied block is evaluated, passing target as the sole argument. If the
27
- block evaluates to false in the case of should.satisfy, or true in the case of
28
- should.not.satisfy, ExpectationNotMetError is raised.
26
+ The supplied block is evaluated, passing <code>target</code> as the sole argument. If the
27
+ block evaluates to <code>false</code> in the case of <code>should.satisfy</code>, or <code>true</code> in the case of
28
+ <code>should.not.satisfy</code>, <code>ExpectationNotMetError</code> is raised.
29
29
 
30
30
  <pre>
31
31
  <code>
@@ -34,6 +34,7 @@ target.should.satisfy {|arg| arg > 0}
34
34
  </pre>
35
35
 
36
36
  h4. Equality
37
+
37
38
  <pre>
38
39
  <code>
39
40
  target.should.equal <value>
@@ -41,8 +42,8 @@ target.should.not.equal <value>
41
42
  </code>
42
43
  </pre>
43
44
 
44
- The target object is compared to <value> using ==. If the result is false (or
45
- true for the negated form) ExpectationNotMetError is raised.
45
+ The target object is compared to <code>value</code> using ==. If the result is <code>false</code> (or
46
+ <code>true</code> for the negated form) <code>ExpectationNotMetError</code> is raised.
46
47
 
47
48
  h4. Floating Point Comparison
48
49
 
@@ -53,9 +54,9 @@ target.should.not.be.close <value>, <tolerance>
53
54
  </code>
54
55
  </pre>
55
56
 
56
- The target object is compared to <value>. In the former case, if they differ
57
- by more that <tolerance> ExpectationNotMetError is raised. In the latter case,
58
- it is raised if they differ by less than <tolerance>.
57
+ The target object is compared to <code>value</code>. In the former case, if they differ
58
+ by more that <code>tolerance</code> <code>ExpectationNotMetError</code> is raised. In the latter case,
59
+ it is raised if they differ by less than <code>tolerance</code>.
59
60
 
60
61
  <pre>
61
62
  <code>
@@ -72,8 +73,8 @@ target.should.not.be <value>
72
73
  </code>
73
74
  </pre>
74
75
 
75
- The target object is compared to <value> using equal?. If the result is false
76
- (or true for the negated form) ExpectationNotMetError is raised.
76
+ The target object is compared to <code>value</code> using <code>equal?</code>. If the result is <code>false</code>
77
+ (or <code>true</code> for the negated form) <code>ExpectationNotMetError</code> is raised.
77
78
 
78
79
  h4. Arbitrary Predicate
79
80
 
@@ -87,14 +88,14 @@ target.should.not.be.predicate [optional args]
87
88
  </code>
88
89
  </pre>
89
90
 
90
- The message predicate? is sent to target with any supplied arguments. If the
91
- result is false (or true for the negated form) ExpectationNotMetError is
91
+ The message <code>predicate?</code> is sent to <code>target</code> with any supplied arguments. If the
92
+ result is <code>false</code> (or <code>true</code> for the negated form) <code>ExpectationNotMetError</code> is
92
93
  raised.
93
94
 
94
95
  <pre>
95
96
  <code>
96
- container.should.include 'a' uses container.include? 'a'
97
- container.should.be.empty uses container.empty?
97
+ container.should.include 'a' => container.include? 'a'
98
+ container.should.be.empty => container.empty?
98
99
  </code>
99
100
  </pre>
100
101
 
@@ -107,7 +108,7 @@ target.should.not.match <regex>
107
108
  </code>
108
109
  </pre>
109
110
 
110
- The target is matched against <regex>. An ExpectationNotMetError is raised if
111
+ The <code>target</code> is matched against <code>regex</code>. An <code>ExpectationNotMetError</code> is raised if
111
112
  the match fails or succeeds, respectively.
112
113
 
113
114
  h3. Class/Type
@@ -121,9 +122,9 @@ target.should.not.be.an.instance.of <class>
121
122
  </code>
122
123
  </pre>
123
124
 
124
- An ExpectationNotMetError is raised if target is not or is, respectively, an
125
- direct instance of <class>. As expected this correlates to target.instance_of?
126
- <class>.
125
+ An <code>ExpectationNotMetError</code> is raised if <code>target</code> is not or is, respectively, an
126
+ direct instance of <code>class</code>. As expected this correlates to <code>target.instance_of?
127
+ class</code>.
127
128
 
128
129
  h4. Ancestor Class
129
130
 
@@ -134,8 +135,8 @@ target.should.not.be.a.kind.of <class>
134
135
  </code>
135
136
  </pre>
136
137
 
137
- As above, but uses target.kind_of? <class>: checking whether <class> is the
138
- direct class of target, or an ancestor of target's class.
138
+ As above, but uses <code>target.kind_of? class</code>: checking whether <code>class</code> is the
139
+ direct class of <code>target</code>, or an ancestor of <code>target</code>'s class.
139
140
 
140
141
  h4. Type
141
142
 
@@ -146,8 +147,8 @@ target.should.not.respond.to <symbol>
146
147
  </code>
147
148
  </pre>
148
149
 
149
- Uses target.respond_to? <symbol> to check whether <symbol> is the name of a
150
- message that target understands.
150
+ Uses <code>target.respond_to? symbol?</code> to check whether <code>symbol</code> is the name of a
151
+ message that <code>target</code> understands.
151
152
 
152
153
  h3. Procs
153
154
 
@@ -160,8 +161,8 @@ proc.should.not.raise <exception>
160
161
  </code>
161
162
  </pre>
162
163
 
163
- Checks that proc does or doesn't cause the named exception to be raised.
164
- Typically the proc is created in place using lambda. For example:
164
+ Checks that <code>proc</code> does or doesn't cause the named exception to be raised.
165
+ Typically the <code>proc</code> is created in place using <code>lambda</code>. For example:
165
166
 
166
167
  <pre>
167
168
  <code>
@@ -190,7 +191,7 @@ proc.should.not.throw <symbol>
190
191
  </code>
191
192
  </pre>
192
193
 
193
- Similar to the above, but checks that <symbol> is thrown from within proc, or
194
+ Similar to the above, but checks that <code>symbol</code> is thrown from within <code>proc</code>, or
194
195
  that it is not. The latter is actually one of two cases: some other symbol is
195
196
  thrown, or no symbol is thrown.
196
197
 
@@ -200,7 +201,7 @@ proc.should.not.throw
200
201
  </code>
201
202
  </pre>
202
203
 
203
- This form is more specific. It checks that no symbol is thrown from within proc.
204
+ This form is more specific. It checks that no symbol is thrown from within <code>proc</code>.
204
205
 
205
206
  h3. Collections
206
207
 
@@ -213,14 +214,14 @@ target.should.include <object>
213
214
  </pre>
214
215
 
215
216
  This is simply a specific case of the arbitrary predicate form. It uses
216
- target.include? <object> and raises an ExpectationNotMetError if that returns
217
+ <code>target.include? object</code> and raises an <code>ExpectationNotMetError</code> if that returns
217
218
  false. The remaining collection forms are a little more involved. They rely on
218
- two things: target responds to the message <things> by returning an object
219
- that responds to either length or size, which return a number that is a
220
- measure of size. Currently length is used if is appropriate, otherwise size is
219
+ two things: <code>target</code> responds to the message <code>things</code> by returning an object
220
+ that responds to either <code>length</code> or <code>size</code>, which return a number that is a
221
+ measure of size. Currently <code>length</code> is used if is appropriate, otherwise <code>size</code> is
221
222
  attempted.
222
223
 
223
- 4. Exact Size
224
+ h4. Exact Size
224
225
 
225
226
  <pre>
226
227
  <code>
@@ -228,7 +229,7 @@ target.should.have(<number>).<things>
228
229
  </code>
229
230
  </pre>
230
231
 
231
- The <things> of target has a length/size of exactly <number>.
232
+ The <code>things</code> of <code>target</code> has a length/size of exactly <code>number</code>.
232
233
 
233
234
  h4. Lower Bound
234
235
 
@@ -238,7 +239,7 @@ target.should.have.at.least(<number>).<things>
238
239
  </code>
239
240
  </pre>
240
241
 
241
- The <things> of target has a length/size of no less than <number>.
242
+ The <code>things</code> of <code>target</code> has a length/size of no less than <code>number</code>.
242
243
 
243
244
  h4. Upper Bound
244
245
 
@@ -248,4 +249,4 @@ target.should.have.at.most(<number>).<things>
248
249
  </code>
249
250
  </pre>
250
251
 
251
- The <things> of target has a length/size of no more than <number>.
252
+ The <code>things</code> of <code>target</code> has a length/size of no more than <code>number</code>.
@@ -1,8 +1,13 @@
1
1
  ---
2
- title: Documentation
2
+ title: Writing Specifications
3
3
  inMenu: true
4
- ordering: 1
5
4
  ---
6
- h2. Documentation
5
+ h2. Writing Specifications
7
6
 
8
- Here is all the doco
7
+ An RSpec specification is a Ruby file with a context and one or more specifications. Example:
8
+
9
+ {ruby_inline: {filename: ../examples/empty_stack_spec.rb}}
10
+
11
+ A context represents a collection of specifications and must be defined with a name and a block (do-end).
12
+ A specification is defined with the *specify* keyword and a sentence describing what's being specified.
13
+ It is highly recommended to include
@@ -0,0 +1,22 @@
1
+ index.page:
2
+ orderInfo: 10
3
+
4
+ api.page:
5
+ orderInfo: 11
6
+
7
+ mocks.page:
8
+ orderInfo: 12
9
+
10
+ rdoc.html:
11
+ title: RDoc
12
+ dest: ../rdoc/index.html
13
+ inMenu: true
14
+ orderInfo: 13
15
+
16
+ rcov.html:
17
+ title: RCov
18
+ dest: ../coverage/index.html
19
+ inMenu: true
20
+ orderInfo: 14
21
+
22
+
@@ -1,7 +1,6 @@
1
1
  ---
2
2
  title: Mock API
3
3
  inMenu: true
4
- ordering: 5
5
4
  ---
6
5
  h2. Mock API
7
6
 
@@ -25,8 +24,8 @@ mock(<name>, <options>)
25
24
  </pre>
26
25
 
27
26
  As above, but allows you to specific options to tweak the mock's behaviour.
28
- The <options> argument is a hash. Currently the only supported option is
29
- :null_object. Setting this to true (i.e. :null_object => true) instructs the
27
+ The <code>options</code> argument is a hash. Currently the only supported option is
28
+ <code>:null_object</code>. Setting this to true (i.e. <code>:null_object => true</code>) instructs the
30
29
  mock to ignore (quietly consume) any messages it hasn't been told to expect.
31
30
 
32
31
  h3. Expecting Messages
@@ -37,7 +36,7 @@ mock.should.receive(<message>)
37
36
  </code>
38
37
  </pre>
39
38
 
40
- The <message> argument is a symbol that is the name of a message that you want
39
+ The <code>message</code> argument is a symbol that is the name of a message that you want
41
40
  the mock to be expecting.
42
41
 
43
42
  h3. Arbitrary Message Receive Handling
@@ -63,12 +62,12 @@ mock.should.receive(:msg).with(1, 2, 3)
63
62
  </code>
64
63
  </pre>
65
64
 
66
- The <args> argument is a series of arguments (e..g. 1, 2, 3) that are expected
65
+ The <code>args</code> argument is a series of arguments (e..g. 1, 2, 3) that are expected
67
66
  to be passed as arguments to the associated message.
68
67
 
69
68
  <pre>
70
69
  <code>
71
- mock.should.receive(:msg).with(:nothing)
70
+ mock.should.receive(:msg).with(:no_args)
72
71
  </code>
73
72
  </pre>
74
73
 
@@ -76,32 +75,63 @@ No arguments are to be accepted by the message.
76
75
 
77
76
  <pre>
78
77
  <code>
79
- mock.should.receive(:msg).with(:anything)
78
+ mock.should.receive(:msg).with(:any_args)
80
79
  </code>
81
80
  </pre>
82
81
 
83
- Any arguments are to be accepted by the message. Additionally, constraints can
84
- be placed on individual arguments which are looser than value equivalence.
82
+ Any arguments are to be accepted by the message. This includes cases where no
83
+ arguments are provided. *This is the default when no <code>with()</code> clause is
84
+ specified.* Even so, sometimes you want to be explicit about it.
85
+
86
+ h3. Argument Constraints
87
+
88
+ Constraints can be placed on individual arguments which are looser than value equivalence.
89
+
90
+ h4. :anything
91
+
92
+ accepts any value for this argument
85
93
 
86
94
  <pre>
87
95
  <code>
88
- :anything
96
+ mock.should.receive(:msg).with(1, :anything, "A")
89
97
  </code>
90
98
  </pre>
91
99
 
92
- accepts any value for this argument
100
+ h4. :numeric
101
+
102
+ accepts any numeric value for this argument
93
103
 
94
104
  <pre>
95
105
  <code>
96
- mock.should.receive(:msg).with(1, :anything, "A")
106
+ mock.should.receive(:msg).with(a, :numeric, "b")
107
+ </code>
108
+ </pre>
109
+
110
+ h4. :boolean
111
+
112
+ accepts a boolean value for this argument
113
+
114
+ <pre>
115
+ <code>
116
+ mock.should.receive(:msg).with(a, :boolean, "b")
97
117
  </code>
98
118
  </pre>
99
119
 
120
+ h4. :string
121
+
122
+ accepts any string for this argument
123
+
124
+ <pre>
125
+ <code>
126
+ mock.should.receive(:msg).with(a, :string, "b")
127
+ </code>
128
+ </pre>
129
+
100
130
  h3. Receive Counts
101
131
 
102
132
  <pre>
103
133
  <code>
104
- mock.should.receive(:msg).with(:nothing).never
134
+ mock.should.receive(:msg).never
105
135
  </code>
106
136
  </pre>
107
137
 
@@ -109,7 +139,7 @@ A problem is reported if the message is ever received.
109
139
 
110
140
  <pre>
111
141
  <code>
112
- mock.should.receive(:msg).with(:nothing).any.number.of.times
142
+ mock.should.receive(:msg).any.number.of.times
113
143
  </code>
114
144
  </pre>
115
145
 
@@ -117,7 +147,7 @@ The message can be received 0 or more times.
117
147
 
118
148
  <pre>
119
149
  <code>
120
- mock.should.receive(:msg).with(:nothing).once
150
+ mock.should.receive(:msg).once
121
151
  </code>
122
152
  </pre>
123
153
 
@@ -126,7 +156,7 @@ than once.
126
156
 
127
157
  <pre>
128
158
  <code>
129
- mock.should.receive(:msg).with(:nothing).twice
159
+ mock.should.receive(:msg).twice
130
160
  </code>
131
161
  </pre>
132
162
 
@@ -134,7 +164,7 @@ A problem is reported is the message is received anything but two times.
134
164
 
135
165
  <pre>
136
166
  <code>
137
- mock.should.receive(:msg).with(:nothing).exactly(n).times
167
+ mock.should.receive(:msg).exactly(n).times
138
168
  </code>
139
169
  </pre>
140
170
 
@@ -142,7 +172,7 @@ A problem is reported is the message is received anything but n times.
142
172
 
143
173
  <pre>
144
174
  <code>
145
- mock.should.receive(:msg).with(:nothing).at.least(:once)
175
+ mock.should.receive(:msg).at.least(:once)
146
176
  </code>
147
177
  </pre>
148
178
 
@@ -150,7 +180,7 @@ A problem is reported if the message is never received.
150
180
 
151
181
  <pre>
152
182
  <code>
153
- mock.should.receive(:msg).with(:nothing).at.least(:twice)
183
+ mock.should.receive(:msg).at.least(:twice)
154
184
  </code>
155
185
  </pre>
156
186
 
@@ -158,7 +188,7 @@ A problem is reported is the message is never received or is received only once.
158
188
 
159
189
  <pre>
160
190
  <code>
161
- mock.should.receive(:msg).with(:nothing).at.least(n).times
191
+ mock.should.receive(:msg).at.least(n).times
162
192
  </code>
163
193
  </pre>
164
194
 
@@ -168,40 +198,46 @@ h3. Return Values
168
198
 
169
199
  <pre>
170
200
  <code>
171
- mock.should.receive(:msg).with(:nothing).once.and.return(<value>)
201
+ mock.should.receive(:msg).once.and.return(<value>)
172
202
  </code>
173
203
  </pre>
174
204
 
175
- When the expected message is received, <value> will be returned as the result.
205
+ When the expected message is received, <code>value</code> will be returned as the result.
176
206
 
177
207
  <pre>
178
208
  <code>
179
- and.return([<value1>, <value2>, …, <valuen>])
180
- mock.should.receive(:msg).with(:nothing).once.and.return(1, 2, 3)
209
+ and.return([<value-1>, <value-2>, ..., <value-n>])
181
210
  </code>
182
211
  </pre>
183
212
 
184
- When the expected message is received, <valuei> will be returned as the result
185
- for the ith reception of the message. Once i > n, <valuen> is returned for all
213
+ When the expected message is received, <code>value-i</code> will be returned as the result
214
+ for the ith reception of the message. Once i > n, <code>value-n</code> is returned for all
186
215
  subsequent receives of the message.
187
216
 
188
217
  <pre>
189
218
  <code>
190
- mock.should.receive(:msg).with(:nothing).once.and.return {}
191
- mock.should.receive(:msg).with(:anything).once.and.return {|a, b| a + b}
219
+ mock.should.receive(:msg).once.and.return {...}
192
220
  </code>
193
221
  </pre>
194
222
 
195
223
  When the expected message is received, the result of evaluating the supplied
196
224
  block will be returned as the result. The block is passed any arguments passed
197
225
  as parts of the message. This capability can be used to compute return values
198
- based on the arguments.
226
+ based on the arguments. For example:
227
+
228
+ <pre>
229
+ <code>
230
+ mock.should.receive(:msg).once.and.return {|a, b| a + b}
231
+ </code>
232
+ </pre>
233
+
234
+ h3. Raising and Throwing
199
235
 
200
236
  <pre>
201
237
  <code>
202
- mock.should.receive(:msg).with(:anything).once.and.throw(<symbol>)
203
- mock.should.receive(:msg).with(:anything).once.and.raise(<exception>)
238
+ mock.should.receive(:msg).once.and.raise(<exception>)
239
+ mock.should.receive(:msg).once.and.throw(<symbol>)
204
240
  </code>
205
241
  </pre>
206
242
 
207
- These instruct the mock to raise an exception or throw a symbol instead of returning a value.on other objects.
243
+ These instruct the mock to raise an exception or throw a symbol instead of returning a value.