如何python模拟修补多个文件中的open方法

2024-10-04 11:35:31 发布

您现在位置:Python中文网/ 问答频道 /正文

我在找一种方法补丁程序.specialmultiple在下面, 在我想要修补的地方,比如在多个文件中使用同一个Mock对象实例的open方法。同样,当用作装饰器时,只有模拟对象传递给装饰函数

有没有办法用mock做到这一点

file1.py
---------
def hello():
    open('test.data').read()

file2.py
--------
def world():
    open('test2.data').read()

file3.py
--------
mopen = mock.MagicMock(create=True)
@patch.specialmultiple(['file1.open', 'file2.open'], new=mopen)
def test_case1(mopen):
    open.side_effect = [OSError('not found'), OSError('Noy found')]

Tags: 对象方法pytestreaddatadef装饰
2条回答

没有直接的方法去做你想做的事。最简单的方法是使用多行patchdecorator和{a1}来模拟open

m = mock.MagicMock(side_effect=OSError('not found'))    
mopen = mock.mock_open(m)

@mock.patch('file1.open', mopen, create=True)
@mock.patch('file2.open', mopen, create=True)
def test_case():
    with self.assertRaises(OSError):
        hello1()

    mopen.side_effect = IOError('er')
    with self.assertRaises(IOError):
        hello2()

您应该能够在__builtin__(python3.x上的builtins)模块上修补open。在

>>> import __builtin__
>>> import mock
>>> p = mock.patch.object(__builtin__, 'open')
>>> p.start()
<MagicMock name='open' id='4331984720'>
>>> open
<MagicMock name='open' id='4331984720'>
>>> p.stop()
>>> open
<built-in function open>

当然,这将修补所有。对于这种情况,没有一种方法可以白名单一组特定的模块。。。在

相关问题 更多 >