Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 为什么我的模拟对象不能识别对它的任何调用?_Python_Unit Testing_Patch_Python Decorators_Assertion - Fatal编程技术网

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 out
open()
因为我一直在模拟
zipfile.zipfile

assert\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
中,它现在就通过了。”。