簡體   English   中英

AttributeError:__ exit__當我試圖模擬構建函數時

[英]AttributeError: __exit__ when I try to mock out build in functions

我目前正在嘗試用Python模擬open()內置方法進行測試。 但是,我總是得到一個崩潰和這個結果消息:

   File "/opt/home/venv/lib/python2.7/site-packages/nose-1.3.0-py2.7.egg/nose/result.py", line 187, in _exc_info_to_string
return _TextTestResult._exc_info_to_string(self, err, test)
 File "/opt/python-2.7.3/lib/python2.7/unittest/result.py", line 164, in _exc_info_to_string
msgLines = traceback.format_exception(exctype, value, tb)
 File "/opt/python-2.7.3/lib/python2.7/traceback.py", line 141, in format_exception
list = list + format_tb(tb, limit)
 File "/opt/python-2.7.3/lib/python2.7/traceback.py", line 76, in format_tb
return format_list(extract_tb(tb, limit))
  File "/opt/python-2.7.3/lib/python2.7/traceback.py", line 101, in extract_tb
line = linecache.getline(filename, lineno, f.f_globals)
  File "/opt/home/venv/lib/python2.7/linecache.py", line 14, in getline
lines = getlines(filename, module_globals)
 File "/opt/home/venv/lib/python2.7/linecache.py", line 40, in getlines
return updatecache(filename, module_globals)
 File "/opt/home/venv/lib/python2.7/linecache.py", line 127, in updatecache
with open(fullname, 'rU') as fp:
AttributeError: __exit__

這是我的測試代碼:

m = mox.Mox()
m.StubOutWithMock(__builtin__, 'open')
mock_file = m.CreateMock(__builtin__.file)

open(mox.IgnoreArg(), mox.IgnoreArg()).AndReturn(mock_file)
mock_file.write(mox.IgnoreArg()).MultipleTimes()
mock_file.close()

write_file_method()

__exit__是嘗試關閉文件時調用的方法。 你的模擬文件不處理mock_file.close() ,只是open() 你也需要模擬close方法。


編輯:

關於第二個雖然,你為什么要嘲笑open AFAIK你不應該那樣做。 測試中的方法應采用開放流(例如,而不是文件名)。 在生產代碼中,客戶負責打開文件(例如pickle.dump )。 在測試中,傳入StringIO或支持寫入的模擬對象。


編輯2:我將你的方法分成兩部分並分別測試每一位。

  • 創建一個文件:在調用此方法之前檢查該文件是否存在,之后是否存在。 有人可能會說這種單線方法不值得測試。
  • 寫入文件:見上文。 創建一個StringIO並寫入,然后您的測試可以驗證是否已寫入正確的內容。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM