是否存在类似于pytest.raises
的pytest功能,如果块引发指定的异常,或根本不会引发?类似的东西:
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
(没有不包含代码点127上方字符的unicode字符串将会引发)。
是否有覆盖此用例的py.test函数?
答案 0 :(得分:3)
如果您不关心何时抛出异常,只需正常编写代码,但在其周围放置一个try...except
块以忽略错误。
def test_encode_err(ulist):
try:
assert encode_list(ulist, 'ascii') == map(lambda x:x.encode('ascii'), ulist)
except UnicodeDecodeError:
pass
如果您不知道代码是否会抛出异常,请考虑是否应该编写测试。尝试将数据固定一点并进行两次测试,一次提出异常,一次不提出。