2016-11-23 9 views
0

以下のpatch.specialmultipleのような方法を探しています。 同じMockオブジェクトインスタンスを持つ複数のファイルでopenメソッドをパッチしたいところです。デコレータとして使用する場合にもので、装飾された機能複数のファイルでopenメソッドを模倣する方法

に渡された唯一のモックオブジェクトは、あなたが__builtin__openにパッチを適用することができるはずモック

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

でこれを行う方法(そこにあるありますPython3.xの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> 

、これはそれにパッチを適用しますどこでも。この場合、特定のモジュールをホワイトリストに登録する方法はありません。

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() 
関連する問題