Your IP : 216.73.216.196
# Copyright (c) 2008-2014 Simplistix Ltd
# See license.txt for license details.
from testfixtures import Comparison as C, ShouldRaise, should_raise
from unittest import TestCase
from .compat import py_33_plus
class TestShouldRaise(TestCase):
def test_no_params(self):
def to_test():
raise ValueError('wrong value supplied')
should_raise(ValueError('wrong value supplied'))(to_test)()
def test_no_exception(self):
def to_test():
pass
try:
should_raise(ValueError())(to_test)()
except AssertionError as e:
self.assertEqual(
e,
C(AssertionError('None raised, ValueError() expected'))
)
else:
self.fail('No exception raised!')
def test_wrong_exception(self):
def to_test():
raise ValueError('bar')
try:
should_raise(ValueError('foo'))(to_test)()
except AssertionError as e:
self.assertEqual(
e,
C(AssertionError(
"ValueError('bar',) raised, ValueError('foo',) expected"
)))
else:
self.fail('No exception raised!')
def test_only_exception_class(self):
def to_test():
raise ValueError('bar')
should_raise(ValueError)(to_test)()
def test_no_supplied_or_raised(self):
# effectvely we're saying "something should be raised!"
# but we want to inspect s.raised rather than making
# an up-front assertion
def to_test():
pass
try:
should_raise()(to_test)()
except AssertionError as e:
self.assertEqual(
e,
C(AssertionError("No exception raised!"))
)
else:
self.fail('No exception raised!')
def test_args(self):
def to_test(*args):
raise ValueError('%s' % repr(args))
should_raise(ValueError('(1,)'))(to_test)(1)
def test_kw_to_args(self):
def to_test(x):
raise ValueError('%s' % x)
should_raise(ValueError('1'))(to_test)(x=1)
def test_kw(self):
def to_test(**kw):
raise ValueError('%r' % kw)
should_raise(ValueError("{'x': 1}"))(to_test)(x=1)
def test_both(self):
def to_test(*args, **kw):
raise ValueError('%r %r' % (args, kw))
should_raise(ValueError("(1,) {'x': 2}"))(to_test)(1, x=2)
def test_method_args(self):
class X:
def to_test(self, *args):
self.args = args
raise ValueError()
x = X()
should_raise(ValueError)(x.to_test)(1, 2, 3)
self.assertEqual(x.args, (1, 2, 3))
def test_method_kw(self):
class X:
def to_test(self, **kw):
self.kw = kw
raise ValueError()
x = X()
should_raise(ValueError)(x.to_test)(x=1, y=2)
self.assertEqual(x.kw, {'x': 1, 'y': 2})
def test_method_both(self):
class X:
def to_test(self, *args, **kw):
self.args = args
self.kw = kw
raise ValueError()
x = X()
should_raise(ValueError)(x.to_test)(1, y=2)
self.assertEqual(x.args, (1, ))
self.assertEqual(x.kw, {'y': 2})
def test_class_class(self):
class Test:
def __init__(self, x):
# The TypeError is raised due to the mis-matched parameters
# so the pass never gets executed
pass # pragma: no cover
should_raise(TypeError)(Test)()
def test_raised(self):
with ShouldRaise() as s:
raise ValueError('wrong value supplied')
self.assertEqual(s.raised, C(ValueError('wrong value supplied')))
def test_catch_baseexception_1(self):
with ShouldRaise(SystemExit):
raise SystemExit()
def test_catch_baseexception_2(self):
with ShouldRaise(KeyboardInterrupt):
raise KeyboardInterrupt()
def test_with_exception_class_supplied(self):
with ShouldRaise(ValueError):
raise ValueError('foo bar')
def test_with_exception_supplied(self):
with ShouldRaise(ValueError('foo bar')):
raise ValueError('foo bar')
def test_with_exception_supplied_wrong_args(self):
try:
with ShouldRaise(ValueError('foo')):
raise ValueError('bar')
except AssertionError as e:
self.assertEqual(
e,
C(AssertionError(
"ValueError('bar',) raised, ValueError('foo',) expected"
)))
else:
self.fail('No exception raised!')
def test_neither_supplied(self):
with ShouldRaise():
raise ValueError('foo bar')
def test_with_no_exception_when_expected(self):
try:
with ShouldRaise(ValueError('foo')):
pass
except AssertionError as e:
self.assertEqual(
e,
C(AssertionError("None raised, ValueError('foo',) expected"))
)
else:
self.fail('No exception raised!')
def test_with_no_exception_when_neither_expected(self):
try:
with ShouldRaise():
pass
except AssertionError as e:
self.assertEqual(
e,
C(AssertionError("No exception raised!"))
)
else:
self.fail('No exception raised!')
def test_with_getting_raised_exception(self):
with ShouldRaise() as s:
raise ValueError('foo bar')
self.assertEqual(C(ValueError('foo bar')), s.raised)
def test_import_errors_1(self):
if py_33_plus:
message = "No module named 'textfixtures'"
else:
message = 'No module named textfixtures.foo.bar'
with ShouldRaise(ImportError(message)):
import textfixtures.foo.bar
def test_import_errors_2(self):
with ShouldRaise(ImportError('X')):
raise ImportError('X')
def test_custom_exception(self):
class FileTypeError(Exception):
def __init__(self, value):
self.value = value
with ShouldRaise(FileTypeError('X')):
raise FileTypeError('X')
def test_assert_keyerror_raised(self):
expected = "KeyError('foo',) raised, AttributeError('foo',) expected"
class Dodgy(dict):
def __getattr__(self, name):
# NB: we forgot to turn our KeyError into an attribute error
return self[name]
try:
with ShouldRaise(AttributeError('foo')):
Dodgy().foo
except AssertionError as e:
self.assertEqual(
C(AssertionError(expected)),
e
)
else:
self.fail('No exception raised!')
def test_decorator_usage(self):
@should_raise(ValueError('bad'))
def to_test():
raise ValueError('bad')
to_test()
def test_unless_false_okay(self):
with ShouldRaise(unless=False):
raise AttributeError()
def test_unless_false_bad(self):
try:
with ShouldRaise(unless=False):
pass
except AssertionError as e:
self.assertEqual(e, C(AssertionError("No exception raised!")))
else:
self.fail('No exception raised!')
def test_unless_true_okay(self):
with ShouldRaise(unless=True):
pass
def test_unless_true_not_okay(self):
try:
with ShouldRaise(unless=True):
raise AttributeError('foo')
except AssertionError as e:
self.assertEqual(e, C(AssertionError(
"AttributeError('foo',) raised, no exception expected"
)))
else:
self.fail('No exception raised!')
def test_unless_decorator_usage(self):
@should_raise(unless=True)
def to_test():
pass
to_test()
def test_identical_reprs(self):
class AnnoyingException(Exception):
def __init__(self, **kw):
self.other = kw.get('other')
try:
with ShouldRaise(AnnoyingException(other='bar')):
raise AnnoyingException(other='baz')
except AssertionError as e:
print(repr(e))
self.assertEqual(
C(AssertionError(
"AnnoyingException() raised, AnnoyingException() expected,"
" attributes differ:\n"
" other:'bar' != 'baz'"
)),
e,
)
else:
self.fail('No exception raised!')