Неожиданный результат: pytest.raises () с параметром сопоставления при подтверждении TypeError из-за неправильного вызова функции - PullRequest
2 голосов
/ 04 мая 2019

Пожалуйста, проверьте здравомыслие!

Я пытаюсь понять непредвиденный сбой теста, когда включаю точное сообщение, возвращенное из-за неправильного вызова функции, в параметр match pytest.raises().

Состояние документов :

match - если указано, утверждает, что исключение соответствует тексту или регулярное выражение

Последовательность инструкций в репле, приведенном ниже, в значительной степени говорит само за себя, но по какой-то причине последний тест не пройден.

PS C:\Users\peter_000\OneDrive\git\test> pipenv run python
Loading .env environment variables…
Python 3.6.4 (v3.6.4:d48eceb, Dec 19 2017, 06:54:40) [MSC v.1900 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>>
>>>
>>>
>>> import pytest
>>> pytest.__version__
'4.4.1'
>>>
>>> with pytest.raises(TypeError, match='a string'):
...     raise TypeError('a string')  # passes
...
>>> def func():
...     pass
...
>>> func(None)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: func() takes 0 positional arguments but 1 was given
>>>
>>>
>>> with pytest.raises(TypeError, match='func() takes 0 positional arguments but 1 was given'):
...     func(None)  # fails
...
Traceback (most recent call last):
  File "<stdin>", line 2, in <module>
TypeError: func() takes 0 positional arguments but 1 was given

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "<stdin>", line 2, in <module>
  File "C:\Users\peter_000\.virtualenvs\test-_0Fb_hDQ\lib\site-packages\_pytest\python_api.py", line 735, in __exit__
    self.excinfo.match(self.match_expr)
  File "C:\Users\peter_000\.virtualenvs\test-_0Fb_hDQ\lib\site-packages\_pytest\_code\code.py", line 575, in match
    assert 0, "Pattern '{!s}' not found in '{!s}'".format(regexp, self.value)
AssertionError: Pattern 'func() takes 0 positional arguments but 1 was given' not found in 'func() takes 0 positional arguments but 1 was given'
>>>

Я думал, что, возможно, '()' может означать что-то в регулярном выражении, что приведет к тому, что строки не будут совпадать, но:

>>> with pytest.raises(TypeError, match='func()'):
...     raise TypeError('func()')

... проходит.

1 Ответ

4 голосов
/ 04 мая 2019

Соответствие принимает шаблон регулярного выражения , а некоторые символы, такие как (), являются специальными.Вам нужно избегать их:

>>> with pytest.raises(TypeError, match=r'func\(\) takes 0 positional arguments but 1 was given'):
... #                                   ^     ^^^^
...     func(None)  # succeeds
>>>

Причина, по которой раньше он терпел неудачу, заключается в том, что () в регулярном выражении соответствует пустой группе, и поэтому ваш шаблон соответствовал бы строке func takes 0 positional arguments but 1 was given.

Причина, по которой match='func()' проходит, заключается в том, что конкретное регулярное выражение ищет func в любом месте строки: за ним может следовать любой текст или предшествовать ему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...