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:
@@ -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
|
||||||
|
|||||||
@@ -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))
|
||||||
|
|||||||
18
vcr/util.py
18
vcr/util.py
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user