Merge pull request #1616 from palaviv/pytest.raises-message
Pytest.raises custom error message
This commit is contained in:
		
						commit
						4f2db6c08d
					
				| 
						 | 
					@ -70,7 +70,9 @@
 | 
				
			||||||
* Add ``build/`` and ``dist/`` to the default ``--norecursedirs`` list. Thanks
 | 
					* Add ``build/`` and ``dist/`` to the default ``--norecursedirs`` list. Thanks
 | 
				
			||||||
  `@mikofski`_ for the report and `@tomviner`_ for the PR (`#1544`_).
 | 
					  `@mikofski`_ for the report and `@tomviner`_ for the PR (`#1544`_).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
*
 | 
					* pytest.raises in the context manager form accepts a custom
 | 
				
			||||||
 | 
					  message to raise when no exception occurred.
 | 
				
			||||||
 | 
					  Thanks `@palaviv`_ for the complete PR (`#1616`_).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
.. _@milliams: https://github.com/milliams
 | 
					.. _@milliams: https://github.com/milliams
 | 
				
			||||||
.. _@csaftoiu: https://github.com/csaftoiu
 | 
					.. _@csaftoiu: https://github.com/csaftoiu
 | 
				
			||||||
| 
						 | 
					@ -95,6 +97,7 @@
 | 
				
			||||||
.. _#1520: https://github.com/pytest-dev/pytest/pull/1520
 | 
					.. _#1520: https://github.com/pytest-dev/pytest/pull/1520
 | 
				
			||||||
.. _#372: https://github.com/pytest-dev/pytest/issues/372
 | 
					.. _#372: https://github.com/pytest-dev/pytest/issues/372
 | 
				
			||||||
.. _#1544: https://github.com/pytest-dev/pytest/issues/1544
 | 
					.. _#1544: https://github.com/pytest-dev/pytest/issues/1544
 | 
				
			||||||
 | 
					.. _#1616: https://github.com/pytest-dev/pytest/pull/1616
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
**Bug Fixes**
 | 
					**Bug Fixes**
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1337,6 +1337,16 @@ def raises(expected_exception, *args, **kwargs):
 | 
				
			||||||
        >>> with raises(ZeroDivisionError):
 | 
					        >>> with raises(ZeroDivisionError):
 | 
				
			||||||
        ...    1/0
 | 
					        ...    1/0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    .. versionchanged:: 2.10
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    In the context manager form you may use the keyword argument
 | 
				
			||||||
 | 
					    ``message`` to specify a custom failure message::
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        >>> with raises(ZeroDivisionError, message="Expecting ZeroDivisionError"):
 | 
				
			||||||
 | 
					        ...    pass
 | 
				
			||||||
 | 
					        ... Failed: Expecting ZeroDivisionError
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    .. note::
 | 
					    .. note::
 | 
				
			||||||
 | 
					
 | 
				
			||||||
       When using ``pytest.raises`` as a context manager, it's worthwhile to
 | 
					       When using ``pytest.raises`` as a context manager, it's worthwhile to
 | 
				
			||||||
| 
						 | 
					@ -1412,8 +1422,12 @@ def raises(expected_exception, *args, **kwargs):
 | 
				
			||||||
    elif not isclass(expected_exception):
 | 
					    elif not isclass(expected_exception):
 | 
				
			||||||
        raise TypeError(msg % type(expected_exception))
 | 
					        raise TypeError(msg % type(expected_exception))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    message = "DID NOT RAISE {0}".format(expected_exception)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if not args:
 | 
					    if not args:
 | 
				
			||||||
        return RaisesContext(expected_exception)
 | 
					        if "message" in kwargs:
 | 
				
			||||||
 | 
					            message = kwargs.pop("message")
 | 
				
			||||||
 | 
					        return RaisesContext(expected_exception, message)
 | 
				
			||||||
    elif isinstance(args[0], str):
 | 
					    elif isinstance(args[0], str):
 | 
				
			||||||
        code, = args
 | 
					        code, = args
 | 
				
			||||||
        assert isinstance(code, str)
 | 
					        assert isinstance(code, str)
 | 
				
			||||||
