support using py.test.raises in context manager style
--HG-- branch : trunk
This commit is contained in:
parent
8ece058256
commit
d1c8209875
|
@ -358,13 +358,22 @@ def raises(ExpectedException, *args, **kwargs):
|
||||||
if args[0] is a string: raise AssertionError if executing the
|
if args[0] is a string: raise AssertionError if executing the
|
||||||
the string in the calling scope does not raise expected exception.
|
the string in the calling scope does not raise expected exception.
|
||||||
for examples:
|
for examples:
|
||||||
x = 5
|
>>> x = 5
|
||||||
raises(TypeError, lambda x: x + 'hello', x=x)
|
>>> raises(TypeError, lambda x: x + 'hello', x=x)
|
||||||
raises(TypeError, "x + 'hello'")
|
>>> raises(TypeError, "x + 'hello'")
|
||||||
|
|
||||||
|
if no code/callable is given, it asumes you want a contextmanager
|
||||||
|
|
||||||
|
>>> with raises(ZeroDivisionError):
|
||||||
|
... 1/0
|
||||||
|
>>> with raises(TypeError):
|
||||||
|
... 1 + 'a'
|
||||||
"""
|
"""
|
||||||
__tracebackhide__ = True
|
__tracebackhide__ = True
|
||||||
assert args
|
|
||||||
if isinstance(args[0], str):
|
if not args:
|
||||||
|
return RaisesContext(ExpectedException)
|
||||||
|
elif isinstance(args[0], str):
|
||||||
code, = args
|
code, = args
|
||||||
assert isinstance(code, str)
|
assert isinstance(code, str)
|
||||||
frame = sys._getframe(1)
|
frame = sys._getframe(1)
|
||||||
|
@ -391,6 +400,26 @@ def raises(ExpectedException, *args, **kwargs):
|
||||||
raise ExceptionFailure(msg="DID NOT RAISE",
|
raise ExceptionFailure(msg="DID NOT RAISE",
|
||||||
expr=args, expected=ExpectedException)
|
expr=args, expected=ExpectedException)
|
||||||
|
|
||||||
|
|
||||||
|
class RaisesContext(object):
|
||||||
|
|
||||||
|
def __init__(self, ExpectedException):
|
||||||
|
self.ExpectedException = ExpectedException
|
||||||
|
self.excinfo = None
|
||||||
|
|
||||||
|
def __enter__(self):
|
||||||
|
return self
|
||||||
|
|
||||||
|
def __exit__(self, *tp):
|
||||||
|
__tracebackhide__ = True
|
||||||
|
if tp[0] is None:
|
||||||
|
raise ExceptionFailure(msg="DID NOT RAISE",
|
||||||
|
expr=(),
|
||||||
|
expected=self.ExpectedException)
|
||||||
|
self.excinfo = py.code.ExceptionInfo(tp)
|
||||||
|
return issubclass(self.excinfo.type, self.ExpectedException)
|
||||||
|
|
||||||
|
|
||||||
raises.Exception = ExceptionFailure
|
raises.Exception = ExceptionFailure
|
||||||
|
|
||||||
def importorskip(modname, minversion=None):
|
def importorskip(modname, minversion=None):
|
||||||
|
|
|
@ -340,6 +340,37 @@ class TestRaises:
|
||||||
except py.test.raises.Exception:
|
except py.test.raises.Exception:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
@py.test.mark.skipif('sys.version < "2.5"')
|
||||||
|
def test_raises_as_contextmanager(self, testdir):
|
||||||
|
testdir.makepyfile("""
|
||||||
|
from __future__ import with_statement
|
||||||
|
import py
|
||||||
|
|
||||||
|
def test_simple():
|
||||||
|
with py.test.raises(ZeroDivisionError) as ctx:
|
||||||
|
1/0
|
||||||
|
|
||||||
|
print ctx.excinfo
|
||||||
|
assert ctx.excinfo.type is ZeroDivisionError
|
||||||
|
|
||||||
|
|
||||||
|
def test_noraise():
|
||||||
|
with py.test.raises(py.test.raises.Exception):
|
||||||
|
with py.test.raises(ValueError):
|
||||||
|
int()
|
||||||
|
|
||||||
|
def test_raise_wrong_exception_passes_by():
|
||||||
|
with py.test.raises(ZeroDivisionError):
|
||||||
|
with py.test.raises(ValueError):
|
||||||
|
1/0
|
||||||
|
""")
|
||||||
|
result = testdir.runpytest()
|
||||||
|
result.stdout.fnmatch_lines([
|
||||||
|
'*3 passed*',
|
||||||
|
])
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
def test_pytest_exit():
|
def test_pytest_exit():
|
||||||
try:
|
try:
|
||||||
py.test.exit("hello")
|
py.test.exit("hello")
|
||||||
|
|
Loading…
Reference in New Issue