test-doubles.md
... ...
@@ -180,6 +180,33 @@ example, you might stub a method `convert` but over time your collaborators chan
180 180
to `transform`: Your tests would continue to pass because you've stubbed a method that doesn't exist
181 181
on the real objects.
182 182
183
+### The Four-Phase Test
184
+
185
+It is conventional to think of tests as having four phases:
186
+
187
+1. Setup
188
+2. Exercise
189
+3. Verify
190
+4. Teardown
191
+
192
+Typically teardown (releasing resources) is done for you by the framework. Here's our spec of `Converter`
193
+with comments showing the phases:
194
+
195
+```ruby
196
+describe Converter do
197
+ let(:specific_converter) { FToCConverter.new } # setup
198
+ subject { Converter.new(specific_converter) } # setup
199
+
200
+ it "can delegate to a specific converter" do
201
+ specific_converter.stub :convert, 400 do
202
+ converted_value = subject.convert(32) # exercise
203
+ expect converted_value.must_be_within_epsilon 400, 0.01 # verify
204
+ end
205
+ end
206
+ # teardown
207
+end
208
+```
209
+
183 210
### Testing messages sent to others
184 211
185 212
When we send a message to another object that results in a side effect, we want to verify the side effect.