Python 为什么我的模拟对象不能识别对它的任何调用?
这里有一些单元测试,我已经简化为一个最小的例子,重现了这个问题Python 为什么我的模拟对象不能识别对它的任何调用?,python,unit-testing,patch,python-decorators,assertion,Python,Unit Testing,Patch,Python Decorators,Assertion,这里有一些单元测试,我已经简化为一个最小的例子,重现了这个问题 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)
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()
断言者错误:
AssertionError: ZipFile() call not found
当我的测试方法在zipfile中调用list\u txt\u时,它会记录一个模拟对象,而不是真正的zipfile.zipfile
(来自Python的zipfile.py
)
如果我在生产函数中打印这两个“对象”zipfile.zipfile
,在我的测试方法中打印这两个“对象”mock_zipfile
,它们是完全相同的对象:
zipfile.ZipFile is <MagicMock name='ZipFile' id='3069297420'>
mock_ZipFile is <MagicMock name='ZipFile' id='3069297420'>
zipfile.zipfile是
模拟ZipFile是
为什么mock_ZipFile
无法断言对它的任何调用
实际上,我已经成功地测试了zipfile
函数中的list\u txt\u,将其分为两个函数(open()
部分和zipfile.zipfile()
中的其余部分),但就目前而言,这并不是一个巨大的函数,因此我希望将这段逻辑保留在一个位置
更新:测试方法中的my.txt.zip
实际上存在,我还没有将unittest.mock.mock\u open
引入mock outopen()
因为我一直在模拟zipfile.zipfileassert\u任何调用
都会断言已使用指定参数调用了模拟对象。您不会在断言中传递任何参数,而是在函数本身中传递任何参数zipfile.zipfile()
是用一个参数,一个文件对象调用的。assert\u任何\u调用
都会断言用指定的参数调用了模拟对象。您不会在断言中传递任何参数,而是在函数本身zipfile.zipfile()中传递任何参数
是用一个参数,一个文件对象来调用的。有效点。实际上,我很难找到要将什么放入使用一次调用的原始assert中,因此我将assert\u any\u调用误认为是一个在没有特定参数列表的情况下传递的方法。help()还说“如果mock*ever*被调用,则assert将通过,而assert_使用
调用_,而assert_使用
调用_once_,仅当调用是最近的调用时才通过。”再次结合第一句,这意味着“ever”(使用指定的参数)“。如果您只想断言它已被调用,请使用assert_called()
再次感谢。我在unittest.mock.ANY
中加入了assert\u ANY\u调用
,它现在就通过了。有效点。实际上,我很难找到将什么放入原始assert\u调用过一次的方法中,所以我错误地将assert\u ANY\u调用看作是一个在没有特定参数列表的情况下通过的方法。help()还说“如果mock*ever*被调用,则assert将通过,而assert_使用
调用_,而assert_使用
调用_once_,仅当调用是最近的调用时才通过。”再次结合第一句,这意味着“ever”(使用指定的参数)“。如果您只想断言它已被调用,请使用assert\u called()
再次感谢您。我已将unittest.mock.ANY
插入assert\u ANY\u call
中,它现在就通过了。”。