rspec 0.5.3 → 0.5.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (100) hide show
  1. data/CHANGES +57 -32
  2. data/EXAMPLES.rd +0 -0
  3. data/Rakefile +22 -21
  4. data/bin/spec +9 -11
  5. data/doc/README +1 -3
  6. data/doc/plugin/syntax.rb +27 -5
  7. data/doc/src/core_team.page +22 -0
  8. data/doc/src/default.css +11 -11
  9. data/doc/src/default.template +0 -1
  10. data/doc/src/documentation/index.page +183 -8
  11. data/doc/src/documentation/meta.info +7 -7
  12. data/doc/src/documentation/mocks.page +168 -109
  13. data/doc/src/documentation/underscores.page +20 -0
  14. data/doc/src/examples.page +2 -1
  15. data/doc/src/images/David_and_Aslak.jpg +0 -0
  16. data/doc/src/images/Whats_That_Dude.jpg +0 -0
  17. data/doc/src/index.page +70 -3
  18. data/doc/src/meta.info +18 -11
  19. data/doc/src/tools/index.page +40 -134
  20. data/doc/src/tools/meta.info +9 -3
  21. data/doc/src/tools/rails.page +3 -1
  22. data/doc/src/tools/rake.page +20 -3
  23. data/doc/src/tools/rcov.page +19 -0
  24. data/doc/src/tools/spec.page +99 -0
  25. data/doc/src/tools/test2rspec.page +2 -4
  26. data/doc/src/tutorials/index.page +52 -0
  27. data/doc/src/tutorials/meta.info +31 -0
  28. data/doc/src/tutorials/notes.txt +252 -0
  29. data/doc/src/tutorials/stack.rb +11 -0
  30. data/doc/src/tutorials/stack_01.page +224 -0
  31. data/doc/src/tutorials/stack_02.page +180 -0
  32. data/doc/src/tutorials/stack_03.page +291 -0
  33. data/doc/src/tutorials/stack_04.page +203 -0
  34. data/doc/src/tutorials/stack_04.page.orig +123 -0
  35. data/doc/src/tutorials/stack_05.page +90 -0
  36. data/doc/src/tutorials/stack_05.page.orig +124 -0
  37. data/doc/src/tutorials/stack_06.page +359 -0
  38. data/doc/src/tutorials/stack_06.page.orig +359 -0
  39. data/doc/src/tutorials/stack_spec.rb +41 -0
  40. data/examples/airport_spec.rb +4 -4
  41. data/examples/{spec_framework_spec.rb → bdd_framework_spec.rb} +6 -7
  42. data/examples/mocking_spec.rb +0 -5
  43. data/examples/stack_spec.rb +6 -7
  44. data/examples/sugar_spec.rb +14 -0
  45. data/lib/spec/api.rb +5 -2
  46. data/lib/spec/api/helper/should_base.rb +17 -22
  47. data/lib/spec/api/helper/should_helper.rb +4 -3
  48. data/lib/spec/api/helper/should_negator.rb +3 -2
  49. data/lib/spec/api/mocks/argument_expectation.rb +104 -0
  50. data/lib/spec/api/{mock.rb → mocks/message_expectation.rb} +47 -96
  51. data/lib/spec/api/mocks/mock.rb +63 -0
  52. data/lib/spec/api/mocks/order_group.rb +21 -0
  53. data/lib/spec/api/sugar.rb +47 -0
  54. data/lib/spec/rake/rcov_verify.rb +45 -0
  55. data/lib/spec/rake/spectask.rb +41 -56
  56. data/lib/spec/runner.rb +4 -1
  57. data/lib/spec/runner/backtrace_tweaker.rb +24 -3
  58. data/lib/spec/runner/base_text_formatter.rb +28 -0
  59. data/lib/spec/runner/context.rb +21 -18
  60. data/lib/spec/runner/context_runner.rb +20 -31
  61. data/lib/spec/runner/execution_context.rb +3 -3
  62. data/lib/spec/runner/kernel_ext.rb +10 -1
  63. data/lib/spec/runner/option_parser.rb +32 -14
  64. data/lib/spec/runner/progress_bar_formatter.rb +21 -0
  65. data/lib/spec/runner/rdoc_formatter.rb +15 -5
  66. data/lib/spec/runner/reporter.rb +100 -0
  67. data/lib/spec/runner/specdoc_formatter.rb +20 -0
  68. data/lib/spec/runner/specification.rb +42 -22
  69. data/lib/spec/version.rb +1 -1
  70. data/test/rcov/rcov_testtask.rb +1 -0
  71. data/test/spec/api/duck_type_test.rb +4 -4
  72. data/test/spec/api/helper/raising_test.rb +37 -17
  73. data/test/spec/api/{mock_arg_constraints_test.rb → mocks/mock_arg_constraints_test.rb} +10 -4
  74. data/test/spec/api/mocks/mock_ordering_test.rb +62 -0
  75. data/test/spec/api/{mock_test.rb → mocks/mock_test.rb} +30 -7
  76. data/test/spec/api/mocks/null_object_test.rb +31 -0
  77. data/test/spec/api/sugar_test.rb +71 -0
  78. data/test/spec/runner/backtrace_tweaker_test.rb +52 -4
  79. data/test/spec/runner/context_runner_test.rb +41 -21
  80. data/test/spec/runner/context_test.rb +60 -32
  81. data/test/spec/runner/execution_context_test.rb +4 -3
  82. data/test/spec/runner/failure_dump_test.rb +92 -0
  83. data/test/spec/runner/kernel_ext_test.rb +1 -2
  84. data/test/spec/runner/option_parser_test.rb +48 -28
  85. data/test/spec/runner/progress_bar_formatter_test.rb +48 -0
  86. data/test/spec/runner/rdoc_formatter_test.rb +31 -4
  87. data/test/spec/runner/reporter_test.rb +103 -0
  88. data/test/spec/runner/specdoc_formatter_test.rb +50 -0
  89. data/test/spec/runner/specification_test.rb +49 -11
  90. data/test/test_helper.rb +1 -4
  91. metadata +46 -15
  92. data/doc/src/community.page +0 -7
  93. data/doc/src/documentation/api.page +0 -185
  94. data/doc/src/why_rspec.page +0 -7
  95. data/examples/empty_stack_spec.rb +0 -22
  96. data/examples/team_spec.rb +0 -30
  97. data/lib/spec/api/duck_type.rb +0 -16
  98. data/lib/spec/runner/simple_text_reporter.rb +0 -88
  99. data/test/rcov/rcov_verify.rb +0 -28
  100. data/test/spec/runner/simple_text_reporter_test.rb +0 -123
