[英]How can I make mock.mock_open raise an IOError?
我需要测试一个调用open
的实例方法。 在第一个测试用例中,我将mock.mock_open
设置为返回一个字符串,如预期的那样。 这非常有效。
但是,我还需要测试从该函数抛出IOError
的情况。 我如何使mock.mock_open
引发任意异常?
到目前为止这是我的方法:
@mock.patch.object(somemodule, 'generateDefaultKey')
def test_load_privatekey(self, genkey)
mo = mock.mock_open(read_data=self.key)
mo.side_effect = IOError
with mock.patch('__main__.open', mo, create=True):
self.controller.loadPrivkey()
self.assertTrue(genkey.called, 'Key failed to regenerate')
将异常分配给mock.mock_open.side_effect
:
mock.mock_open.side_effect = IOError
这可以是调用mock时要调用的函数,也可以是要引发的异常(类或实例)。
演示:
>>> mock = MagicMock()
>>> mock.mock_open.side_effect = IOError()
>>> mock.mock_open()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/Users/mj/Development/venvs/stackoverflow-2.7/lib/python2.7/site-packages/mock.py", line 955, in __call__
return _mock_self._mock_call(*args, **kwargs)
File "/Users/mj/Development/venvs/stackoverflow-2.7/lib/python2.7/site-packages/mock.py", line 1010, in _mock_call
raise effect
IOError
使用patch()
作为上下文管理器时,会生成一个新的模拟对象; 分配给该模拟对象:
with mock.patch('__main__.open', mo, create=True) as mocked_open:
mocked_open.side_effect = IOError()
self.controller.loadPrivkey()
我发现Martijn的答案有点难以概括,所以我希望这是一个更简单的答案,与OPs初始代码相关联:
from unittest.mock import patch, mock_open
def func_to_test():
try:
with open('path/to/open', 'r') as file:
return 1
except IOError:
return 2
def test_open_error():
with patch("builtins.open", mock_open()) as mock_file:
mock_file.side_effect = IOError()
assert func_to_test() == 2
mock_file.assert_called_with('path/to/open', 'r')
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.