Как мне обрабатывать символы регулярного выражения при выполнении .match () для исключения с помощью PyTest? - PullRequest
0 голосов
/ 16 октября 2019

У меня есть тест, который выглядит следующим образом:

@given(val=st.floats())
def test_validate_int_float(val):
    with pytest.raises(InvalidUsage) as ex:
        validate(val)
    print("{}|{}|{}".format(ex.value, f'Invalid value "{val}" for int param "n"',
                            ex.value == f'Invalid value "{val}" for int param "n"'))
    assert ex.match(f'Invalid value "{val}" for int param "n"')

Когда Гипотеза устанавливает val = 1e+16, я получаю ошибку.

E       AssertionError: Pattern 'Invalid value "1e+16" for int param "n"' not found in 'Invalid value "1e+16" for int param "n"'

Печатная продукция для этой ошибки:

Invalid value "1e+16" for int param "n"|Invalid value "1e+16" for int param "n"|True

Я считаю, что эта ошибка происходит из-за символа +.

Как правильно сопоставить сообщение об исключении, содержащее символ, используемый для определения регулярного выражения? В этом случае это не удалось на +, но у меня есть другие тесты, которые будут использовать круглые скобки, скобки и т. Д.

В документации говорится, что pytest использует re.search() за кулисамив .match().

1 Ответ

1 голос
/ 16 октября 2019

Но почему вы используете совпадение RE, когда равенство строк работает отлично?

assert ex.value == f'Invalid value "{val}" for int param "n"'

Если вам действительно нужно обрабатывать метасимволы RE, вы можете избежать их заранее:

s = f'Invalid value "{val}" for int param "n"'
for ch in r"()[]{}.?*+^$|\":
    s = s.replace(ch, "\\" + ch)
assert ex.match(s)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...