【问题标题】:How to raise an exception in pytest?如何在pytest中引发异常?
【发布时间】:2017-07-27 09:56:09
【问题描述】:

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

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

我已经编写了一个测试用例来涵盖代码的全部功能。为了测试“除外”部分,我编写了以下代码,它将引发“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

【问题讨论】:

标签: python django pytest django-tests


【解决方案1】:

最好的办法可能是模拟该方法以抛出您需要的异常,而不是经历所有实际创建条件的麻烦,在这些条件中将抛出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

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

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

【讨论】:

  • 我收到以下错误:with pytest.raises(OSError): > response = client.post(reverse('hard_delete_drive', kwargs = {'slug':doc.slug}),跟随=True) E 失败:DID NOT RAISE
  • 究竟应该用什么方法抛出你所期望的异常?是hard_delete_drive(),还是视图内的东西?它在哪个模块中?
  • hard_delete_drive()是views.py 中的一个函数,我使用try-except 方法来捕获错误。我在这个函数中捕获了OSErrorIOError。我想编写一个测试来覆盖OSErrorIOError 之下的行。为此,我使用with pytest.raises(IOError): 提出错误,但我得到DID NOT RAISE
  • hard_delete_drive() 中的哪些方法调用易受OSError/IOError 的影响?您很可能需要模拟它们。您能否编辑您的原始问题以包含它们,以便我可以尝试在我的机器上重现您想要实现的目标?
猜你喜欢
  • 2014-06-13
  • 1970-01-01
  • 2023-03-03
  • 1970-01-01
  • 2023-04-05
  • 1970-01-01
  • 2023-02-12
  • 2012-10-20
  • 1970-01-01
相关资源
最近更新 更多