这是一些单元测试,我已经减少到一个重现问题的最小例子。为什么我的模拟对象不能识别任何呼叫?
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()' –