40 lines
1.3 KiB
Python
40 lines
1.3 KiB
Python
import sys
|
|
import py
|
|
ExceptionFailure = py.test.Item.ExceptionFailure
|
|
|
|
def raises(ExpectedException, *args, **kwargs):
|
|
""" raise AssertionError, if target code does not raise the expected
|
|
exception.
|
|
"""
|
|
assert args
|
|
__tracebackhide__ = True
|
|
if isinstance(args[0], str):
|
|
expr, = args
|
|
assert isinstance(expr, str)
|
|
frame = sys._getframe(1)
|
|
loc = frame.f_locals.copy()
|
|
loc.update(kwargs)
|
|
#print "raises frame scope: %r" % frame.f_locals
|
|
source = py.code.Source(expr)
|
|
try:
|
|
exec source.compile() in frame.f_globals, loc
|
|
#del __traceback__
|
|
# XXX didn'T mean f_globals == f_locals something special?
|
|
# this is destroyed here ...
|
|
except ExpectedException:
|
|
return py.code.ExceptionInfo()
|
|
else:
|
|
func = args[0]
|
|
assert callable
|
|
try:
|
|
func(*args[1:], **kwargs)
|
|
#del __traceback__
|
|
except ExpectedException:
|
|
return py.code.ExceptionInfo()
|
|
k = ", ".join(["%s=%r" % x for x in kwargs.items()])
|
|
if k:
|
|
k = ', ' + k
|
|
expr = '%s(%r%s)' %(func.__name__, args, k)
|
|
raise ExceptionFailure(msg="DID NOT RAISE",
|
|
expr=args, expected=ExpectedException)
|