rspec 0.5.0 → 0.5.1
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 +9 -5
- data/Rakefile +35 -29
- data/bin/spec +0 -5
- data/doc/README +5 -0
- data/doc/config.yaml +2 -0
- data/doc/plugin/syntax.rb +38 -0
- data/doc/reference/rspec reference.page +0 -0
- data/doc/src/community.page +8 -0
- data/doc/src/default.css +198 -0
- data/doc/src/default.template +34 -0
- data/doc/src/documentation/api.page +251 -0
- data/doc/src/documentation/index.page +8 -0
- data/doc/src/documentation/mocks.page +207 -0
- data/doc/src/documentation/specs.page +20 -0
- data/doc/src/download.page +8 -0
- data/doc/src/examples.page +9 -0
- data/doc/src/images/ul.gif +0 -0
- data/doc/src/index.page +8 -0
- data/doc/src/tools/index.page +8 -0
- data/doc/src/tools/rails.page +8 -0
- data/doc/src/tools/rake.page +8 -0
- data/doc/src/tools/rcov.page +8 -0
- data/doc/src/tools/spec_runner.page +8 -0
- data/doc/src/tools/specdoc.page +8 -0
- data/doc/src/tools/test2rspec.page +8 -0
- data/doc/src/ul.gif +0 -0
- data/doc/src/why_rspec.page +8 -0
- data/examples/mocking_spec.rb +2 -2
- data/examples/spec_framework_spec.rb +4 -4
- data/lib/spec/api/helper/have_helper.rb +55 -55
- data/lib/spec/api/mock.rb +111 -38
- data/lib/spec/runner/backtrace_tweaker.rb +4 -4
- data/lib/spec/runner/context.rb +2 -1
- data/lib/spec/runner/context_runner.rb +3 -3
- data/lib/spec/runner/option_parser.rb +8 -4
- data/lib/spec/runner/simple_text_reporter.rb +29 -19
- data/lib/spec/runner/specification.rb +2 -1
- data/lib/spec/version.rb +1 -1
- data/test/rake/rcov_testtask.rb +45 -0
- data/test/spec/api/helper/arbitrary_predicate_test.rb +39 -24
- data/test/spec/api/helper/equality_test.rb +19 -0
- data/test/spec/api/helper/should_have_test.rb +183 -0
- data/test/spec/api/mock_arg_constraints_test.rb +90 -0
- data/test/spec/api/mock_test.rb +101 -21
- data/test/spec/runner/context_runner_test.rb +3 -3
- data/test/spec/runner/context_test.rb +2 -5
- data/test/spec/runner/execution_context_test.rb +1 -1
- data/test/spec/runner/option_parser_test.rb +16 -8
- data/test/spec/runner/simple_text_reporter_test.rb +57 -33
- data/test/spec/runner/specification_test.rb +7 -7
- data/test/spec/tool/command_line_test.rb +4 -4
- data/test/test_helper.rb +2 -2
- metadata +37 -8
- data/README +0 -38
- data/TODO +0 -9
- data/TUTORIAL +0 -259
- data/WHY_RSPEC +0 -115
@@ -0,0 +1,251 @@
|
|
1
|
+
---
|
2
|
+
title: Core API
|
3
|
+
inMenu: true
|
4
|
+
ordering: 5
|
5
|
+
---
|
6
|
+
h2. Core API
|
7
|
+
|
8
|
+
When RSpec executes specifications, it defines a method *should* on every object in the system.
|
9
|
+
This *should* method is your entry to the magic of RSpec.
|
10
|
+
|
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
|
13
|
+
violated.
|
14
|
+
|
15
|
+
h3. General
|
16
|
+
|
17
|
+
h4. Arbitrary Block
|
18
|
+
|
19
|
+
<pre>
|
20
|
+
<code>
|
21
|
+
target.should.satisfy {|arg| ...}
|
22
|
+
target.should.not.satisfy {|arg| ...}
|
23
|
+
</code>
|
24
|
+
</pre>
|
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.
|
29
|
+
|
30
|
+
<pre>
|
31
|
+
<code>
|
32
|
+
target.should.satisfy {|arg| arg > 0}
|
33
|
+
</code>
|
34
|
+
</pre>
|
35
|
+
|
36
|
+
h4. Equality
|
37
|
+
<pre>
|
38
|
+
<code>
|
39
|
+
target.should.equal <value>
|
40
|
+
target.should.not.equal <value>
|
41
|
+
</code>
|
42
|
+
</pre>
|
43
|
+
|
44
|
+
The target object is compared to <value> using ==. If the result is false (or
|
45
|
+
true for the negated form) ExpectationNotMetError is raised.
|
46
|
+
|
47
|
+
h4. Floating Point Comparison
|
48
|
+
|
49
|
+
<pre>
|
50
|
+
<code>
|
51
|
+
target.should.be.close <value>, <tolerance>
|
52
|
+
target.should.not.be.close <value>, <tolerance>
|
53
|
+
</code>
|
54
|
+
</pre>
|
55
|
+
|
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>.
|
59
|
+
|
60
|
+
<pre>
|
61
|
+
<code>
|
62
|
+
target.should.be.close 27.35, 0.05
|
63
|
+
</code>
|
64
|
+
</pre>
|
65
|
+
|
66
|
+
h4. Identity
|
67
|
+
|
68
|
+
<pre>
|
69
|
+
<code>
|
70
|
+
target.should.be <value>
|
71
|
+
target.should.not.be <value>
|
72
|
+
</code>
|
73
|
+
</pre>
|
74
|
+
|
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.
|
77
|
+
|
78
|
+
h4. Arbitrary Predicate
|
79
|
+
|
80
|
+
|
81
|
+
<pre>
|
82
|
+
<code>
|
83
|
+
target.should.predicate [optional args]
|
84
|
+
target.should.be.predicate [optional args]
|
85
|
+
target.should.not.predicate [optional args]
|
86
|
+
target.should.not.be.predicate [optional args]
|
87
|
+
</code>
|
88
|
+
</pre>
|
89
|
+
|
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
|
92
|
+
raised.
|
93
|
+
|
94
|
+
<pre>
|
95
|
+
<code>
|
96
|
+
container.should.include 'a' uses container.include? 'a'
|
97
|
+
container.should.be.empty uses container.empty?
|
98
|
+
</code>
|
99
|
+
</pre>
|
100
|
+
|
101
|
+
h4. Pattern Matching
|
102
|
+
|
103
|
+
<pre>
|
104
|
+
<code>
|
105
|
+
target.should.match <regex>
|
106
|
+
target.should.not.match <regex>
|
107
|
+
</code>
|
108
|
+
</pre>
|
109
|
+
|
110
|
+
The target is matched against <regex>. An ExpectationNotMetError is raised if
|
111
|
+
the match fails or succeeds, respectively.
|
112
|
+
|
113
|
+
h3. Class/Type
|
114
|
+
|
115
|
+
h4. Direct Instance
|
116
|
+
|
117
|
+
<pre>
|
118
|
+
<code>
|
119
|
+
target.should.be.an.instance.of <class>
|
120
|
+
target.should.not.be.an.instance.of <class>
|
121
|
+
</code>
|
122
|
+
</pre>
|
123
|
+
|
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>.
|
127
|
+
|
128
|
+
h4. Ancestor Class
|
129
|
+
|
130
|
+
<pre>
|
131
|
+
<code>
|
132
|
+
target.should.be.a.kind.of <class>
|
133
|
+
target.should.not.be.a.kind.of <class>
|
134
|
+
</code>
|
135
|
+
</pre>
|
136
|
+
|
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.
|
139
|
+
|
140
|
+
h4. Type
|
141
|
+
|
142
|
+
<pre>
|
143
|
+
<code>
|
144
|
+
target.should.respond.to <symbol>
|
145
|
+
target.should.not.respond.to <symbol>
|
146
|
+
</code>
|
147
|
+
</pre>
|
148
|
+
|
149
|
+
Uses target.respond_to? <symbol> to check whether <symbol> is the name of a
|
150
|
+
message that target understands.
|
151
|
+
|
152
|
+
h3. Procs
|
153
|
+
|
154
|
+
h4. Raising
|
155
|
+
|
156
|
+
<pre>
|
157
|
+
<code>
|
158
|
+
proc.should.raise <exception>
|
159
|
+
proc.should.not.raise <exception>
|
160
|
+
</code>
|
161
|
+
</pre>
|
162
|
+
|
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:
|
165
|
+
|
166
|
+
<pre>
|
167
|
+
<code>
|
168
|
+
lambda { 3 / 0 }.should.raise ZeroDivisionError
|
169
|
+
</code>
|
170
|
+
</pre>
|
171
|
+
|
172
|
+
There is a more general form as well.
|
173
|
+
|
174
|
+
<pre>
|
175
|
+
<code>
|
176
|
+
proc.should.raise
|
177
|
+
proc.should.not.raise
|
178
|
+
</code>
|
179
|
+
</pre>
|
180
|
+
|
181
|
+
These forms don't worry about what exception is raised (or not). All they are
|
182
|
+
concern with is that some except was raised, or that no exception was raised.
|
183
|
+
|
184
|
+
h4. Throwing
|
185
|
+
|
186
|
+
<pre>
|
187
|
+
<code>
|
188
|
+
proc.should.throw <symbol>
|
189
|
+
proc.should.not.throw <symbol>
|
190
|
+
</code>
|
191
|
+
</pre>
|
192
|
+
|
193
|
+
Similar to the above, but checks that <symbol> is thrown from within proc, or
|
194
|
+
that it is not. The latter is actually one of two cases: some other symbol is
|
195
|
+
thrown, or no symbol is thrown.
|
196
|
+
|
197
|
+
<pre>
|
198
|
+
<code>
|
199
|
+
proc.should.not.throw
|
200
|
+
</code>
|
201
|
+
</pre>
|
202
|
+
|
203
|
+
This form is more specific. It checks that no symbol is thrown from within proc.
|
204
|
+
|
205
|
+
h3. Collections
|
206
|
+
|
207
|
+
h4. Containment
|
208
|
+
|
209
|
+
<pre>
|
210
|
+
<code>
|
211
|
+
target.should.include <object>
|
212
|
+
</code>
|
213
|
+
</pre>
|
214
|
+
|
215
|
+
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
|
+
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
|
221
|
+
attempted.
|
222
|
+
|
223
|
+
4. Exact Size
|
224
|
+
|
225
|
+
<pre>
|
226
|
+
<code>
|
227
|
+
target.should.have(<number>).<things>
|
228
|
+
</code>
|
229
|
+
</pre>
|
230
|
+
|
231
|
+
The <things> of target has a length/size of exactly <number>.
|
232
|
+
|
233
|
+
h4. Lower Bound
|
234
|
+
|
235
|
+
<pre>
|
236
|
+
<code>
|
237
|
+
target.should.have.at.least(<number>).<things>
|
238
|
+
</code>
|
239
|
+
</pre>
|
240
|
+
|
241
|
+
The <things> of target has a length/size of no less than <number>.
|
242
|
+
|
243
|
+
h4. Upper Bound
|
244
|
+
|
245
|
+
<pre>
|
246
|
+
<code>
|
247
|
+
target.should.have.at.most(<number>).<things>
|
248
|
+
</code>
|
249
|
+
</pre>
|
250
|
+
|
251
|
+
The <things> of target has a length/size of no more than <number>.
|
@@ -0,0 +1,207 @@
|
|
1
|
+
---
|
2
|
+
title: Mock API
|
3
|
+
inMenu: true
|
4
|
+
ordering: 5
|
5
|
+
---
|
6
|
+
h2. Mock API
|
7
|
+
|
8
|
+
RSpec contains a full featured Mock Objects framework.
|
9
|
+
|
10
|
+
h3. Creating a mock
|
11
|
+
|
12
|
+
<pre>
|
13
|
+
<code>
|
14
|
+
mock(<name>)
|
15
|
+
</code>
|
16
|
+
</pre>
|
17
|
+
|
18
|
+
This creates a new mock with the given name (a string) and registers it. When
|
19
|
+
the specification finishes, all registered mocks are verified.
|
20
|
+
|
21
|
+
<pre>
|
22
|
+
<code>
|
23
|
+
mock(<name>, <options>)
|
24
|
+
</code>
|
25
|
+
</pre>
|
26
|
+
|
27
|
+
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
|
30
|
+
mock to ignore (quietly consume) any messages it hasn't been told to expect.
|
31
|
+
|
32
|
+
h3. Expecting Messages
|
33
|
+
|
34
|
+
<pre>
|
35
|
+
<code>
|
36
|
+
mock.should.receive(<message>)
|
37
|
+
</code>
|
38
|
+
</pre>
|
39
|
+
|
40
|
+
The <message> argument is a symbol that is the name of a message that you want
|
41
|
+
the mock to be expecting.
|
42
|
+
|
43
|
+
h3. Arbitrary Message Receive Handling
|
44
|
+
|
45
|
+
You can supply a block to a message expectation. When the message is received
|
46
|
+
by the mock, the block is evaluated, and passed any arguments. The result is
|
47
|
+
the return value of the message. For example:
|
48
|
+
|
49
|
+
<pre>
|
50
|
+
<code>
|
51
|
+
@mock.should.receive(:random_call) {| a | a.should.be true}
|
52
|
+
</code>
|
53
|
+
</pre>
|
54
|
+
|
55
|
+
This allows arbitrary argument validation and result computation.
|
56
|
+
|
57
|
+
h3. Expecting Arguments
|
58
|
+
|
59
|
+
<pre>
|
60
|
+
<code>
|
61
|
+
mock.should.receive(:msg).with(<args>)
|
62
|
+
mock.should.receive(:msg).with(1, 2, 3)
|
63
|
+
</code>
|
64
|
+
</pre>
|
65
|
+
|
66
|
+
The <args> argument is a series of arguments (e..g. 1, 2, 3) that are expected
|
67
|
+
to be passed as arguments to the associated message.
|
68
|
+
|
69
|
+
<pre>
|
70
|
+
<code>
|
71
|
+
mock.should.receive(:msg).with(:nothing)
|
72
|
+
</code>
|
73
|
+
</pre>
|
74
|
+
|
75
|
+
No arguments are to be accepted by the message.
|
76
|
+
|
77
|
+
<pre>
|
78
|
+
<code>
|
79
|
+
mock.should.receive(:msg).with(:anything)
|
80
|
+
</code>
|
81
|
+
</pre>
|
82
|
+
|
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.
|
85
|
+
|
86
|
+
<pre>
|
87
|
+
<code>
|
88
|
+
:anything
|
89
|
+
</code>
|
90
|
+
</pre>
|
91
|
+
|
92
|
+
accepts any value for this argument
|
93
|
+
|
94
|
+
<pre>
|
95
|
+
<code>
|
96
|
+
mock.should.receive(:msg).with(1, :anything, "A")
|
97
|
+
</code>
|
98
|
+
</pre>
|
99
|
+
|
100
|
+
h3. Receive Counts
|
101
|
+
|
102
|
+
<pre>
|
103
|
+
<code>
|
104
|
+
mock.should.receive(:msg).with(:nothing).never
|
105
|
+
</code>
|
106
|
+
</pre>
|
107
|
+
|
108
|
+
A problem is reported if the message is ever received.
|
109
|
+
|
110
|
+
<pre>
|
111
|
+
<code>
|
112
|
+
mock.should.receive(:msg).with(:nothing).any.number.of.times
|
113
|
+
</code>
|
114
|
+
</pre>
|
115
|
+
|
116
|
+
The message can be received 0 or more times.
|
117
|
+
|
118
|
+
<pre>
|
119
|
+
<code>
|
120
|
+
mock.should.receive(:msg).with(:nothing).once
|
121
|
+
</code>
|
122
|
+
</pre>
|
123
|
+
|
124
|
+
A problem is reported is the message is never received, or it is received more
|
125
|
+
than once.
|
126
|
+
|
127
|
+
<pre>
|
128
|
+
<code>
|
129
|
+
mock.should.receive(:msg).with(:nothing).twice
|
130
|
+
</code>
|
131
|
+
</pre>
|
132
|
+
|
133
|
+
A problem is reported is the message is received anything but two times.
|
134
|
+
|
135
|
+
<pre>
|
136
|
+
<code>
|
137
|
+
mock.should.receive(:msg).with(:nothing).exactly(n).times
|
138
|
+
</code>
|
139
|
+
</pre>
|
140
|
+
|
141
|
+
A problem is reported is the message is received anything but n times.
|
142
|
+
|
143
|
+
<pre>
|
144
|
+
<code>
|
145
|
+
mock.should.receive(:msg).with(:nothing).at.least(:once)
|
146
|
+
</code>
|
147
|
+
</pre>
|
148
|
+
|
149
|
+
A problem is reported if the message is never received.
|
150
|
+
|
151
|
+
<pre>
|
152
|
+
<code>
|
153
|
+
mock.should.receive(:msg).with(:nothing).at.least(:twice)
|
154
|
+
</code>
|
155
|
+
</pre>
|
156
|
+
|
157
|
+
A problem is reported is the message is never received or is received only once.
|
158
|
+
|
159
|
+
<pre>
|
160
|
+
<code>
|
161
|
+
mock.should.receive(:msg).with(:nothing).at.least(n).times
|
162
|
+
</code>
|
163
|
+
</pre>
|
164
|
+
|
165
|
+
A problem is reported is the message is received fewer than n times.
|
166
|
+
|
167
|
+
h3. Return Values
|
168
|
+
|
169
|
+
<pre>
|
170
|
+
<code>
|
171
|
+
mock.should.receive(:msg).with(:nothing).once.and.return(<value>)
|
172
|
+
</code>
|
173
|
+
</pre>
|
174
|
+
|
175
|
+
When the expected message is received, <value> will be returned as the result.
|
176
|
+
|
177
|
+
<pre>
|
178
|
+
<code>
|
179
|
+
and.return([<value1>, <value2>, …, <valuen>])
|
180
|
+
mock.should.receive(:msg).with(:nothing).once.and.return(1, 2, 3)
|
181
|
+
</code>
|
182
|
+
</pre>
|
183
|
+
|
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
|
186
|
+
subsequent receives of the message.
|
187
|
+
|
188
|
+
<pre>
|
189
|
+
<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}
|
192
|
+
</code>
|
193
|
+
</pre>
|
194
|
+
|
195
|
+
When the expected message is received, the result of evaluating the supplied
|
196
|
+
block will be returned as the result. The block is passed any arguments passed
|
197
|
+
as parts of the message. This capability can be used to compute return values
|
198
|
+
based on the arguments.
|
199
|
+
|
200
|
+
<pre>
|
201
|
+
<code>
|
202
|
+
mock.should.receive(:msg).with(:anything).once.and.throw(<symbol>)
|
203
|
+
mock.should.receive(:msg).with(:anything).once.and.raise(<exception>)
|
204
|
+
</code>
|
205
|
+
</pre>
|
206
|
+
|
207
|
+
These instruct the mock to raise an exception or throw a symbol instead of returning a value.on other objects.
|