关于单元测试:python,mock:引发异常

Python, mock: raise exception

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
### 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()函数来产生一个错误。

我找到了几个这样的例子,但没有一个符合我的需要。


我变了

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

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

拆下# <--- do not work线。

现在开始工作了。

这是一个很好的例子。

编辑:

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

也可以工作。


好吧,你提供的答案是有效的,但是你改变了你的做法(没关系)。要解决原始问题,需要将函数指定给副作用,而不是结果或对象:

1
2
3
4
5
6
7
8
9
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(我相信)。