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

时间:2016-11-23 21:21:27

标签: python mocking

我正在寻找一种方法来执行下面的patch.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')]

2 个答案:

答案 0 :(得分:1)

没有直接的方法可以做你想做的事。最简单的方法是使用多行patch装饰器和mock_open来模拟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()

答案 1 :(得分:0)

您应该可以在open(python3.x上的__builtin__)模块上修补builtins

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

当然,这会将它无处不在。对于这种情况,没有办法将一组特定模块列入白名单......