@@ -1,22 +1,22 @@
1
1
  index.page:
2
- orderInfo: 10
3
-
4
- api.page:
5
- orderInfo: 11
2
+ inMenu: 11
6
3
 
4
+ underscores.page:
5
+ orderInfo: 13
6
+
7
7
  mocks.page:
8
- orderInfo: 12
8
+ orderInfo: 14
9
9
 
10
10
  rdoc.html:
11
11
  title: RDoc
12
12
  dest: ../rdoc/index.html
13
13
  inMenu: true
14
- orderInfo: 13
14
+ orderInfo: 15
15
15
 
16
16
  rcov.html:
17
17
  title: RCov
18
18
  dest: ../coverage/index.html
19
19
  inMenu: true
20
- orderInfo: 14
20
+ orderInfo: 16
21
21
 
22
22
 
@@ -8,193 +8,252 @@ RSpec contains a full featured Mock Objects framework.
8
8
 
9
9
  h3. Creating a mock
10
10
 
11
- <pre>
12
- mock(<name>)
13
- </pre>
11
+ <ruby>
12
+ my_mock = mock(<name>)
13
+ </ruby>
14
14
 
15
- This creates a new mock with the given name (a string) and registers it. When the specification finishes, all registered mocks are verified.
15
+ This creates a new mock with the given <code>name</code> (a string) and registers it. When the specification finishes, all registered mocks are verified.
16
16
 
17
- <pre>
18
- mock(<name>, <options>)
19
- </pre>
17
+ <ruby>
18
+ my_mock = mock(<name>, <options>)
19
+ </ruby>
20
20
 
21
- As above, but allows you to specific options to tweak the mock's behaviour. The <code>options</code> argument is a hash. Currently the only supported option is <code>:null_object</code>. Setting this to true (i.e. <code>:null_object => true</code>) instructs the mock to ignore (quietly consume) any messages it hasn't been told to expect.
21
+ As above, but allows you to specific options to tweak the mock's behaviour. The <code>options</code> argument is a hash. Currently the only supported option is <code>:null_object</code>. Setting this to true instructs the mock to ignore (quietly consume) any messages it hasn't been told to expect. I.e.:
22
+
23
+ <ruby>
24
+ my_mock = mock("blah", :null_object => true)
25
+ </ruby>
22
26
 
