【问题标题】:Python, mock: raise exception [closed]Python,模拟:引发异常[关闭]
【发布时间】:2017-04-05 19:11:37
【问题描述】:

我在测试中遇到从函数引发异常的问题:

### Implemetation
def MethodToTest():
    myVar = StdObject()
    try:
        myVar.raiseError() # <--- here
        return True
    except Exception as e:
        # ... code to test
        return False

### Test file
@patch('stdLib.StdObject', autospec=True)
def test_MethodeToTest(self, mockedObjectConstructor):
    mockedObj = mockedObjectConstructor.return_value
    mockedObj.raiseError.side_effect = Exception('Test') # <--- do not work
    ret = MethodToTest()
    assert ret is False

我想raiseError() 函数来引发错误。

我在 SO 上找到了几个示例,但没有一个符合我的需要。

【问题讨论】:

  • 也许这可以帮助你stackoverflow.com/questions/2052390/…
  • 您确定在正确的位置进行修补(导入位置,而不是导入 from 的位置)?
  • 认为我在正确的位置进行了修补,因为我的其他测试按预期工作。
  • side_effect() 支持引发异常。也许你修补了错误的对象。

标签: python unit-testing exception mocking


【解决方案1】:

我变了

@patch('stdLib.StdObject', autospec=True)

@patch('stdLib.StdObject', **{'return_value.raiseError.side_effect': Exception()})

并删除了# &lt;--- do not work 行。

它现在可以工作了。

This 就是一个很好的例子。

编辑:

mockedObj.raiseError.side_effect = Mock(side_effect=Exception('Test'))

也可以。

【讨论】:

  • 这对我有用:mockedObj.side_effect = Exception('Test')
  • @patch 的参数被传递给Mock 的构造函数,因此使用@patch('stdLib.StdObject', side_effect=Exception('Test')) 也可以,而且更短。
【解决方案2】:

好的,您提供的答案是有效的,但是您更改了执行方式(这很好。要解决您的原始问题,您需要将函数分配给 side_effect,而不是结果或对象:

def my_side_effect():
    raise Exception("Test")

@patch('stdLib.StdObject', autospec=True)
def test_MethodeToTest(self, mockedObjectConstructor):
    mockedObj = mockedObjectConstructor.return_value
    mockedObj.raiseError.side_effect = my_side_effect # <- note no brackets, 
    ret = MethodToTest()
    assert ret is False

希望对您有所帮助。注意,如果目标方法采用 args,副作用也需要采用 args(我相信)。

【讨论】:

  • 你不需要分配函数;这只是其中一种选择,但在这里并不是最好的。只需将异常分配给side_effectmockedObj.raiseError.side_effect = Exception("Test")
  • 你不必拒绝:他的编辑有第三种方法,他正在制作带有副作用集的 Mock,但它仍然是有效的,知道如何做是件好事在测试中做。这样做没有错,尤其是因为它可以让您稍后扩展测试?
  • OP 是否编辑了他们的问题?看起来他们已经分配给side_effect,来自@MartijnPieters 的建议看起来与他们评论“不工作”的行完全一样。
  • 我认为问题没有被编辑。我认为当时(请记住,这是 2016 年 11 月,现在是 2018 年 11 月),我对 side_effect 的理解是它被称为函数 - 这不是真的,你应该能够做类似 @987654325 的事情@,鉴于 OP 给出了一个完全不同的答案,然后他们接受了,我想知道是否还有其他未粘贴的代码错误。如果我没记错的话,我将这段代码复制到了一个 shell 脚本中并进行了测试,并且在我修补它以使用函数之前也看到它“不起作用”。但那是两年前的事了!现在每天都是一个更好的 Python 程序员
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-07
  • 2021-04-12
  • 2023-03-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-08
相关资源
最近更新 更多