我正在寻找一种方法来执行下面的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')]
答案 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>
当然,这会将它无处不在。对于这种情况,没有办法将一组特定模块列入白名单......