py.test assert может подняться, и если он поднимется, это будет __

Есть ли функциональность pytest, аналогичная pytest.raises, которая проходит, если блок вызывает указанное исключение, или вообще не вызывает? Что-то типа:

def test_encode_err(ulist):
    with pytest.maybe_raises_but_only(UnicodeEncodeError):  # <== ?
        assert encode_list(ulist, 'ascii') == map(lambda x:x.encode('ascii'), ulist)

Этот вопрос возник в следующей ситуации..

Функция для тестирования:

def encode_list(lst, enc):
    "Encode all unicode values in ``lst`` using ``enc``."
    return [(x.encode(enc) if isinstance(x, unicode) else x) for x in lst]

Пара простых тестов (фикстуры ниже):

def test_encode_err(ulist):
    with pytest.raises(UnicodeEncodeError):
        assert encode_list(ulist, 'ascii')

def test_encode_u8(ulist, u8list):
    assert encode_list(ulist, 'u8') == u8list

Светильники:

@pytest.fixture(
    scope='module',
    params=[
        u'blåbærsyltetøy',
        u'',                # <==== problem
    ]
)
def ustr(request):
    print 'testing with:', `request.param`
    return request.param

@pytest.fixture
def u8str(ustr):
    return ustr.encode('u8')

@pytest.fixture
def ulist(ustr):
    return [ustr, ustr]

@pytest.fixture
def u8list(u8str):
    return [u8str, u8str]

указанный <== problem является проблемой только для test_encode_err() (а не test_encode_u8()) и происходит, поскольку u''.encode('ascii') не вызывает UnicodeEncodeError (строки Unicode, которые не содержат символы выше кодовой точки 127, не будут вызываться).

Есть ли функция py.test, которая охватывает этот вариант использования?


person thebjorn    schedule 06.03.2017    source источник


Ответы (1)


Если вам все равно, когда возникнет исключение, просто напишите код как обычно, но поместите вокруг него блок try...except, чтобы игнорировать ошибку.

def test_encode_err(ulist):
    try:
        assert encode_list(ulist, 'ascii') == map(lambda x:x.encode('ascii'), ulist)
    except UnicodeDecodeError:
        pass

На самом деле, подумайте, стоит ли вам вообще писать тест, если вы не знаете, вызовет ли код исключение. Попробуйте еще немного зафиксировать данные и провести два теста, один из которых вызывает исключение, а другой — нет.

person Duncan    schedule 06.03.2017