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

Add test_case method to VCR

this method provides a class that can be inherited from to decorate all
test methods on the desired class with use_cassette using the relevant vcr
This commit is contained in:
Ivan Malison
2015-08-28 01:40:35 -07:00
parent 420f83b6b1
commit 6fd04f3675
3 changed files with 49 additions and 2 deletions

View File

@@ -1,11 +1,13 @@
import os import os
import pytest import pytest
from six.moves import http_client as httplib
from vcr import VCR, use_cassette from vcr import VCR, use_cassette
from vcr.compat import mock from vcr.compat import mock
from vcr.request import Request from vcr.request import Request
from vcr.stubs import VCRHTTPSConnection from vcr.stubs import VCRHTTPSConnection
from vcr.patch import _HTTPConnection, force_reset
def test_vcr_use_cassette(): def test_vcr_use_cassette():
@@ -243,6 +245,7 @@ def test_path_transformer():
def test_cassette_name_generator_defaults_to_using_module_function_defined_in(): def test_cassette_name_generator_defaults_to_using_module_function_defined_in():
vcr = VCR(inject_cassette=True) vcr = VCR(inject_cassette=True)
@vcr.use_cassette @vcr.use_cassette
def function_name(cassette): def function_name(cassette):
assert cassette._path == os.path.join(os.path.dirname(__file__), assert cassette._path == os.path.join(os.path.dirname(__file__),
@@ -274,3 +277,19 @@ def test_additional_matchers():
function_defaults() function_defaults()
function_additional() function_additional()
class TestVCRClass(VCR().test_case()):
def no_decoration(self):
assert httplib.HTTPConnection == _HTTPConnection
def test_one(self):
with force_reset():
self.no_decoration()
with force_reset():
self.test_two()
assert httplib.HTTPConnection != _HTTPConnection
def test_two(self):
assert httplib.HTTPConnection != _HTTPConnection

View File

@@ -2,19 +2,25 @@ import copy
import functools import functools
import inspect import inspect
import os import os
import types
import six import six
from .compat import collections from .compat import collections
from .cassette import Cassette from .cassette import Cassette
from .serializers import yamlserializer, jsonserializer from .serializers import yamlserializer, jsonserializer
from .util import compose from .util import compose, auto_decorate
from . import matchers from . import matchers
from . import filters from . import filters
class VCR(object): class VCR(object):
@staticmethod
def is_test_method(method_name, function):
return method_name.startswith('test') and \
isinstance(function, types.FunctionType)
@staticmethod @staticmethod
def ensure_suffix(suffix): def ensure_suffix(suffix):
def ensure(path): def ensure(path):
@@ -202,7 +208,7 @@ class VCR(object):
if filter_query_parameters: if filter_query_parameters:
filter_functions.append(functools.partial( filter_functions.append(functools.partial(
filters.remove_query_parameters, filters.remove_query_parameters,
query_parameters_to_remove=filter_query_parameters query_parameters_to_remove=filter_query_parameters
)) ))
if filter_post_data_parameters: if filter_post_data_parameters:
filter_functions.append( filter_functions.append(
@@ -250,3 +256,7 @@ class VCR(object):
def register_matcher(self, name, matcher): def register_matcher(self, name, matcher):
self.matchers[name] = matcher self.matchers[name] = matcher
def test_case(self, predicate=None):
predicate = predicate or self.is_test_method
return six.with_metaclass(auto_decorate(self.use_cassette, predicate))

View File

@@ -1,4 +1,6 @@
import collections import collections
import types
# Shamelessly stolen from https://github.com/kennethreitz/requests/blob/master/requests/structures.py # Shamelessly stolen from https://github.com/kennethreitz/requests/blob/master/requests/structures.py
class CaseInsensitiveDict(collections.MutableMapping): class CaseInsensitiveDict(collections.MutableMapping):
@@ -90,3 +92,19 @@ def read_body(request):
if hasattr(request.body, 'read'): if hasattr(request.body, 'read'):
return request.body.read() return request.body.read()
return request.body return request.body
def auto_decorate(
decorator,
predicate=lambda name, value: isinstance(value, types.FunctionType)
):
class DecorateAll(type):
def __new__(cls, name, bases, attributes_dict):
for attribute, value in attributes_dict.items():
if predicate(attribute, value):
attributes_dict[attribute] = decorator(value)
return super(DecorateAll, cls).__new__(
cls, name, bases, attributes_dict
)
return DecorateAll