Skip to content

Commit

Permalink
Improve type-checking in OutcomeException (#5580)
Browse files Browse the repository at this point in the history
Improve type-checking in OutcomeException
  • Loading branch information
nicoddemus committed Jul 9, 2019
2 parents 628ff4d + 9db1823 commit 57e5bd0
Show file tree
Hide file tree
Showing 4 changed files with 28 additions and 5 deletions.
3 changes: 3 additions & 0 deletions changelog/5578.bugfix.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
Improve type checking for some exception-raising functions (``pytest.xfail``, ``pytest.skip``, etc)
so they provide better error messages when users meant to use marks (for example ``@pytest.xfail``
instead of ``@pytest.mark.xfail``).
11 changes: 7 additions & 4 deletions src/_pytest/outcomes.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,16 +13,19 @@ class OutcomeException(BaseException):
"""

def __init__(self, msg=None, pytrace=True):
if msg is not None and not isinstance(msg, str):
error_msg = (
"{} expected string as 'msg' parameter, got '{}' instead.\n"
"Perhaps you meant to use a mark?"
)
raise TypeError(error_msg.format(type(self).__name__, type(msg).__name__))
BaseException.__init__(self, msg)
self.msg = msg
self.pytrace = pytrace

def __repr__(self):
if self.msg:
val = self.msg
if isinstance(val, bytes):
val = val.decode("UTF-8", errors="replace")
return val
return self.msg
return "<{} instance>".format(self.__class__.__name__)

__str__ = __repr__
Expand Down
16 changes: 16 additions & 0 deletions testing/test_runner.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
from _pytest import outcomes
from _pytest import reports
from _pytest import runner
from _pytest.outcomes import OutcomeException


class TestSetupState:
Expand Down Expand Up @@ -990,3 +991,18 @@ def test_func():
rep = reports[1]
assert rep.capstdout == ""
assert rep.capstderr == ""


def test_outcome_exception_bad_msg():
"""Check that OutcomeExceptions validate their input to prevent confusing errors (#5578)"""

def func():
pass

expected = (
"OutcomeException expected string as 'msg' parameter, got 'function' instead.\n"
"Perhaps you meant to use a mark?"
)
with pytest.raises(TypeError) as excinfo:
OutcomeException(func)
assert str(excinfo.value) == expected
3 changes: 2 additions & 1 deletion testing/test_skipping.py
Original file line number Diff line number Diff line change
Expand Up @@ -1066,7 +1066,8 @@ def test_module_level_skip_error(testdir):
testdir.makepyfile(
"""
import pytest
@pytest.skip
pytest.skip("skip_module_level")
def test_func():
assert True
"""
Expand Down

0 comments on commit 57e5bd0

Please sign in to comment.