Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何使mock.mock_打开并引发IOError?_Python_Unit Testing_Mocking - Fatal编程技术网

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')