2014-09-05 48 views
1

我有兩個文件:修補進口進口文件打開與模擬

#file1.py 
def_writefile(): 
    ... 
    fp = open('file') 
    fp.write('blah') 
    ... 


#file2.py 
file1.writefile() 

我試着修補開放不同的方式:

#test_file.py 
fn = mock.mock_open() 
with mock.patch('__builtin__.open', fn): 
    file1.writefile() 

with mock.patch('file1.open', fn): 
    file1.writefile() 

with mock.patch('file2.open', fn): 
    file1.writefile() 

with mock.patch('__main__.open', fn, create=True): 
    file1.writefile() 

assert(mock_file().write.called_once_with('blah')) 

但他們都不工作。使用模擬從內置模塊打開內置模塊的正確方法是什麼?

回答

1

你想這樣的:

import file1 

fn = mock.mock_open() 
with mock.patch('file1.open', fn, create=True): 
    file1.writefile() 

fn().write.assert_called_once_with('blah') 

您需要模擬將在file1.py使用的open功能,所以我們傳遞'file1.open' isntead的'__main__.open'。另一件你缺少的是,你沒有使用正確的功能來確保write被調用了正確的參數 - 你需要使用內置於Mock類中的assert_called_once_with函數。

create=True是必需的,因爲open功能不會在導入時file1類中找到,因爲open功能實際上不會被拉入模塊,直到運行時。通常這意味着mock將拋出異常,表示file1缺少該屬性。添加create=True使得mock創建時沒有找到它的屬性,是mentioned in the docs爲有用的這種情況:

這是對你的 生產代碼在運行時創建的屬性編寫測試有用