23
27
  h3. Expecting Messages
24
28
 
25
- <pre>
26
- mock.should.receive(<message>)
27
- </pre>
29
+ <ruby>
30
+ my_mock.should.receive(<message>)
31
+ </ruby>
28
32
 
29
- The <code>message</code> argument is a symbol that is the name of a message that you want
30
- the mock to be expecting.
33
+ The <code>message</code> argument is a symbol that is the name of a message that you want the mock to expect.
31
34
 
32
- h3. Arbitrary Message Receive Handling
35
+ h3. Arbitrary Handling of Received Messages
33
36
 
34
37
  You can supply a block to a message expectation. When the message is received
35
38
  by the mock, the block is evaluated, and passed any arguments. The result is
36
39
  the return value of the message. For example:
37
40
 
38
- <pre>
39
- @mock.should.receive(:random_call) {| a | a.should.be true}
40
- </pre>
41
+ <ruby>
42
+ my_mock.should.receive(:random_call) {| a | a.should.be true}
43
+ </ruby>
41
44
 
42
- This allows arbitrary argument validation and result computation.
45
+ This allows arbitrary argument validation and result computation. It's handy and kind of cool to be able to do this, but I advise against it. Mocks should not be functional. they should be completely declarative. That said, it's sometimes useful to give them some minimal behaviour.
43
46
 
44
47
  h3. Expecting Arguments
45
48
 
46
- <pre>
47
- mock.should.receive(:msg).with(<args>)
48
- mock.should.receive(:msg).with(1, 2, 3)
49
- </pre>
49
+ <ruby>
50
+ my_mock.should.receive(:msg).with(<args>)
51
+ </ruby>
52
+
53
+ for example:
54
+
55
+ <ruby>
56
+ my_mock.should.receive(:msg).with(1, 2, 3)
57
+ </ruby>
50
58
 
51
- The <code>args</code> argument is a series of arguments (e..g. 1, 2, 3) that are expected
52
- to be passed as arguments to the associated message.
59
+ The <code>args</code> argument is a series of arguments (e.g. 1, 2, 3) that are expected to be passed as arguments to the associated message.
53
60
 
54
- <pre>
55
- mock.should.receive(:msg).with(:no_args)
56
- </pre>
61
+ <ruby>
62
+ my_mock.should.receive(:msg).with(:no_args)
63
+ </ruby>
57
64
 
58
- No arguments are to be accepted by the message.
65
+ The message (<code>msg</code>) is expected to be passed no arguments.
59
66
 
60
- <pre>
61
- mock.should.receive(:msg).with(:any_args)
62
- </pre>
67
+ <ruby>
68
+ my_mock.should.receive(:msg).with(:any_args)
69
+ </ruby>
63
70
 
64
- Any arguments are to be accepted by the message. This includes cases where no
65
- arguments are provided. *This is the default when no <code>with()</code> clause is
66
- specified.* Even so, sometimes you want to be explicit about it.
71
+ Any arguments (and any number of arguments) are to be accepted. This includes cases where no arguments are provided. *This is the default when no <code>with()</code> clause is specified.* Even so, sometimes you want to be explicit about it.
67
72
 
68
73
  h3. Argument Constraints
69
74
 
70
- Constraints can be placed on individual arguments which are looser than value equivalence.
75
+ Constraints can be placed on individual arguments which are looser than value equivalence (as above).
71
76
 
72
77
  h4. :anything
73
78
 
74
- accepts any value for this argument
79
+ accepts any value for this argument, e.g.:
75
80
 
76
- <pre>
77
- mock.should.receive(:msg).with(1, :anything, "A")
78
- </pre>
81
+ <ruby>
82
+ my_mock.should.receive(:msg).with(1, :anything, "A")
83
+ </ruby>
79
84
 
80
85
  h4. :numeric
81
86
 
82
- accepts any numeric value for this argument
87
+ accepts any numeric value for this argument, e.g.:
83
88
 
84
- <pre>
85
- mock.should.receive(:msg).with(a, :numeric, "b")
86
- </pre>
89
+ <ruby>
90
+ my_mock.should.receive(:msg).with(a, :numeric, "b")
91
+ </ruby>
87
92
 
88
93
  h4. :boolean
89
94
 
90
- accepts a boolean value for this argument
95
+ accepts a boolean value for this argument, e.g.:
91
96
 
