Python,mock:引发异常

use*_*495 15 python unit-testing exception mocking

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

### 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
Run Code Online (Sandbox Code Playgroud)

我想raiseError()发挥作用以引发错误.

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

use*_*495 19

我变了

@patch('stdLib.StdObject', autospec=True)
Run Code Online (Sandbox Code Playgroud)

@patch('stdLib.StdObject', **{'return_value.raiseError.side_effect': Exception()})
Run Code Online (Sandbox Code Playgroud)

并删除了该# <--- do not work行.

它现在正在运作.

是一个很好的例子.

编辑:

mockedObj.raiseError.side_effect = Mock(side_effect=Exception('Test'))
Run Code Online (Sandbox Code Playgroud)

也有效.

  • @patch的参数传递给了Mock的构造函数,因此使用@patch('stdLib.StdObject',side_effect = Exception('Test'))`也是有效的,并且更短。 (3认同)
  • 对我来说这是工作:mockedObj.side_effect = Exception('Test') (2认同)
  • @luto 评论对我有用。修补 `mockedObj.raiseError.side_effect` 实际上并没有引发错误。 (2认同)

Jmo*_*ons 6

好的,您提供的答案是有效的,但是您更改了方法(这很好。要解决您的原始问题,您需要将一个函数分配给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
Run Code Online (Sandbox Code Playgroud)

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

  • 您不需要分配功能。那只是选项之一,但这并不是最好的选择。只需将异常分配给`side_effect`即可:`mockedObj.raiseError.side_effect = Exception(“ Test”)`。 (4认同)