我在测试中从函数中引发异常时遇到问题:
### 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上找到了几个例子,但没有一个符合我的需要。
答案 0 :(得分:16)
我改变了
@patch('stdLib.StdObject', autospec=True)
到
@patch('stdLib.StdObject', **{'return_value.raiseError.side_effect': Exception()})
并删除了# <--- do not work
行。
现在正在工作。
This就是一个很好的例子。
编辑:
mockedObj.raiseError.side_effect = Mock(side_effect=Exception('Test'))
也有效。
答案 1 :(得分:4)
好的,你提供的答案是有效的,但你改变了你的方式(这很好。为了解决原来的问题,你需要为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(我相信)。