Skip to content

Commit

Permalink
Merge pull request #3373 from backbord/master
Browse files Browse the repository at this point in the history
Fix issue #3372
  • Loading branch information
nicoddemus authored Apr 7, 2018
2 parents 5d4fe87 + 5bd8561 commit e012dbe
Show file tree
Hide file tree
Showing 4 changed files with 23 additions and 1 deletion.
1 change: 1 addition & 0 deletions AUTHORS
Original file line number Diff line number Diff line change
Expand Up @@ -188,6 +188,7 @@ Tareq Alayan
Ted Xiao
Thomas Grainger
Thomas Hisch
Tim Strazny
Tom Dalton
Tom Viner
Trevor Bekolay
Expand Down
4 changes: 3 additions & 1 deletion _pytest/python_api.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
import sys

import py
from six import binary_type, text_type
from six.moves import zip, filterfalse
from more_itertools.more import always_iterable

Expand Down Expand Up @@ -584,7 +585,8 @@ def raises(expected_exception, *args, **kwargs):
"""
__tracebackhide__ = True
for exc in filterfalse(isclass, always_iterable(expected_exception)):
base_type = (type, text_type, binary_type)
for exc in filterfalse(isclass, always_iterable(expected_exception, base_type)):
msg = ("exceptions must be old-style classes or"
" derived from BaseException, not %s")
raise TypeError(msg % type(exc))
Expand Down
1 change: 1 addition & 0 deletions changelog/3372.bugfix.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
``pytest.raises`` now works with exception classes that look like iterables.
18 changes: 18 additions & 0 deletions testing/python/raises.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
from _pytest.outcomes import Failed
import pytest
import sys

Expand Down Expand Up @@ -147,3 +148,20 @@ def test_raises_match_wrong_type(self):
with pytest.raises(ValueError):
with pytest.raises(IndexError, match='nomatch'):
int('asdf')

def test_raises_exception_looks_iterable(self):
from six import add_metaclass

class Meta(type(object)):
def __getitem__(self, item):
return 1/0

def __len__(self):
return 1

@add_metaclass(Meta)
class ClassLooksIterableException(Exception):
pass

with pytest.raises(Failed, match="DID NOT RAISE <class 'raises.ClassLooksIterableException'>"):
pytest.raises(ClassLooksIterableException, lambda: None)

0 comments on commit e012dbe

Please sign in to comment.