比方說,我要測試的這款哦,所以,複變函數:嘲諷FTP在單元測試
def func(hostname, username, password):
ftp = FTP(hostname, username, password)
ftp.retrbinary('RETR README', open('README', 'wb').write)
一項測試是:
@patch('FTP')
def test_func_happy_path():
mock_ftp = Mock()
mock_ftp.retrbinary = Mock()
MockFTP.return_value = mock_ftp()
func('localhost', 'fred', 's3Kr3t')
assert mock_ftp.retrbinary.called
然而,這將創建一個本地文件稱爲README,我顯然不想要。
有沒有辦法模擬/修補open
這樣就不會創建文件?
顯然,作爲工作的時候,我可以確保該文件被寫入temporary directory,我可以作爲參數傳遞給func
或內func
和回報創造。
注意,使用裝飾@patch('__builtin__.open')
,以下預期上升:
self = <Mock name=u'open()' spec='FTP' id='51439824'>, name = 'write'
def __getattr__(self, name):
if name in ('_mock_methods', '_mock_unsafe'):
raise AttributeError(name)
elif self._mock_methods is not None:
if name not in self._mock_methods or name in _all_magics:
> raise AttributeError("Mock object has no attribute %r" % name)
AttributeError: Mock object has no attribute 'write'
我傳遞一個回調ftp.retrbinary
,而不是一個函數調用。
或者代替書寫到一個臨時目錄,你可以使用[StringIO的(https://docs.python.org/2/library/stringio.html)。避免寫入磁盤並將其全部保存在內存中。我認爲那是你的目標,對嗎? – idjaw
是的,我實際上指的是使用'StringIO'代替開放的測試。這樣你就避免了爲單元測試寫入磁盤。 – idjaw
我正在按我的方式查看您尋找的解決方案! :) *到編碼機器* ... – idjaw