| 
						 | 
					@ -1434,11 +1448,12 @@ def raises(expected_exception, *args, **kwargs):
 | 
				
			||||||
            func(*args[1:], **kwargs)
 | 
					            func(*args[1:], **kwargs)
 | 
				
			||||||
        except expected_exception:
 | 
					        except expected_exception:
 | 
				
			||||||
            return _pytest._code.ExceptionInfo()
 | 
					            return _pytest._code.ExceptionInfo()
 | 
				
			||||||
    pytest.fail("DID NOT RAISE {0}".format(expected_exception))
 | 
					    pytest.fail(message)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class RaisesContext(object):
 | 
					class RaisesContext(object):
 | 
				
			||||||
    def __init__(self, expected_exception):
 | 
					    def __init__(self, expected_exception, message):
 | 
				
			||||||
        self.expected_exception = expected_exception
 | 
					        self.expected_exception = expected_exception
 | 
				
			||||||
 | 
					        self.message = message
 | 
				
			||||||
        self.excinfo = None
 | 
					        self.excinfo = None
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def __enter__(self):
 | 
					    def __enter__(self):
 | 
				
			||||||
| 
						 | 
					@ -1448,7 +1463,7 @@ class RaisesContext(object):
 | 
				
			||||||
    def __exit__(self, *tp):
 | 
					    def __exit__(self, *tp):
 | 
				
			||||||
        __tracebackhide__ = True
 | 
					        __tracebackhide__ = True
 | 
				
			||||||
        if tp[0] is None:
 | 
					        if tp[0] is None:
 | 
				
			||||||
            pytest.fail("DID NOT RAISE")
 | 
					            pytest.fail(self.message)
 | 
				
			||||||
        if sys.version_info < (2, 7):
 | 
					        if sys.version_info < (2, 7):
 | 
				
			||||||
            # py26: on __exit__() exc_value often does not contain the
 | 
					            # py26: on __exit__() exc_value often does not contain the
 | 
				
			||||||
            # exception value.
 | 
					            # exception value.
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -85,6 +85,15 @@ and if you need to have access to the actual exception info you may use::
 | 
				
			||||||
the actual exception raised.  The main attributes of interest are
 | 
					the actual exception raised.  The main attributes of interest are
 | 
				
			||||||
``.type``, ``.value`` and ``.traceback``.
 | 
					``.type``, ``.value`` and ``.traceback``.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.. versionchanged:: 2.10
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					In the context manager form you may use the keyword argument
 | 
				
			||||||
 | 
					``message`` to specify a custom failure message::
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					     >>> with raises(ZeroDivisionError, message="Expecting ZeroDivisionError"):
 | 
				
			||||||
 | 
					     ...    pass
 | 
				
			||||||
 | 
					     ... Failed: Expecting ZeroDivisionError
 | 
				
			||||||
 | 
					
 | 
				
			||||||
If you want to write test code that works on Python 2.4 as well,
 | 
					If you want to write test code that works on Python 2.4 as well,
 | 
				
			||||||
you may also use two other ways to test for an expected exception::
 | 
					you may also use two other ways to test for an expected exception::
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -76,3 +76,23 @@ class TestRaises:
 | 
				
			||||||
            pytest.raises(ValueError, int, '0')
 | 
					            pytest.raises(ValueError, int, '0')
 | 
				
			||||||
        except pytest.raises.Exception as e:
 | 
					        except pytest.raises.Exception as e:
 | 
				
			||||||
            assert e.msg == "DID NOT RAISE {0}".format(repr(ValueError))
 | 
					            assert e.msg == "DID NOT RAISE {0}".format(repr(ValueError))
 | 
				
			||||||
 | 
					        else:
 | 
				
			||||||
 | 
					            assert False, "Expected pytest.raises.Exception"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        try:
 | 
				
			||||||
 | 
					            with pytest.raises(ValueError):
 | 
				
			||||||
 | 
					                pass
 | 
				
			||||||
 | 
					        except pytest.raises.Exception as e:
 | 
				
			||||||
 | 
					            assert e.msg == "DID NOT RAISE {0}".format(repr(ValueError))
 | 
				
			||||||
 | 
					        else:
 | 
				
			||||||
 | 
					            assert False, "Expected pytest.raises.Exception"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def test_costum_raise_message(self):
 | 
				
			||||||
 | 
					        message = "TEST_MESSAGE"
 | 
				
			||||||
 | 
					        try:
 | 
				
			||||||
 | 
					            with pytest.raises(ValueError, message=message):
 | 
				
			||||||
 | 
					                pass
 | 
				
			||||||
 | 
					        except pytest.raises.Exception as e:
 | 
				
			||||||
 | 
					            assert e.msg == message
 | 
				
			||||||
 | 
					        else:
 | 
				
			||||||
 | 
					            assert False, "Expected pytest.raises.Exception"
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue