Python 如何使mock.mock_打开并引发IOError?
我需要测试一个调用Python 如何使mock.mock_打开并引发IOError?,python,unit-testing,mocking,Python,Unit Testing,Mocking,我需要测试一个调用open的实例方法。在第一个测试用例中,我将mock.mock\u open设置为返回一个字符串,如预期的那样。这真是太棒了 但是,我还需要测试从这个函数抛出IOError的情况。如何使mock.mock\u打开引发任意异常 这是我目前的做法: @mock.patch.object(somemodule, 'generateDefaultKey') def test_load_privatekey(self, genkey) mo = mock.mock_open(re
open
的实例方法。在第一个测试用例中,我将mock.mock\u open
设置为返回一个字符串,如预期的那样。这真是太棒了
但是,我还需要测试从这个函数抛出IOError
的情况。如何使mock.mock\u打开
引发任意异常
这是我目前的做法:
@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\u open.side\u effect
:
mock.mock_open.side_effect = IOError
从:
这可以是调用mock时要调用的函数,也可以是要引发的异常(类或实例)
演示:
我发现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')
如何在
TestCase
函数中使用它?我编辑了我的答案,以显示我的最新尝试——也许你能发现我的错误@blz:patch()
上下文管理器返回一个模拟。我会更新的。非常感谢!我不熟悉mock,但一旦有人向您展示了它是如何完成的,它实际上非常简单=)每个Python版本都有一个如此虚拟的版本吗?@Simeon:只适用于2.7和3.3。值得注意的是,如果您只想抛出一个异常,那么就不需要mock\u open()
作为一个普通的模拟就可以了。在这种情况下,您可以将此的with patch
行(“builtins.open”)更改为模拟文件:
谢谢您的回答。
with mock.patch('__main__.open', mo, create=True) as mocked_open:
mocked_open.side_effect = IOError()
self.controller.loadPrivkey()
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')