Merge branch '653-deprecated-context-manager' of https://github.com/chiller/pytest into features

This commit is contained in:
Ronny Pfannschmidt 2015-09-22 15:14:06 +02:00
commit 36924b59bd
5 changed files with 29 additions and 2 deletions

View File

@ -28,6 +28,7 @@ Dave Hunt
David Mohr David Mohr
Edison Gustavo Muenz Edison Gustavo Muenz
Eduardo Schettino Eduardo Schettino
Endre Galaczi
Elizaveta Shashkova Elizaveta Shashkova
Eric Hunsberger Eric Hunsberger
Eric Siegerman Eric Siegerman

View File

@ -14,6 +14,7 @@
- Fix issue #411: Add __eq__ method to assertion comparison example. - Fix issue #411: Add __eq__ method to assertion comparison example.
Thanks Ben Webb. Thanks Ben Webb.
- Fix issue #653: deprecated_call can be used as context manager.
- fix issue 877: propperly handle assertion explanations with non-ascii repr - fix issue 877: propperly handle assertion explanations with non-ascii repr
Thanks Mathieu Agopian for the report and Ronny Pfannschmidt for the PR. Thanks Mathieu Agopian for the report and Ronny Pfannschmidt for the PR.

View File

@ -28,9 +28,17 @@ def pytest_namespace():
'warns': warns} 'warns': warns}
def deprecated_call(func, *args, **kwargs): def deprecated_call(func=None, *args, **kwargs):
"""Assert that ``func(*args, **kwargs)`` triggers a DeprecationWarning. """Assert that ``func(*args, **kwargs)`` triggers a DeprecationWarning.
This function can be used as a context manager::
>>> with deprecated_call():
... myobject.deprecated_method()
""" """
if not func:
return WarningsChecker(expected_warning=DeprecationWarning)
wrec = WarningsRecorder() wrec = WarningsRecorder()
with wrec: with wrec:
warnings.simplefilter('always') # ensure all warnings are triggered warnings.simplefilter('always') # ensure all warnings are triggered
@ -149,8 +157,8 @@ class WarningsRecorder(object):
self._module.showwarning = showwarning self._module.showwarning = showwarning
# allow the same warning to be raised more than once # allow the same warning to be raised more than once
self._module.simplefilter('always', append=True)
self._module.simplefilter('always')
return self return self
def __exit__(self, *exc_info): def __exit__(self, *exc_info):

View File

@ -114,3 +114,9 @@ command ``warnings.simplefilter('always')``::
warnings.warn("deprecated", DeprecationWarning) warnings.warn("deprecated", DeprecationWarning)
assert len(recwarn) == 1 assert len(recwarn) == 1
assert recwarn.pop(DeprecationWarning) assert recwarn.pop(DeprecationWarning)
You can also use it as a contextmanager::
def test_global():
with pytest.deprecated_call():
myobject.deprecated_method()

View File

@ -79,6 +79,7 @@ def dep_explicit(i):
filename="hello", lineno=3) filename="hello", lineno=3)
class TestDeprecatedCall(object): class TestDeprecatedCall(object):
def test_deprecated_call_raises(self): def test_deprecated_call_raises(self):
excinfo = pytest.raises(AssertionError, excinfo = pytest.raises(AssertionError,
"pytest.deprecated_call(dep, 3)") "pytest.deprecated_call(dep, 3)")
@ -111,6 +112,16 @@ class TestDeprecatedCall(object):
pytest.deprecated_call(dep_explicit, 0) pytest.deprecated_call(dep_explicit, 0)
pytest.deprecated_call(dep_explicit, 0) pytest.deprecated_call(dep_explicit, 0)
def test_deprecated_call_as_context_manager_no_warning(self):
with pytest.raises(pytest.fail.Exception) as ex:
with pytest.deprecated_call():
dep(1)
assert str(ex.value) == "DID NOT WARN"
def test_deprecated_call_as_context_manager(self):
with pytest.deprecated_call():
dep(0)
class TestWarns(object): class TestWarns(object):
def test_strings(self): def test_strings(self):