vcr 1.2.0 → 1.3.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 (40) hide show
  1. data/CHANGELOG.md +12 -0
  2. data/FullBuildRakeFile +22 -0
  3. data/Gemfile +8 -0
  4. data/Gemfile.lock +46 -25
  5. data/Guardfile +9 -0
  6. data/README.md +10 -371
  7. data/Rakefile +6 -2
  8. data/TODO.md +4 -0
  9. data/features/support/env.rb +5 -1
  10. data/full_build +1 -0
  11. data/lib/vcr.rb +17 -7
  12. data/lib/vcr/basic_object.rb +39 -0
  13. data/lib/vcr/config.rb +4 -7
  14. data/lib/vcr/deprecations.rb +14 -0
  15. data/lib/vcr/http_stubbing_adapters/common.rb +44 -13
  16. data/lib/vcr/http_stubbing_adapters/fakeweb.rb +17 -28
  17. data/lib/vcr/http_stubbing_adapters/multi_object_proxy.rb +43 -0
  18. data/lib/vcr/http_stubbing_adapters/typhoeus.rb +101 -0
  19. data/lib/vcr/http_stubbing_adapters/webmock.rb +16 -37
  20. data/lib/vcr/internet_connection.rb +2 -1
  21. data/lib/vcr/structs.rb +32 -0
  22. data/lib/vcr/version.rb +1 -1
  23. data/spec/config_spec.rb +5 -25
  24. data/spec/deprecations_spec.rb +31 -3
  25. data/spec/extensions/net_http_spec.rb +1 -0
  26. data/spec/fixtures/1.9.1/fake_example.com_responses.yml +32 -1
  27. data/spec/fixtures/not_1.9.1/fake_example.com_responses.yml +32 -1
  28. data/spec/http_stubbing_adapters/fakeweb_spec.rb +9 -24
  29. data/spec/http_stubbing_adapters/multi_object_proxy_spec.rb +101 -0
  30. data/spec/http_stubbing_adapters/typhoeus_spec.rb +28 -0
  31. data/spec/http_stubbing_adapters/webmock_spec.rb +8 -26
  32. data/spec/internet_connection_spec.rb +25 -7
  33. data/spec/spec_helper.rb +3 -1
  34. data/spec/structs_spec.rb +30 -6
  35. data/spec/support/http_library_adapters.rb +50 -15
  36. data/spec/support/http_stubbing_adapter.rb +65 -56
  37. data/spec/support/version_checker.rb +29 -0
  38. data/spec/vcr_spec.rb +30 -12
  39. data/vcr.gemspec +5 -4
  40. metadata +44 -15
data/CHANGELOG.md CHANGED
@@ -1,5 +1,17 @@
1
1
  # Changelog
2
2
 
3
+ ## 1.3.0 (November 11, 2010)
4
+
5
+ [Full Changelog](http://github.com/myronmarston/vcr/compare/v1.2.0...v.1.3.0)
6
+
7
+ * Moved documentation from README to [Wiki](http://github.com/myronmarston/vcr/wiki).
8
+ * Refactoring and code cleanup.
9
+ * Fix InternetConnection.available? so that it memoizes correctly when a connection is not available.
10
+ * Fix WebMock version checking to allow newly released 1.5.0 to be used without a warning.
11
+ * Add support for [Typhoeus](https://github.com/pauldix/typhoeus). Thanks to
12
+ [David Balatero](https://github.com/dbalatero) for making the necessary changes in Typhoeus
13
+ to support VCR.
14
+
3
15
  ## 1.2.0 (October 13, 2010)
4
16
 
5
17
  [Full Changelog](http://github.com/myronmarston/vcr/compare/v1.1.2...v1.2.0)
data/FullBuildRakeFile ADDED
@@ -0,0 +1,22 @@
1
+ # this is in a separate rakefile because our main one depends on the bundled gems
2
+ # already being installed. This must be able to run w/o bundled gems installed.
3
+
4
+ desc "Run a full build: install necessary gems with bundler, runs specs, run cukes"
5
+ task :build => :ensure_bundler_installed do
6
+ sh "bundle install"
7
+ sh "rake"
8
+ end
9
+
10
+ task :ensure_bundler_installed do
11
+ installed = begin
12
+ require 'rubygems'
13
+ require 'bundler'
14
+ true
15
+ rescue LoadError
16
+ false
17
+ end
18
+
19
+ unless installed
20
+ sh "gem install bundler"
21
+ end
22
+ end
data/Gemfile CHANGED
@@ -7,13 +7,21 @@ group :development do
7
7
  gem 'patron', '~> 0.4.6'
8
8
  gem 'em-http-request', '~> 0.2.7'
9
9
  gem 'curb', '~> 0.7.8'
10
+ gem 'typhoeus', '~> 0.2.0'
11
+ end
12
+
13
+ platforms :jruby do
14
+ gem 'jruby-openssl'
10
15
  end
11
16
  end
12
17
 
13
18
  # Additional gems that are useful, but not required for development.
14
19
  group :extras do
20
+ gem 'guard-rspec'
21
+
15
22
  platforms :mri do
16
23
  gem 'rcov'
24
+ gem 'rb-fsevent'
17
25
  end
18
26
 
19
27
  platforms :mri_18 do
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- vcr (1.2.0)
4
+ vcr (1.3.0)
5
5
 
6
6
  GEM
7
7
  remote: http://rubygems.org/
@@ -9,15 +9,17 @@ GEM
9
9
  addressable (2.2.2)
10
10
  archive-tar-minitar (0.5.2)
11
11
  aruba (0.2.1)
12
+ bouncy-castle-java (1.5.0145.2)
12
13
  builder (2.1.2)
13
14
  columnize (0.3.1)
15
+ configuration (1.1.0)
14
16
  crack (0.1.8)
15
- cucumber (0.8.5)
17
+ cucumber (0.9.4)
16
18
  builder (~> 2.1.2)
17
19
  diff-lcs (~> 1.1.2)
18
- gherkin (~> 2.1.4)
19
- json_pure (~> 1.4.3)
20
- term-ansicolor (~> 1.0.4)
20
+ gherkin (~> 2.2.9)
21
+ json (~> 1.4.6)
22
+ term-ansicolor (~> 1.0.5)
21
23
  curb (0.7.8)
22
24
  diff-lcs (1.1.2)
23
25
  em-http-request (0.2.12)
@@ -25,29 +27,43 @@ GEM
25
27
  eventmachine (>= 0.12.9)
26
28
  eventmachine (0.12.10)
27
29
  fakeweb (1.3.0)
28
- gherkin (2.1.5)
29
- trollop (~> 1.16.2)
30
- gherkin (2.1.5-java)
31
- trollop (~> 1.16.2)
30
+ gherkin (2.2.9)
31
+ json (~> 1.4.6)
32
+ term-ansicolor (~> 1.0.5)
33
+ gherkin (2.2.9-java)
34
+ json (~> 1.4.6)
35
+ term-ansicolor (~> 1.0.5)
36
+ guard (0.2.2)
37
+ open_gem (~> 1.4.2)
38
+ thor (~> 0.14.3)
39
+ guard-rspec (0.1.5)
40
+ guard (>= 0.2.0)
32
41
  httpclient (2.1.5.2)
33
- json_pure (1.4.6)
42
+ jruby-openssl (0.7.2)
43
+ bouncy-castle-java
44
+ json (1.4.6)
45
+ json (1.4.6-java)
46
+ launchy (0.3.7)
47
+ configuration (>= 0.0.5)
48
+ rake (>= 0.8.1)
34
49
  linecache (0.43)
35
50
  linecache19 (0.5.11)
36
51
  ruby_core_source (>= 0.1.4)
52
+ open_gem (1.4.2)
53
+ launchy (~> 0.3.5)
37
54
  patron (0.4.9)
38
55
  rack (1.1.0)
39
56
  rake (0.8.7)
57
+ rb-fsevent (0.3.6)
40
58
  rcov (0.9.9)
41
- rspec (2.0.0)
42
- rspec-core (= 2.0.0)
43
- rspec-expectations (= 2.0.0)
44
- rspec-mocks (= 2.0.0)
45
- rspec-core (2.0.0)
46
- rspec-expectations (2.0.0)
47
- diff-lcs (>= 1.1.2)
48
- rspec-mocks (2.0.0)
49
- rspec-core (= 2.0.0)
50
- rspec-expectations (= 2.0.0)
59
+ rspec (2.1.0)
60
+ rspec-core (~> 2.1.0)
61
+ rspec-expectations (~> 2.1.0)
62
+ rspec-mocks (~> 2.1.0)
63
+ rspec-core (2.1.0)
64
+ rspec-expectations (2.1.0)
65
+ diff-lcs (~> 1.1.2)
66
+ rspec-mocks (2.1.0)
51
67
  ruby-debug (0.10.3)
52
68
  columnize (>= 0.1)
53
69
  ruby-debug-base (~> 0.10.3.0)
@@ -64,9 +80,10 @@ GEM
64
80
  ruby_core_source (0.1.4)
65
81
  archive-tar-minitar (>= 0.5.2)
66
82
  term-ansicolor (1.0.5)
83
+ thor (0.14.4)
67
84
  timecop (0.3.5)
68
- trollop (1.16.2)
69
- webmock (1.4.0)
85
+ typhoeus (0.2.0)
86
+ webmock (1.5.0)
70
87
  addressable (>= 2.2.2)
71
88
  crack (>= 0.1.7)
72
89
 
@@ -77,19 +94,23 @@ PLATFORMS
77
94
  DEPENDENCIES
78
95
  aruba (~> 0.2.1)
79
96
  bundler (~> 1.0.0)
80
- cucumber (~> 0.8.5)
97
+ cucumber (~> 0.9.4)
81
98
  curb (~> 0.7.8)
82
99
  em-http-request (~> 0.2.7)
83
100
  fakeweb (~> 1.3.0)
101
+ guard-rspec
84
102
  httpclient (~> 2.1.5.2)
103
+ jruby-openssl
85
104
  patron (~> 0.4.6)
86
105
  rack (= 1.1.0)
87
106
  rake (~> 0.8.7)
107
+ rb-fsevent
88
108
  rcov
89
- rspec (~> 2.0.0)
109
+ rspec (~> 2.1.0)
90
110
  ruby-debug
91
111
  ruby-debug-base19 (= 0.11.23)
92
112
  ruby-debug19
93
113
  timecop (~> 0.3.5)
114
+ typhoeus (~> 0.2.0)
94
115
  vcr!
95
- webmock (~> 1.4.0)
116
+ webmock (>= 1.5.0)
data/Guardfile ADDED
@@ -0,0 +1,9 @@
1
+ # A sample Guardfile
2
+ # More info at http://github.com/guard/guard#readme
3
+
4
+ guard 'rspec', :version => 2 do
5
+ watch('^spec/(.*)_spec.rb')
6
+ watch('^lib/vcr.rb') { "spec/vcr_spec.rb" }
7
+ watch('^lib/vcr/(.*)\.rb') { |m| "spec/#{m[1]}_spec.rb" }
8
+ watch('^spec/spec_helper.rb') { "spec" }
9
+ end
data/README.md CHANGED
@@ -2,18 +2,6 @@
2
2
 
3
3
  Record your test suite's HTTP interactions and replay them during future test runs for fast, deterministic, accurate tests.
4
4
 
5
- ## Installation
6
-
7
- gem install vcr
8
-
9
- You'll also need either [FakeWeb](http://github.com/chrisk/fakeweb) or [WebMock](http://github.com/bblimke/webmock):
10
-
11
- gem install fakeweb
12
-
13
- or
14
-
15
- gem install webmock
16
-
17
5
  ## Synopsis
18
6
 
19
7
  require 'test/unit'
@@ -21,7 +9,7 @@ or
21
9
 
22
10
  VCR.config do |c|
23
11
  c.cassette_library_dir = 'fixtures/vcr_cassettes'
24
- c.http_stubbing_library = :fakeweb # or :webmock
12
+ c.stub_with :webmock # or :fakeweb
25
13
  end
26
14
 
27
15
  class VCRTest < Test::Unit::TestCase
@@ -49,6 +37,7 @@ maintenance) and accurate (the response from example.com will contain the same h
49
37
  * [HTTPClient](http://github.com/nahi/httpclient) (WebMock)
50
38
  * [em-http-request](http://github.com/igrigorik/em-http-request) (WebMock)
51
39
  * [Net::HTTP](http://www.ruby-doc.org/stdlib/libdoc/net/http/rdoc/index.html) (FakeWeb and WebMock)
40
+ * [Typhoeus](https://github.com/pauldix/typhoeus)
52
41
  * And of course any library built on Net::HTTP, such as [Mechanize](http://github.com/tenderlove/mechanize),
53
42
  [HTTParty](http://github.com/jnunemaker/httparty) or [Rest Client](http://github.com/archiloque/rest-client).
54
43
  * Request matching is configurable based on HTTP method, URI, host, path, body and headers.
@@ -59,9 +48,13 @@ maintenance) and accurate (the response from example.com will contain the same h
59
48
  * Disables all HTTP requests that you don't explicitly allow.
60
49
  * Simple cucumber integration is provided using tags.
61
50
  * Known to work well with many popular ruby libraries including RSpec 1 & 2, Cucumber, Test::Unit,
62
- Capybara, Mechanize and Rest-Client.
51
+ Capybara, Mechanize, Rest-Client and HTTParty.
63
52
  * Extensively tested on 7 different ruby interpretters.
64
53
 
54
+ ## Usage
55
+
56
+ Visit the [wiki](http://github.com/myronmarston/vcr/wiki) for usage info and documentation.
57
+
65
58
  ## Development
66
59
 
67
60
  * Source hosted on [GitHub](http://github.com/myronmarston/vcr).
@@ -70,352 +63,7 @@ maintenance) and accurate (the response from example.com will contain the same h
70
63
  * Pull requests are very welcome! Please include spec and/or feature coverage for every patch,
71
64
  and create a topic branch for every separate change you make.
72
65
 
73
- ## Cassettes
74
-
75
- Cassettes are the medium to which VCR records HTTP interactions, and the medium from which it replays them.
76
- While a cassette is in use, new HTTP requests (or "new episodes", as VCR calls them) either get
77
- recorded, or an error will be raised, depending on the cassette's `:record` mode (see below). When you use
78
- a cassette that contains previously recorded HTTP interactions, it registers them with the http stubbing
79
- library of your choice (fakeweb or webmock) so that HTTP requests get the recorded response. Between test
80
- runs, cassettes are stored on disk as YAML files in your configured cassette library directory.
81
-
82
- Each cassette acts a bit like a sandbox: it has an effect on HTTP requests during the current test while it
83
- is inserted, but has no effect on the rest of your test suite.
84
-
85
- Cassettes can be configured with a few options:
86
-
87
- * `:record`: Specifies a record mode for this cassette.
88
- * `:erb`: Used for dynamic cassettes (see below for more details).
89
- * `:match_requests_on`: An array of request attributes to match on (see below for more details).
90
- * `:re_record_interval`: Controls automatic re-recording of the cassette (see below for more details).
91
-
92
- ## Record modes
93
-
94
- VCR supports 3 record modes. You can set a default record mode in your configuration (see below)
95
- and a per-cassette record mode when inserting a cassette. The record modes are:
96
-
97
- * `:new_episodes`: Previously recorded HTTP interactions will be replayed. New HTTP interactions will be recorded.
98
- This is generally the most useful mode. VCR will automatically record and replay new HTTP requests as your
99
- codebase evolves to make new requests.
100
- * `:all`: Previously recorded HTTP interactions will be ignored. All HTTP interactions will be recorded.
101
- This is useful if you're interested in using VCR to log your HTTP interactions but don't care to ever replay
102
- them. Alternately, you can temporarily change your record mode to `:all` to force it to re-record all requests.
103
- * `:none`: Previously recorded HTTP interactions will be replayed. New HTTP interactions will result in an error.
104
- This mode is useful when your code makes potentially dangerous HTTP requests (i.e. it hits a production
105
- server rather than a sandbox/staging server), as it will prevent any new requests from completing, raising
106
- an error instead. Generally, you will temporarily use the `:new_episodes` or `:all` record modes
107
- to perform the initial recording before changing it to `:none`.
108
-
109
- When no cassette is inserted, all HTTP requests will result in a `Real HTTP connections are disabled` error.
110
-
111
- ## Request Matching
112
-
113
- In order to properly replay previously recorded requests, VCR must match new HTTP requests to a previously
114
- recorded one. By default, it matches on HTTP method and URI, since that is usually deterministic and
115
- fully identifies the resource and action for typical RESTful APIs. In some cases (such as SOAP webservices)
116
- this may not work so well, and VCR allows you to customize how requests are matched.
117
-
118
- Cassettes take a `:match_requests_on` option that expects an array of request attributes to match on.
119
- Supported attributes are:
120
-
121
- * `:method`: The HTTP method (i.e. GET, POST, PUT or DELETE) of the request.
122
- * `:uri`: The full URI of the request.
123
- * `:host`: The host of the URI. You can use this (alone, or in combination with `:path`) as an alternative
124
- to `:uri` to cause VCR to match using a regex that matches the host.
125
- * `:path`: The path of the URI. You can use this (alone, or in combination with `:host`) as an alternative
126
- to `:uri` to cause VCR to match using a regex that matches the path.
127
- * `:body`: The body of the request.
128
- * `:headers`: The request headers.
129
-
130
- By default, VCR uses a `:match_requests_on` option like:
131
-
132
- :match_requests_on => [:uri, :method]
133
-
134
- If you want to match on another attribute, just add it to the array:
135
-
136
- :match_requests_on => [:uri, :method, :body]
137
-
138
- Note that FakeWeb cannot match on `:body` or `:headers`. In general, it is recommended that you configure
139
- your cassettes to match on the most specific set of attributes that is deterministic.
140
-
141
- ## Configuration
142
-
143
- require 'vcr'
144
-
145
- VCR.config do |c|
146
- c.cassette_library_dir = 'fixtures/cassette_library'
147
- c.http_stubbing_library = :fakeweb
148
- c.ignore_localhost = true
149
- c.default_cassette_options = { :record => :none }
150
- end
151
-
152
- This can go pretty much wherever, as long as this code is run before your tests, specs or scenarios. I tend
153
- to put it in `spec/support/vcr.rb`, `test/support/vcr.rb` or `features/support/vcr.rb`. You can set the following
154
- configuration options:
155
-
156
- * `cassette_library_dir`: VCR will save the cassette YAML files to this directory. If you are using Rails 3 and
157
- ActiveRecord YAML fixtures, you will probably want to avoid putting VCR cassettes in a sub-directory of
158
- `RAILS_ROOT/test/fixtures`. Rails will assume your cassette YAML files are ActiveRecord fixtures and raise an
159
- error when the content doesn't conform to its expectations.
160
- * `http_stubbing_library`: Which http stubbing library to use. Currently `:fakeweb` and `:webmock` are supported.
161
- VCR will automatically configure FakeWeb/WebMock for you; you do not need to reference either one at all.
162
- * `ignore_localhost`: Defaults to false. Setting it true does the following:
163
- * Localhost requests will proceed as normal. The "Real HTTP connections are disabled" error will not occur.
164
- * Localhost requests will not be recorded.
165
- * Previously recorded localhost requests will not be replayed.
166
- * `default_cassette_options`: The default options for your cassettes. These will be overridden by any options you
167
- set on each individual cassette.
168
-
169
- ## Usage with your favorite ruby test/spec framework
170
-
171
- VCR can easily be used with any ruby test or spec framework. Usually, you'll want to use `VCR.use_cassette`:
172
-
173
- VCR.use_cassette('geocoding/Seattle, WA', :record => :new_episodes) do
174
- # do something that makes an HTTP request
175
- end
176
-
177
- Alternately, with a framework like [shoulda](http://github.com/thoughtbot/shoulda), you can insert and eject a
178
- cassette with individual method calls from setup and teardown:
179
-
180
- context "Some object that makes an HTTP request" do
181
- setup do
182
- VCR.insert_cassette('geocoding/Seattle, WA', :record => :new_episodes)
183
- end
184
-
185
- should "make an HTTP request" do
186
- # ...
187
- end
188
-
189
- should "make another HTTP request" do
190
- # ...
191
- end
192
-
193
- teardown do
194
- VCR.eject_cassette
195
- end
196
- end
197
-
198
- ## Usage with RSpec
199
-
200
- If you're using RSpec, you can use a special macro provided by VCR:
201
-
202
- describe MyApiClient do
203
- context "create" do
204
- # Pass use_vcr_cassette the same args you would pass VCR.use_cassette.
205
- use_vcr_cassette "my_api_client/create", :record => :new_episodes
206
-
207
- it "makes an HTTP request"
208
- it "makes another HTTP request"
209
- end
210
-
211
- context "destroy" do
212
- # You can leave off the cassette name and it will be inferred from the example group
213
- # descriptions--in this case "MyApiClient/destroy".
214
- # You can also leave off the options hash--the configured default options will be used.
215
- use_vcr_cassette :record => :new_episodes, :match_requests_on => [:uri, :method, :body]
216
-
217
- it "makes an HTTP request"
218
- it "makes another HTTP request"
219
- end
220
- end
221
-
222
- To use this, you need to configure RSpec to make the `use_vcr_cassette` available as a macro.
223
- Here's how to do that for RSpec 1:
224
-
225
- require 'vcr'
226
-
227
- Spec::Runner.configure do |c|
228
- c.extend VCR::RSpec::Macros
229
- end
230
-
231
- Or for RSpec 2:
232
-
233
- require 'vcr'
234
-
235
- RSpec.configure do |c|
236
- c.extend VCR::RSpec::Macros
237
- end
238
-
239
- ## Usage with Cucumber
240
-
241
- VCR provides additional support for cucumber. You can of course use `VCR.use_cassette` within a step definition,
242
- and that's the recommended way for any of your custom step definitions. But many times I find myself using generic
243
- step definitions provided by another library (such as the webrat/capybara web steps generated by cucumber-rails),
244
- and you don't want to modify these. VCR provides cucumber tagging support to help in these cases.
245
-
246
- First, tag your scenario with something descriptive:
247
-
248
- @facebook_http_request
249
- Scenario: Sign up with facebook connect
250
-
251
- Then let VCR know about this tag, in `features/support/vcr.rb` (or some similar support file):
252
-
253
- VCR.cucumber_tags do |t|
254
- t.tags '@facebook_http_request', '@twitter_status_update', :record => :none
255
- t.tags '@another_scenario_tag'
256
- end
257
-
258
- For each of the tags you specify in your `cucumber_tags` block, VCR will set up an appropriate
259
- [After hook](http://wiki.github.com/aslakhellesoy/cucumber/hooks) to use a cassette
260
- for the entire scenario. The tag (minus the '@') will be used as the cassette name, and it'll
261
- go in the `cucumber_tags` subdirectory of the configured cassette library directory.
262
-
263
- If the last argument to `#tags` is a hash, VCR will use it as the options for the named cassettes.
264
-
265
- ## Usage with Capybara
266
-
267
- When you use any of the javascript-enabled drivers (selenium, celerity, culerity) with
268
- [capybara](http://github.com/jnicklas/capybara), it'll need to ping the app running on localhost.
269
- Set the `ignore_localhost` option to true to allow this.
270
-
271
- ## Cassette Customization
272
-
273
- Cassettes are stored as simple plain text YAML files and can easily be edited to suit your needs. One common need
274
- is for a particular request to be stubbed using a regex rather than the raw URL. This is handy for URLs that contain
275
- non-deterministic portions (such as timestamps)--since the URL will be a bit different each time, the URL from the
276
- recorded request will not match the URL for future requests. You can simply change the URL to the YAML of the
277
- appropriate regex.
278
-
279
- Figure out the yaml in irb:
280
-
281
- >> require 'yaml'
282
- => true
283
- >> puts /example\.com\/\d+/.to_yaml
284
- --- !ruby/regexp /example\.com\/\d+/
285
-
286
- Edit your cassette file:
287
-
288
- request: !ruby/struct:VCR::Request
289
- method: :get
290
- uri: !ruby/regexp /example\.com\/\d+/
291
- body:
292
- headers:
293
-
294
- Note that it may be simpler (and better!) to use the `:match_requests_on` cassette option with `:host` and/or `:path`,
295
- as that gives you a a URL regex without the need to manually edit the cassette file. If you do change a url to a regex
296
- in a cassette file, VCR will use it, regardless of the `:match_requests_on` setting.
297
-
298
- ## Dynamic Cassettes
299
-
300
- VCR's default recording and replaying is static. The exact response that is initially recorded will
301
- be replayed for all future requests. Usually this is fine, but in some cases you need something more
302
- dynamic. You can use [ERB](http://www.ruby-doc.org/stdlib/libdoc/erb/rdoc/) for this.
303
-
304
- Enable ERB evaluation of a cassette using the `:erb` option:
305
-
306
- VCR.use_cassette('user-subscription', :erb => true) do
307
- # do something that makes an HTTP request
308
- end
309
-
310
- You can use variables in your cassette's ERB by passing a hash:
311
-
312
- VCR.use_cassette('user-subscription', :erb => { :user => User.last }) do
313
- # do something that makes an HTTP request
314
- end
315
-
316
- In your cassette:
317
-
318
- request: !ruby/struct:VCR::Request
319
- method: :get
320
- uri: http://some-domain.com:80/users/<%= user.id %>
321
- body:
322
- headers:
323
- ...
324
- response: !ruby/struct:VCR::Response
325
- ...
326
- body: Hello, <%= user.name %>!
327
-
328
- ## Automatic cassette re-recording
329
-
330
- Over time, your cassettes may get out-of-date. APIs change and sites you scrape get updated. VCR provides
331
- a facility to automatically re-record your cassettes. You enable re-recording using the
332
- `:re_record_interval` option:
333
-
334
- A_WEEK = 7 * 24 * 60 * 60 # or use 7.days if you're using ActiveSupport
335
-
336
- VCR.use_cassette('my_cassette', :re_record_interval => A_WEEK) { ... }
337
-
338
- If the cassette file was last modified more than 7 days ago, VCR will use the `:all` record mode (regardless
339
- of the configured record mode) to allow new HTTP requests and record them. VCR will check to make sure you
340
- have an internet connection before doing this, so if you are running the tests without one, the automatic
341
- re-recording will not kick in.
342
-
343
- ## FakeWeb or WebMock?
344
-
345
- VCR works fine with either FakeWeb or WebMock. Overall, WebMock has more features, and you'll need to use
346
- WebMock if you want to use VCR with an HTTP library besides Net::HTTP. However, FakeWeb is currently
347
- about three times faster than WebMock, so you may want to stick with FakeWeb if you don't need WebMock's
348
- additional features. You can see the
349
- [benchmarks](http://github.com/myronmarston/vcr/blob/master/benchmarks/http_stubbing_libraries.rb) for
350
- more details.
351
-
352
- You should not need to directly interact with either FakeWeb or WebMock. VCR will take care of disallowing
353
- http connections when no cassette is inserted, and it will clean up all stubs/registrations when a cassette
354
- is ejected. If you ever decide to switch HTTP stubbing libraries, you'll just have to update the VCR config
355
- setting.
356
-
357
- ## Suggested Workflow
358
-
359
- First, configure VCR as I have above. I like setting the default record mode to `:none`
360
- so that no new HTTP requests are made without me explicitly allowing it, but if you may prefer to
361
- set it to `:new_episodes`.
362
-
363
- When an HTTP request is made, you'll get an error such as:
364
-
365
- Real HTTP connections are disabled. Unregistered request: get http://example.com
366
-
367
- Find the place that is making the HTTP request (the backtrace should help here). If you've already recorded this HTTP
368
- request to a cassette from a different test, you can simply re-use the cassette. Use `VCR.use_cassette`, as
369
- shown above. You may also want to refactor this into a helper method that sets up the VCR cassette and does whatever
370
- makes the HTTP request:
371
-
372
- def set_user_address(user, address, city, state)
373
- VCR.use_cassette("geocoding/#{address}, #{city}, #{state}", :record => :new_episodes) do
374
- user.address.update_attributes!(:address => address, :city => city, :state => state)
375
- end
376
- end
377
-
378
- In this case, I've used a dynamic cassette name based on the address being geocoded. That way, each separate address
379
- gets a different cassette, and tests that set the same user address will reuse the same cassette. I've also set
380
- the record mode to `:new_episodes` so that VCR will automatically record geocoding requests for a new address
381
- to a new cassette, without me having to change any code.
382
-
383
- If the HTTP request that triggered the error is new, you'll have to record it for the first time. Simply use
384
- `VCR.use_cassette` with the record mode set to `:new_episodes` or `:all`. Run the test again, and VCR will
385
- record the HTTP interaction. I usually remove the record mode at this point so that it uses the default
386
- of `:none` in the future. Future test runs will get the recorded response, and if your code changes so
387
- that it is making a new HTTP request, you'll be notified by an error as shown above.
388
-
389
- VCR is designed to be used very granularly. Rather than inserting a global cassette, I recommend you wrap individual
390
- blocks of code in `VCR.use_cassette` and record logically grouped sets of requests.
391
-
392
- ## Ruby Interpreter Compatibility
393
-
394
- VCR has been tested on the following ruby interpreters:
395
-
396
- * MRI 1.8.6-p399
397
- * MRI 1.8.7-p302
398
- * MRI 1.9.1-p378
399
- * MRI 1.9.2-p0
400
- * REE 1.8.7-2010.02
401
- * JRuby 1.5.1
402
- * Rubinius 1.1
403
-
404
- ## Notes, etc.
405
-
406
- * The objects serialized to the cassette YAML files changed with the 0.4 release. Cassettes recorded with
407
- older versions of VCR will not work with VCR 0.4.0 and later. However, VCR provides a rake task to migrate
408
- your old cassettes to the new format--see the [changelog](http://github.com/myronmarston/vcr/blob/master/CHANGELOG.md)
409
- for more info.
410
- * The cassette name determines the name of the library file for the given cassette. Strings or symbols are fine,
411
- and you can include any characters, but spaces and invalid file name characters will be removed
412
- before the cassette reads or writes to its library file.
413
- * You can use a directory separator (i.e. '/') in your cassette names to cause it to use a subdirectory
414
- of the cassette library directory. The cucumber tagging support uses this.
415
- * VCR maintains a simple stack of cassettes. This allows you to nest them as deeply as you want.
416
- This is particularly useful when you have a cucumber step definition that uses a cassette, and
417
- you also want to use a cassette for the entire scenario using the tagging support.
418
- * If you find VCR useful, please recommend me on [working with rails](http://workingwithrails.com/person/16590-myron-marston).
66
+ If you find VCR useful, please recommend me on [working with rails](http://workingwithrails.com/person/16590-myron-marston).
419
67
 
420
68
  ## Thanks
421
69
 
@@ -424,6 +72,8 @@ VCR has been tested on the following ruby interpreters:
424
72
  * [Chris Kampmeier](http://github.com/chrisk) for [FakeWeb](http://github.com/chrisk/fakeweb).
425
73
  * [Chris Young](http://github.com/chrisyoung) for [NetRecorder](http://github.com/chrisyoung/netrecorder),
426
74
  the inspiration for VCR.
75
+ * [David Balatero](https://github.com/dbalatero) for help with [Typhoeus](https://github.com/pauldix/typhoeus)
76
+ support.
427
77
 
428
78
  Thanks also to the following people who have contributed patches or helpful suggestions:
429
79
 
@@ -432,17 +82,6 @@ Thanks also to the following people who have contributed patches or helpful sugg
432
82
  * [Ben Hutton](http://github.com/benhutton)
433
83
  * [Eric Allam](http://github.com/rubymaverick)
434
84
 
435
- ## Similar Libraries
436
-
437
- If VCR doesn't meet your needs, please [open an issue](http://github.com/myronmarston/vcr/issues) and let me know
438
- how VCR could be improved. You may also want to try one of these similar libraries:
439
-
440
- * [Stale Fish](http://github.com/jsmestad/stale_fish)
441
- * [NetRecorder](http://github.com/chrisyoung/netrecorder)
442
- * [Ephemeral Response](http://github.com/sandro/ephemeral_response)
443
- * [Net::HTTP Spy](http://github.com/martinbtt/net-http-spy)
444
- * [WebFixtures](http://github.com/trydionel/web_fixtures)
445
-
446
85
  ## Copyright
447
86
 
448
87
  Copyright (c) 2010 Myron Marston. See LICENSE for details.