如何在pytest中引发异常?

时间:2017-03-07 09:06:15

标签: python django pytest django-tests

我在views.py中编写了一段代码

def fun():
    try:
         --Do some operation--
    except OSError:
         --Do something else-- 

我编写了一个测试用例来涵盖代码的总功能。为了测试“except”部分,我编写了以下代码,它将引发“OSError”,

with pytest.raises(OSError):
    response = client.post(reverse('my_views_funurl'), follow=True)

但是,我收到此错误

response = client.post(reverse('my_views_funurl'), follow=True)
E           Failed: DID NOT RAISE

如何引发“OSError”以覆盖测试用例中的除外部分。 顺便说一句,我使用的是django-framework

1 个答案:

答案 0 :(得分:0)

最好的办法可能就是模拟方法来抛出你需要的异常,而不是经历实际创建OSError抛出的条件的所有麻烦。玩具示例:

from unittest.mock import Mock

def something():
    ...

something = Mock(side_effect=OSError('Your error text'))

>>> something()
>>> Traceback (most recent call first):
>>> ...
>>> OSError: Your error text

正如我所说,这只是一个玩具示例,因此对于您自己的具有不同结构的项目而言,您很可能需要一些不同的设置(根据您提供的信息,很难知道它的外观如何)。例如,如果您希望某个调用会在OSError内引发fun()异常,那么您需要在fun()所在的模块中模拟调用。好地方开始阅读嘲笑:

  1. Docks quick guide
  2. Patch documentation(特别关注'where to patch'部分)
  3. Useful in-depth example on stack-overflow。由于它比我的概念验证示例更复杂,它可能类似于您想要实现的目标。