92
- <pre>
93
- mock.should.receive(:msg).with(a, :boolean, "b")
94
- </pre>
97
+ <ruby>
98
+ my_mock.should.receive(:msg).with(a, :boolean, "b")
99
+ </ruby>
95
100
 
96
101
  h4. :string
97
102
 
98
- accepts any string for this argument
103
+ accepts any string for this argument, e.g.:
99
104
 
100
- <pre>
101
- mock.should.receive(:msg).with(a, :string, "b")
102
- </pre>
105
+ <ruby>
106
+ my_mock.should.receive(:msg).with(a, :string, "b")
107
+ </ruby>
103
108
 
104
109
  h4. duck_type(message(s))
105
110
 
106
- accepts any object that responds to the prescribed message(s)
111
+ accepts any object that responds to the prescribed message(s), e.g.:
107
112
 
108
- <pre>
113
+ <ruby>
109
114
  #accepts a Fixnum for the second arg
110
- mock.should.receive(:msg).with(a, duck_type(:abs, :div), "b")
111
- </pre>
115
+ my_mock.should.receive(:msg).with(a, duck_type(:abs, :div), "b")
116
+ </ruby>
112
117
 
113
118
  h3. Receive Counts
114
119
 
115
- <pre>
116
- mock.should.receive(:msg).never
117
- </pre>
120
+ <ruby>
121
+ my_mock.should.receive(:msg).never
122
+ </ruby>
118
123
 
119
- A problem is reported if the message is ever received.
124
+ An exception is raised if the message is ever received.
120
125
 
121
- <pre>
122
- mock.should.receive(:msg).any.number.of.times
123
- </pre>
126
+ <ruby>
127
+ my_mock.should.receive(:msg).any.number.of.times
128
+ </ruby>
124
129
 
125
130
  The message can be received 0 or more times.
126
131
 
127
- <pre>
128
- mock.should.receive(:msg).once
129
- </pre>
132
+ <ruby>
133
+ my_mock.should.receive(:msg).once
134
+ </ruby>
130
135
 
131
- A problem is reported is the message is never received, or it is received more
132
- than once.
136
+ An exception is raised if the message is never received, or it is received more than once.
133
137
 
134
- <pre>
135
- mock.should.receive(:msg).twice
136
- </pre>
138
+ <ruby>
139
+ my_mock.should.receive(:msg).twice
140
+ </ruby>
137
141
 
138
- A problem is reported is the message is received anything but two times.
142
+ An exception is raised if the message is received anything but two times.
139
143
 
140
- <pre>
141
- mock.should.receive(:msg).exactly(n).times
142
- </pre>
144
+ <ruby>
145
+ my_mock.should.receive(:msg).exactly(n).times
146
+ </ruby>
143
147
 
144
- A problem is reported is the message is received anything but n times.
148
+ An exception is raised if the message is received anything but <code>n</code> times.
145
149
 
146
- <pre>
147
- mock.should.receive(:msg).at.least(:once)
148
- </pre>
150
+ <ruby>
151
+ my_mock.should.receive(:msg).at.least(:once)
152
+ </ruby>
149
153
 
150
- A problem is reported if the message is never received.
154
+ An exception is raised if the message is never received.
151
155
 
152
- <pre>
153
- mock.should.receive(:msg).at.least(:twice)
154
- </pre>
156
+ <ruby>
157
+ my_mock.should.receive(:msg).at.least(:twice)
158
+ </ruby>
155
159
 
156
- A problem is reported is the message is never received or is received only once.
160
+ An exception is raised if the message is never received or is received only once.
157
161
 
158
- <pre>
159
- mock.should.receive(:msg).at.least(n).times
160
- </pre>
162
+ <ruby>
163
+ my_mock.should.receive(:msg).at.least(n).times
164
+ </ruby>
161
165
 
162
- A problem is reported is the message is received fewer than n times.
166
+ An exception is raised if the message is received fewer than <code>n</code> times.
163
167
 
164
168
  h3. Return Values
165
169
 
166
- <pre>
167
- mock.should.receive(:msg).once.and.return(<value>)
168
- </pre>
170
+ h4. Single return value
169
171
 
170
- When the expected message is received, <code>value</code> will be returned as the result.
172
+ <ruby>
173
+ my_mock.should.receive(:msg).once.and.return(<value>)
174
+ </ruby>
171
175
 
