Source code for arsenal.assertions


[docs]class assert_throws(object): """ Contextmanager + Decorator for asserting that a certain exceptions (or no exception) will arise with it's context. As a context manager: >>> with assert_throws(ZeroDivisionError): ... 1/0 >>> with assert_throws(None): ... pass >>> with assert_throws(None, ZeroDivisionError): ... pass >>> with assert_throws(ZeroDivisionError): ... pass Traceback (most recent call last): ... AssertionError: did not raise required ZeroDivisionError. Got None instead. >>> with assert_throws(AssertionError, ZeroDivisionError): ... pass Traceback (most recent call last): ... AssertionError: did not raise required AssertionError or ZeroDivisionError. Got None instead. """ def __init__(self, *expect): self.expect = expect super(assert_throws, self).__init__() def __enter__(self, *_): pass def __exit__(self, exc, val, _): msg = ' or '.join('None' if e is None else e.__name__ for e in self.expect) if exc is None: if None not in self.expect: raise AssertionError('did not raise required %s. Got %s instead.' % (msg, None)) else: if not issubclass(exc, self.expect): raise AssertionError('did not raise required %s. Got %s instead.' % (msg, exc.__name__)) return True
if __name__ == '__main__': import doctest doctest.testmod() def test(): with assert_throws(Exception): print(1/0) with assert_throws(ZeroDivisionError): print(1/0) with assert_throws(None): pass try: with assert_throws(ZeroDivisionError, TypeError, ValueError): pass except AssertionError: pass else: raise AssertionError('test failed.') print('Passed basic tests.') test()