У меня есть функция, которая возвращает символы, используя метод re.escape()
. В эмпирических тестах это, кажется, работает, я хотел проверить это с pytest. Но я не смог заставить тесты работать, поэтому после нескольких попыток я попробовал что-то подобное:
def test_escape():
> assert re.escape('!') == "\\!"
E AssertionError: assert '!' == '\\!'
E - !
E + \!
test/test_e.py:6: AssertionError
Я также проверил это с переводчиком, который работает без проблем:
>>> re.escape('!') == '\\!'
True
отключение захвата вывода pytest с помощью "-s" и попытка напечатать вывод re.escape('!')
Я получаю "!"
, а не "\!"
, что не происходит в интерпретаторе.
Я попытался сделать monkeypatch re.escape, указав "\!"
в качестве вывода, и он волшебным образом работает. Это, очевидно, не решает мою проблему, но выдвигает на первый план некоторую неизвестную мне проблему с re.escape
@pytest.fixture
def mock_escape(monkeypatch):
monkeypatch.setattr(re, "escape", lambda x: "\\!")
def test_escape(mock_escape):
assert re.escape('!') == "\\!"
...
test/test_e.py .
======================================== 1 passed in 0.07s =========================================
all test passed
Просто для любопытства я сделал то же самое смоя оригинальная функция (без обезьяньей обработки, но редактирование возврата) и даже в этом случае она работает. Так что это не проблема, которая возникает из-за импорта.
# EDIT: # , как обнаружил tmt, это проблема с версией python или pytest. Проблема возникает с python 3.7.2 и pytest 5.2.1. Проблема НЕ возникает с python 3.6.3 и pytest 4.5.0 Так что это почти наверняка ошибка (на мой взгляд, легче всего pytest) Как ответит парень, это просто изменение поведения re. escape ()