172
- <pre>
176
+ Each time the expected message is received, <code>value</code> will be returned as the result.
177
+
178
+ h4. Consequtive return values
179
+
180
+ <ruby>
173
181
  and.return([<value-1>, <value-2>, ..., <value-n>])
174
- </pre>
182
+ </ruby>
183
+
184
+ When the expected message is received, <code>value-i</code> will be returned as the result for the ith reception of the message. After the message has been received <code>i</code> times, <code>value-n</code> is returned for all
185
+ subsequent receives.
175
186
 
176
- When the expected message is received, <code>value-i</code> will be returned as the result
177
- for the ith reception of the message. Once <code>i > n</code>, <code>value-n</code> is returned for all
178
- subsequent receives of the message.
187
+ *Note:* if you wish to have a single return value that is an array, you must use this form, with one item that is the array to return. Otherwise your array will be interpreted as a series of return values. For example:
179
188
 
180
- <pre>
181
- mock.should.receive(:msg).once.and.return {...}
182
- </pre>
189
+ <ruby>
190
+ and.return([[1, 2, 3]])
191
+ </ruby>
192
+
193
+ h4. Computed return value
194
+
195
+ <ruby>
196
+ my_mock.should.receive(:msg).once.and.return {...}
197
+ </ruby>
183
198
 
184
199
  When the expected message is received, the result of evaluating the supplied
185
200
  block will be returned as the result. The block is passed any arguments passed
186
- as parts of the message. This capability can be used to compute return values
187
- based on the arguments. For example:
201
+ as arguments of the message. This capability can be used to compute return values based on the arguments. For example:
188
202
 
189
- <pre>
190
- mock.should.receive(:msg).once.and.return {|a, b| a + b}
191
- </pre>
203
+ <ruby>
204
+ my_mock.should.receive(:msg).with(:numeric, :numeric) once.and.return {|a, b| a + b}
205
+ </ruby>
192
206
 
193
207
  h3. Raising and Throwing
194
208
 
195
- <pre>
196
- mock.should.receive(:msg).once.and.raise(<exception>)
197
- mock.should.receive(:msg).once.and.throw(<symbol>)
198
- </pre>
209
+ <ruby>
210
+ my_mock.should.receive(:msg).once.and.raise(<exception>)
211
+ my_mock.should.receive(:msg).once.and.throw(<symbol>)
212
+ </ruby>
213
+
214
+ These instruct the mock to raise an exception or throw a symbol, respectively, instead of returning a value.
215
+
216
+ h3. Yielding
217
+
218
+ <ruby>
219
+ my_mock.should.receive(:msg).once.and.yield([<value-1>, <value-2>, ..., <value-n>])
220
+ </ruby>
221
+
222
+ When the expected message is received, the mock will yield the values to the passed block.
223
+
224
+ h3. Ordering
225
+
226
+ There are times when you want to specify the order of messages sent to a mock.
227
+ It shouldn't be the case very often, but it can be handy at times.
228
+
229
+ Labeling expectations as being ordered is done by the <code>ordered</code> call:
230
+
231
+ <ruby>
232
+ my_mock.should.receive(:flip).once.ordered
233
+ my_mock.should.receive(:flop).once.ordered
234
+ </ruby>
235
+
236
+ If the send of <code>flop</code> is seen before <code>flip</code> the specification will fail.
237
+
238
+ Of course, chains of ordered expectations can be set up:
239
+
240
+ <ruby>
241
+ my_mock.should.receive(:one).ordered
242
+ my_mock.should.receive(:two).ordered
243
+ my_mock.should.receive(:three).ordered
244
+ </ruby>
245
+
246
+ The expected order is the order in which the expectations are declared.
247
+
248
+ Order-independant expectations can be set anywhere in the expectation sequence, in any order. Only the order of expectations tagged with the <code>ordered</code> call is significant. Likewise, calls to order-independant methods can be made in any order, even interspersed with calls to order-dependant methods. For example:
199
249
 
