2016-11-23 114 views
0

我正在尋找一種方式來執行類似於下面的patch.specialmultiple, 我想補丁的位置,說在多個文件中使用相同的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

做到這一點,你應該能夠在__builtin__補丁openbuiltins on python3.x)模塊。

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

當然,這將無處不在打補丁。沒有辦法白名單一組特定的模塊,這種情況下...

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