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 |
我想用
我找到了几个这样的例子,但没有一个符合我的需要。
我变了
1 | @patch('stdLib.StdObject', autospec=True) |
到
1 | @patch('stdLib.StdObject', **{'return_value.raiseError.side_effect': Exception()}) |
拆下
现在开始工作了。
这是一个很好的例子。
编辑:
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(我相信)。