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)
也有效.
好的,您提供的答案是有效的,但是您更改了方法(这很好。要解决您的原始问题,您需要将一个函数分配给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(我相信)。
归档时间: |
|
查看次数: |
36035 次 |
最近记录: |