首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么我的模拟对象不识别对它的任何调用?

为什么我的模拟对象不识别对它的任何调用?
EN

Stack Overflow用户
提问于 2017-05-04 20:18:37
回答 1查看 1.8K关注 0票数 0

下面是一些单元测试,我将其简化为一个再现问题的最小示例。

代码语言:javascript
运行
复制
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:

代码语言:javascript
运行
复制
AssertionError: ZipFile() call not found

当我的测试方法调用list_txt_in_zipfile时,它会记录一个模拟对象,而不是真正的zipfile.Zipfile (来自Python的zipfile.py)。

如果我在生产函数中打印“两个”对象zipfile.ZipFile,在测试方法中打印mock_ZipFile,它们是完全相同的对象:

代码语言:javascript
运行
复制
zipfile.ZipFile is <MagicMock name='ZipFile' id='3069297420'>
mock_ZipFile is <MagicMock name='ZipFile' id='3069297420'>

为什么mock_ZipFile不能断言对它的任何调用?

实际上,我已经成功地测试了list_txt_in_zipfile函数,将它分成两个函数( open()部分和zipfile.ZipFile()中的其余部分),但是现在看来,这不是一个巨大的函数,所以我想把这个逻辑放在一个地方。

更新:测试方法中的my.txt.zip实际上是存在的,我没有设法引入unittest.mock.mock_open来模拟open(),因为我一直在模仿zipfile.ZipFile

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-05-04 20:33:47

assert_any_call断言已用指定的参数调用了模拟对象。断言中没有传递任何参数,但是在函数本身中,zipfile.Zipfile()是用一个参数(一个文件对象)调用的。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43792106

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档