gpt4 book ai didi

Python - 模拟操作系统错误异常

转载 作者:太空宇宙 更新时间:2023-11-03 14:44:10 26 4
gpt4 key购买 nike

尝试使用 side_effect 模拟 Python 3.6 中的 PermissionError 异常。看起来我的函数被调用并引发了 EPERM 异常,但随后它无法运行我的 except 语句。对于“真正的”OSError 异常,相同的代码按预期运行。我的代码:

#my_module.py
import os
import errno
import sys
import inspect

def open_file(fname):
try:
with open('./' + fname, 'w') as f:
print('never get here')
return(0)

except PermissionError as e:
print('ERROR: \nIn function: ' + inspect.stack()[0][3])
print('On line: {}'.format(sys.exc_info()[-1].tb_lineno), type(e).__name__, e)
sys.exit(1)

我的测试:

#OpenFileMockTestCase.py
from unittest import TestCase
from unittest import mock
import errno
import my_module

class OpenFileMockTestCase(TestCase):

@mock.patch('my_module.os.open')
def test_2_open_file_mock_oserror(self, mock_oserror):
with self.assertRaises(SystemExit):
mock_oserror.my_module.open_file.side_effect = (OSError((errno.EPERM), 'Not Allowed'))
print('starting open_file with testfile2.txt...')
mock_oserror.my_module.open_file('testfile2.txt')

当我运行时:

C:\Users\mylib>coverage3 run -m unittest OpenFileMockTestCase.py -v
test_2_open_file_mock_oserror (OpenFileMockTestCase.OpenFileMockTestCase) ... starting open_file with testfile2.txt...

ERROR

======================================================================
ERROR: test_2_open_file_mock_oserror (OpenFileMockTestCase.OpenFileMockTestCase)
----------------------------------------------------------------------
Traceback (most recent call last):
File "c:\users\xti027\appdata\local\programs\python\python36\lib\unittest\mock.py", line 1179, in patched
return func(*args, **keywargs)
File "C:\Users\xti027\Documents\DataTool-Git\DataTool\DataLoaderConfig\OpenFileMockTestCase.py", line 14, in test_2_open_file_mock_oserror
mock_oserror.my_module.open_file('testfile2.txt')
File "c:\users\xti027\appdata\local\programs\python\python36\lib\unittest\mock.py", line 939, in __call__
return _mock_self._mock_call(*args, **kwargs)
File "c:\users\xti027\appdata\local\programs\python\python36\lib\unittest\mock.py", line 995, in _mock_call
raise effect
PermissionError: [Errno 1] Not Allowed

----------------------------------------------------------------------
Ran 1 test in 0.031s

FAILED (errors=1)

我已经阅读了几个关于异常和 mock 的问题和回复,例如 How do I write a unit test for OSError?并查看了Python文档:https://docs.python.org/3.6/library/unittest.mock.html#module-unittest.mock我是否在正确的地方 mock 了正确的项目?

最佳答案

您只需引发 PermissionError 异常即可:

mock_oserror.side_effect = PermissionError

请注意,我们直接在模拟的 open() 调用上设置副作用!我还会模拟被测模块中的全局 open() 名称,而不是 os.open

您还应该直接调用被测函数,而不是作为 mock_oserror 对象的属性:

import my_module

# ....

@mock.patch('my_module.open')
def test_2_open_file_mock_oserror(self, mock_open):
mock_open.side_effect = PermissionError
print('starting open_file with testfile2.txt...')
with self.assertRaises(SystemExit):
my_module.open_file('testfile2.txt')

我在这里使用了名称mock_open,因为它可以更好地反射(reflect)正在模拟的内容。

演示:

>>> import os
>>> import errno
>>> import sys
>>> import inspect
>>> from unittest import mock
>>> def open_file(fname):
... try:
... with open('./' + fname, 'w') as f:
... print('never get here')
... return(0)
... except PermissionError as e:
... print('ERROR: \nIn function: ' + inspect.stack()[0][3])
... print('On line: {}'.format(sys.exc_info()[-1].tb_lineno), type(e).__name__, e)
... sys.exit(1)
...
>>> with mock.patch('__main__.open') as mock_oserror:
... mock_oserror.side_effect = PermissionError
... try:
... open_file('testfile2.txt')
... except SystemExit:
... print('test passed, sys.exit() called')
...
ERROR:
In function: open_file
On line: 3 PermissionError
test passed, sys.exit() called

关于Python - 模拟操作系统错误异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46380866/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com