使用pytest.raises测试由try / except块捕获的错误时,由于未引发该错误而失败。
如果我使用dict查找进行简单测试,并且不进行尝试/例外,则pytest.raises测试通过。但是,如果使用try / except,则测试将失败。
这是有效的方法:
def lookup_value(key):
lookup = {'A': 1, 'B': 2}
return lookup[key]
def test_lookup():
with pytest.raises(KeyError):
lookup_value('C')
现在添加try / except:
def lookup_value(key):
lookup = {'A': 1, 'B': 2}
try:
return lookup[key]
except KeyError as err:
print(err)
def test_lookup():
with pytest.raises(KeyError):
lookup_value('C')
第一个代码段,通过测试。
第二个片段,我得到“失败:未提高<class 'KeyError'
>”
答案 0 :(得分:1)
此处的代码吞没了异常(在不传播异常发生的事实的情况下捕获了异常)。
try:
return lookup[key]
except KeyError as err:
print(err)
您只需要重新引发异常,以便pytest.raises
可以看到
try:
return lookup[key]
except KeyError as err:
print(err)
raise
此外,在函数的末尾省略return
语句(通常会在另一个代码路径中返回内容)通常是一种不好的做法。在Python中有一个隐含的return None
,但为什么不通过显式编写来帮助读者一些帮助。