2016-07-19 29 views
3

我試圖模仿文件開開,所有的例子表明,我需要模擬文件在python

@patch('open', create=True) 

,但我不斷收到

Need a valid target to patch. You supplied: 'open' 

我知道補丁需要完整虛線路徑open,但我不知道它是什麼。事實上,我甚至不確定這是什麼問題。

+1

1.你發佈的內容,我們不能告訴你路徑應該是什麼,或者如果這是問題。給一個[mcve]。 2.你知道這裏有['mock_open'](https://docs.python.org/3/library/unittest.mock.html#mock-open)嗎? – jonrsharpe

回答

9

您需要包含模塊名稱;如果你是在一個測試腳本,該模塊的名稱爲__main__

@patch('__main__.open') 

以其他方式使用含有要測試的代碼模塊的名稱:

@patch('module_under_test.open') 

使任何代碼使用內置的open()反而會找到打補丁的全局。

注意,mock模塊配備了一個mock_open() utility那會讓你建立一個適合open()調用與文件數據:

@patch('__main__.open', mock_open(read_data='foo\nbar\nbaz\n')) 
+0

進一步的問題:可以使用這種模擬(具有指定的return_value)作爲上下文管理器(在'with'語句中)? – 0xc0de

+0

@ 0xc0de:是的,我鏈接到的文檔包含'open()'與'with'語句一起使用的示例,並且正在使用'mock_open()'修補。 –

+0

是的,我在稍後詢問後纔看到它。謝謝。 – 0xc0de

1

在Python 3,你應該使用:

@mock.patch("builtins.open", create=True)