Skip to content

Commit

Permalink
Merge pull request pytest-dev#4632 from AnjoMan/dont-rewrite-objects-…
Browse files Browse the repository at this point in the history
…with-failing-getattr

Assertion rewrite breaks for objects that reimplement `__getattr__`
  • Loading branch information
nicoddemus authored Jan 11, 2019
2 parents 5f16ff3 + 77da4f1 commit 3efb26a
Show file tree
Hide file tree
Showing 4 changed files with 30 additions and 1 deletion.
1 change: 1 addition & 0 deletions AUTHORS
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ Andy Freeland
Anthon van der Neut
Anthony Shaw
Anthony Sottile
Anton Lodder
Antony Lee
Armin Rigo
Aron Coyle
Expand Down
1 change: 1 addition & 0 deletions changelog/4631.bugfix.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Don't rewrite assertion when ``__getattr__`` is broken
8 changes: 7 additions & 1 deletion src/_pytest/assertion/rewrite.py
Original file line number Diff line number Diff line change
Expand Up @@ -525,7 +525,13 @@ def _format_assertmsg(obj):


def _should_repr_global_name(obj):
return not hasattr(obj, "__name__") and not callable(obj)
if callable(obj):
return False

try:
return not hasattr(obj, "__name__")
except Exception:
return True


def _format_boolop(explanations, is_or):
Expand Down
21 changes: 21 additions & 0 deletions testing/test_assertrewrite.py
Original file line number Diff line number Diff line change
Expand Up @@ -180,6 +180,27 @@ class X(object):

assert getmsg(f, {"cls": X}) == "assert cls == 42"

def test_dont_rewrite_if_hasattr_fails(self):
class Y(object):
""" A class whos getattr fails, but not with `AttributeError` """

def __getattr__(self, attribute_name):
raise KeyError()

def __repr__(self):
return "Y"

def __init__(self):
self.foo = 3

def f():
assert cls().foo == 2 # noqa

message = getmsg(f, {"cls": Y})
assert "assert 3 == 2" in message
assert "+ where 3 = Y.foo" in message
assert "+ where Y = cls()" in message

def test_assert_already_has_message(self):
def f():
assert False, "something bad!"
Expand Down

0 comments on commit 3efb26a

Please sign in to comment.