There's a couple of stack overflow posts out there talking about mocking the open call in Python.這很棒,但如果函數接受文件句柄或流對象而不是文件路徑,它並不能真正幫助我。嘲諷文件句柄
我一直使用到目前爲止的一種解決方案是cStringIO
對象。但是,我遇到了一個問題。
如果我想測試一下,如果我對某種失敗的登錄正確的文件名(比如如果文件/流是空的,你希望一些類型的數據)
cStringIO
fd = cStringIO("")
fd.name = "testing/path" # Throws an AttributeError
我可以」 t設置名稱屬性,因爲cStringIO
和StringIO
是時隙類。
如果切換到使用open_mock
with mock.patch('__main__.open', mock.mock_open(read_data=''), create=True) as m:
我碰上
AttributeError: Mock object has no attribute 'tell'
此時的感覺就像我不得不使用臨時文件,但我想,以避免實際呼喚文件系統如果可能的話。
如何測試接收文件句柄而不必在文件系統上創建實際文件的函數?
正常工作:http://pastebin.com/6QkKxdER,你能顯示測試下你的函數? – falsetru
啊,你明確地設置了'tell'屬性。這也適用於我。您應該將其作爲答案發布。我最終創建了自己的繼承自StringIO和對象的類。我認爲你的答案可能比我最終使用的答案更清晰。 – AlexLordThorsen