From 3444d35c540c635401f92db724d004e2a7d20920 Mon Sep 17 00:00:00 2001 From: Babak Keyvani Date: Sat, 30 Apr 2022 17:56:36 -0600 Subject: [PATCH] improve `pytest.raises` --- AUTHORS | 1 + changelog/8646.improvments.rst | 2 ++ src/_pytest/python_api.py | 7 +++++++ testing/python/raises.py | 4 ++++ 4 files changed, 14 insertions(+) create mode 100644 changelog/8646.improvments.rst diff --git a/AUTHORS b/AUTHORS index 1a8c5306f..86a814a13 100644 --- a/AUTHORS +++ b/AUTHORS @@ -44,6 +44,7 @@ Aron Coyle Aron Curzon Aviral Verma Aviv Palivoda +Babak Keyvani Barney Gale Ben Gartner Ben Webb diff --git a/changelog/8646.improvments.rst b/changelog/8646.improvments.rst new file mode 100644 index 000000000..9691c1434 --- /dev/null +++ b/changelog/8646.improvments.rst @@ -0,0 +1,2 @@ +Improve :py:func:`pytest.raises`. Previously passing an empty tuple would give a confusing +error. We now raise immediately with a more helpful message. diff --git a/src/_pytest/python_api.py b/src/_pytest/python_api.py index 5fa219619..410877c88 100644 --- a/src/_pytest/python_api.py +++ b/src/_pytest/python_api.py @@ -899,6 +899,13 @@ def raises( """ __tracebackhide__ = True + if expected_exception == (): + raise ValueError( + "Passing expected_exception=() is an error, because it's impossible to " + "raise an exception which is not an instance of any type. Raising exceptions " + "is already understood as failing the test, so you don't need any special " + "code to say 'this should never raise an exception'." + ) if isinstance(expected_exception, type): excepted_exceptions: Tuple[Type[E], ...] = (expected_exception,) else: diff --git a/testing/python/raises.py b/testing/python/raises.py index 112dec06c..e1680623a 100644 --- a/testing/python/raises.py +++ b/testing/python/raises.py @@ -19,6 +19,10 @@ class TestRaises: excinfo = pytest.raises(ValueError, int, "hello") assert "invalid literal" in str(excinfo.value) + def test_raises_does_not_allow_empty_tuple(self): + with pytest.raises(ValueError): + pytest.raises(expected_exception=()) + def test_raises_callable_no_exception(self) -> None: class A: def __call__(self):