1
0
mirror of https://github.com/kevin1024/vcrpy.git synced 2025-12-09 01:03:24 +00:00

Add use_cassette class so functinos that are decorated with use_cassette can be called multiple times.

This commit is contained in:
Ivan Malison
2014-09-16 23:32:28 -07:00
parent 20057a6815
commit cb05f4163c
3 changed files with 45 additions and 5 deletions

View File

@@ -68,6 +68,22 @@ def test_cassette_cant_read_same_request_twice():
a.play_response('foo')
@mock.patch('vcr.cassette.requests_match', return_value=True)
@mock.patch('vcr.cassette.load_cassette', lambda *args, **kwargs: (('foo',), (mock.MagicMock(),)))
@mock.patch('vcr.cassette.Cassette.can_play_response_for', return_value=True)
@mock.patch('vcr.stubs.VCRHTTPResponse')
def test_function_decorated_with_use_cassette_can_be_invoked_multiple_times(*args):
from six.moves import http_client as httplib
@Cassette.use_cassette('test')
def decorated_function():
conn = httplib.HTTPConnection("www.python.org")
conn.request("GET", "/index.html")
conn.getresponse()
for i in range(2):
decorated_function()
def test_cassette_not_all_played():
a = Cassette('test')
a.append('foo', 'bar')

View File

@@ -1,12 +1,10 @@
'''The container for recorded requests and responses'''
import functools
try:
from collections import Counter
except ImportError:
from .compat.counter import Counter
from contextdecorator import ContextDecorator
# Internal imports
from .patch import install, reset
from .persist import load_cassette, save_cassette
@@ -16,7 +14,29 @@ from .matchers import requests_match, uri, method
from .errors import UnhandledHTTPRequestError
class Cassette(ContextDecorator):
class use_cassette(object):
def __init__(self, cls, *args, **kwargs):
self.args = args
self.kwargs = kwargs
self.cls = cls
def __enter__(self):
self._cassette = self.cls.load(*self.args, **self.kwargs)
return self._cassette.__enter__()
def __exit__(self, *args):
return self._cassette.__exit__(*args)
def __call__(self, function):
@functools.wraps(function)
def wrapped(*args, **kwargs):
with self:
return function(*args, **kwargs)
return wrapped
class Cassette(object):
'''A container for recorded requests and responses'''
@classmethod
@@ -26,6 +46,10 @@ class Cassette(ContextDecorator):
new_cassette._load()
return new_cassette
@classmethod
def use_cassette(cls, *args, **kwargs):
return use_cassette(cls, *args, **kwargs)
def __init__(self,
path,
serializer=yamlserializer,

View File

@@ -103,7 +103,7 @@ class VCR(object):
),
}
return Cassette.load(path, **merged_config)
return Cassette.use_cassette(path, **merged_config)
def register_serializer(self, name, serializer):
self.serializers[name] = serializer