200
- These instruct the mock to raise an exception or throw a symbol instead of returning a value.
250
+ <ruby>
251
+ my_mock.should.receive(:zero)
252
+ my_mock.should.receive(:one).ordered
253
+ my_mock.should.receive(:two).ordered
254
+ my_mock.should.receive(:one_and_a_half)
255
+ my_mock.one
256
+ my_mock.one_and_a_half
257
+ my_mock.zero
258
+ my_mock.two
259
+ </ruby>
@@ -0,0 +1,20 @@
1
+ ---
2
+ title: Underscore sugar
3
+ inMenu: true
4
+ ---
5
+ h2. Underscore sugar
6
+
7
+ If you feel that the various dots hurt your eyes and is not very 'rubyish',
8
+ you can replace your dots with underscores, so that instead of saying
9
+
10
+ <ruby>
11
+ lambda { 1.should.not.equal 1 }.should.raise
12
+ </ruby>
13
+
14
+ you can say
15
+
16
+ <ruby>
17
+ lambda { 1.should_not_equal 1 }.should_raise
18
+ </ruby>
19
+
20
+ This applies to regular Ruby objects as well as mocks.
@@ -5,4 +5,5 @@ inMenu: true
5
5
  h2. Examples
6
6
 
7
7
  Here is an example of an RSpec spec:
8
- {ruby_inline: {filename: ../examples/stack_spec.rb}}
8
+
9
+ <ruby file="../examples/stack_spec.rb" />
@@ -1,7 +1,74 @@
1
1
  ---
2
- title: Overview
2
+ title: Overview
3
3
  inMenu: true
4
- ---
4
+ ---
5
+
6
+ h2. Behaviour Driven Development
7
+
8
+ Test Driven Development (TDD) has you define the behaviour of your system by
9
+ writing small tests that precisely define some small piece of your system's
10
+ behaviour. Then you implement that behaviour. Then you clean up & improve your
11
+ design.
12
+
13
+ At least that's how you're supposed to do it.
14
+
15
+ This focus on behaviour is the real value in TDD, and marks the genuinely
16
+ experienced TDD practitioner.
17
+
18
+ However, with the ubiquity of testing related terminology in TDD and it's
19
+ supporting frameworks, it is no surprise that it takes beginners some time to
20
+ get to the understanding that TDD isn't about testing at all... if they ever
21
+ do.
22
+
23
+ The aim of BDD is to address this shortcoming and, by using terminology
24
+ focused on the behavioural aspects of the system rather than testing, attempt
25
+ to help direct developers towards a focus on the real value to be found in TDD
26
+ at its most successful, or BDD as we call it.
27
+
28
+ (paraphrased from "behaviour-driven.org":http://behaviour-driven.org)
29
+
30
+ Dan North, who was the first to coin the term BDD, and who has been actively
31
+ refining it since, started promoting BDD in 2003. "JBehave":http://jbehave.codehaus.org/
32
+ was the first BDD framework to support this new thinking.
33
+
5
34
  h2. RSpec
6
35
 
7
- bla bla bla
36
+ RSpec is a framework for practicing __Behaviour Driven Development__ (BDD) in Ruby.
37
+
38
+ It all started with a blogpost
39
+ ("A New Look at Test Driven Development":http://blog.daveastels.com/articles/2005/07/05/a-new-look-at-test-driven-development)
40
+ of Dave's where he talked about his ideas for BDD and a BDD framework. One thing he mentioned was that his ideas
41
+ would be easily implemented in Smalltalk, and probably Ruby.
42
+
43
+ Steven Baker wrote the first version of the rspec core. Dave added mock support (initially inspired from Schmock by
44
+ Ben Griffiths). Dave and David had met & talked about BDD at Agile'05 just after Dave's blog
45
+ post (above). David started thinking about a BDD framework in C#. As fate, or
46
+ the gods, would have it Dave & David ended up working at the same client in
47
+ the greater Chicago area, allowing them to explore some ideas resulting in the totally rewriting of the expectation mechanism.
48
+ Aslak joined in and the three rewrote the higher level syntax and the core, reworking RSpec into what you see now:
49
+
50
+ <ruby>
51
+ context "BDD framework" do
52
+
53
+ setup do
54
+ @bdd_framework = BddFramework.new
55
+ end
56
+
57
+ specify "should be adopted quickly" do
58
+ @bdd_framework.should.be.adopted_quickly
59
+ end
60
+
61
+ specify "should be intuitive" do
62
+ @bdd_framework.should.be.intuitive
63
+ end
64
+
65
+ end
66
+ </ruby>
67
+
68
+ RSpec provides a framework for writing what we call __executable
69
+ specifications of program behaviour__. Since that's rather wordy, we usually
70
+ just call them __specs__.
71
+ "Some other people":http://www.testing.com/cgi-bin/blog/2006/04/12#spec-vs-example call these things __examples__.
72
+
73
+ On this site you will find examples, documentation, and tutorials as well as
74
+ links to download and community resources.