這是一些單元測試,我已經減少到一個重現問題的最小例子。爲什麼我的模擬對象不能識別任何呼叫?
import unittest
import zipfile
from unittest.mock import patch
"""My 'production' function"""
def list_txt_in_zipfile(zip_file_path):
with open(zip_file_path, "rb") as file:
zf = zipfile.ZipFile(file)
print("zipfile.ZipFile is", zipfile.ZipFile)
return [f_name for f_name in zf.namelist() if f_name.endswith(".txt")]
class UnzipperTest(unittest.TestCase):
"""My test method"""
@patch("__main__.zipfile.ZipFile")
def test_list_txt_in_zipfile(self, mock_ZipFile):
txt_list = list_txt_in_zipfile("my.txt.zip")
mock_ZipFile.assert_any_call() # AssertionError
print("mock_ZipFile is", mock_ZipFile)
if __name__ == '__main__':
unittest.main()
的Asse田:
AssertionError: ZipFile() call not found
當我的測試方法調用它記錄模擬對象,不是真正的zipfile.Zipfile
的list_txt_in_zipfile
(從Python的zipfile.py
)。
如果我在我的測試方法打印在我的生產函數和mock_ZipFile
那些「二」的對象zipfile.ZipFile
,它們是相同的對象:
zipfile.ZipFile is <MagicMock name='ZipFile' id='3069297420'>
mock_ZipFile is <MagicMock name='ZipFile' id='3069297420'>
爲什麼mock_ZipFile
無法斷言它的任何電話?
其實我已經成功地通過拆分成兩個功能(在open()
部分和zipfile.ZipFile()
其餘測試list_txt_in_zipfile
功能,但目前的情況是,這是不是一個巨大的功能,所以我想保持這片。在一個地方
更新邏輯的:在測試方法的my.txt.zip
確實存在,我沒有設法在unittest.mock.mock_open
帶給模擬出open()
,因爲我被困與嘲諷了zipfile.ZipFile
有效的點。實際上,我很難找到要在orignal assert_called_once_with中放置什麼,所以我錯誤地認爲assert_any_call是一個通過給定的參數列表的方法。 –
help()還說_「如果模擬已經被調用,assert會通過,不像 'assert_called_with'和'assert_called_once_with'只有在 這個調用是最近的時候纔會通過。」_ –
同樣,與第一句相結合,這意味着「永遠(具有特定的論點)」。如果你只是想聲明它已被調用,請使用'assert_called()' –