在同一模块中使用unittest.mock的补丁,通过“__main__.imported_obj”修补时得到“没有该属性”

2024-03-02

我的任务本来应该很简单,但它却困扰了我一段时间。我在尝试着patch导入到当前模块中的对象。

根据答案Python 中的模拟修补 from/import 语句 https://stackoverflow.com/questions/11351382/mock-patching-from-import-statement-in-python

我应该能够patch("__main__.imported_obj")。但是,这对我不起作用。请参阅我下面的最小重现(我正在通过以下方式运行测试pytest):

最小重现

这是使用 Python 3.8.6 运行的。

from random import random
from unittest.mock import patch

import pytest

@pytest.fixture
def foo():
    with patch("__main__.random"):
        return

def test(foo) -> None:
    pass

当我使用 PyCharm 运行此代码时,我得到一个AttributeError:

AttributeError: <module '__main__' from '/Applications/PyCharm.app/Contents/plugins/python/helpers/pycharm/_jb_pytest_runner.py'> does not have the attribute 'random'

此外,当我在之前的行中进入调试器模式时with patch,我看到了属性__main__没有定义。我不确定是否需要定义它patch发挥其魔力。

注意:我知道我可以使用patch.object这变得容易多了。但是,我正在尝试弄清楚如何使用patch在这个问题中。

Research

即使使用文档中的示例,也无法模拟打开 https://stackoverflow.com/questions/39155048/unable-to-mock-open-even-when-using-the-example-from-the-documentation

这个问题是相关的,因为它是类似的错误消息和用例。他们的解决方案是使用builtins代替__main__,但那是因为他们试图patch一个内置函数(open).


您假设运行测试的模块是__main__,但只有通过调用时才会出现这种情况main。如果您正在使用,通常会出现这种情况unittest。使用 pytest,测试位于定义它们的模块中。

您必须修补当前模块,其名称可通过__name__,而不是假设特定的模块名称:

from random import random
from unittest.mock import patch

import pytest

@pytest.fixture
def foo():
    with patch(__name__ + ".random"):
        yield
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在同一模块中使用unittest.mock的补丁,通过“__main__.imported_obj”修补时得到“没有该属性” 的相关文章

随机推荐

  • 如何对齐SpriteBatch.DrawString绘制的文本?

    有没有一种简单的方法可以将文本向右和居中对齐 而不是默认的左对齐 我使用这段代码 Flags public enum Alignment Center 0 Left 1 Right 2 Top 4 Bottom 8 public void
  • C# double 未按预期工作[重复]

    这个问题在这里已经有答案了 我知道双精度数是小数 在下面的程序中 输出是 1 尽管我认为它会重复 1 05 static void Main string args double d 19 18 Console WriteLine d Co
  • 从结构数组中选择 Spark DataFrames 中的特定列

    我有一个 Spark 数据框df具有以下架构 root k integer nullable false v array nullable true element struct containsNull true a integer nu
  • 使用 VS Code 远程 Docker 容器网络挂起 5 秒

    我有 3 个服务 共享同一网络的 webapp app 数据库 db 和 redis rd 随机地 两个服务 数据库和 Redis 的连接都会挂起大约 5 秒 不仅当我运行连接到数据库的网络服务器时 甚至当我浏览网页上的链接时也是如此 有时
  • 如何在 git 中列出版本控制的文件?

    我想列出 git 存储库根目录中的版本控制文件 要在集市中执行相同的操作 您可以运行 bzr ls versioned non recursive 我如何在 git 中执行此操作 如果您准确描述要显示的列表 将会更有帮助 从 bzr 文档猜
  • SQL Server 查询处理器耗尽内部资源

    Query update mytable set mycol null where id in 583048 583049 50000 more Message 查询处理器耗尽了内部资源并且无法 生成查询计划 这是一个罕见的事件 仅预计 极
  • Kinesis lambda DynamoDB

    我正在学习 AWS 服务的一个用例 在浏览完文档后 我想出了一个简单的流程 我想使用 Streams API 和 KPL 将数据提取到 Kinesis 流中 我使用示例 putRecord 方法将数据提取到流中 我正在将此 JSON 摄取到
  • Windows Phone 8 cordova视口高度问题

    我们用 cordova 开发了一个 Windows Phone 8 应用程序 可以正常使用 但是在 windows Phone 8 之后8 0 10328 78释放页脚即可清理 我之前检查过代码 我得到的视口高度为 768 现在为 800
  • 自定义 Android 中的警报对话框

    我想在警报对话框的浅色背景上显示深色文本 但我不知道该怎么做 请帮我 Thanks 您可以在 XML 视图中创建自己的布局 就像创建活动一样
  • 具有相同标签的列的平均值

    我有两个向量 data vector A 1 2 2 1 2 6 2 3 2 3 3 5 label vector B 1 2 1 2 3 NaN 我想取具有相同标签的所有列的平均值 并将它们输出为按标签号排序的矩阵 忽略 NaN 所以 在
  • 从耶拿的文件中删除无效的 N-Quads

    我有一个包含 N Quads 的文件 使用 schema org 词汇表 我想使用 Apache Jena 的命令行工具将其加载到 TDB RDF 存储中 我正在使用的命令是 tdbloader loc
  • iOS 验证得到 Main_iPhone~iphone.storyboardc 未找到

    我正在尝试分发我的 iOS 应用程序 在 xCode 验证期间收到以下错误消息 未找到故事板文件 Main iPhone iphone storyboardc 请确保指定的文件包含在捆绑包中 并在文件名后附加任何所需的设备修饰符 需要一些建
  • 计算数据框中主题标签的频率

    我正在尝试计算数据框 文本 列中主题标签词的频率 index text 1 ello ello ello ello hello ello 2 red green blue black colours 3 Season greetings h
  • 如何使我的表单始终位于主表单之上?

    如何使我的非模态表单始终位于主表单之上 我努力了 procedure TForm3 CreateParams var Params TCreateParams begin inherited CreateParams Params Para
  • Prolog 中的选择排序

    我是 Prolog 的新手 我正在尝试进行选择排序 这是我所拥有的 ssort ssort M S L min M L remove M L N ssort S N min M M min M H T min N T min2 M H N
  • 如何在 Flutter App 上自动增加内部版本号?

    目前 每次我构建 APK 时 我都需要在 2 个位置手动更新我的构建版本 这看起来非常不自动化且违反直觉 我将其与 Jenkins BUILD ID 进行比较 我知道我必须 并且更喜欢这样 手动更新 semver 版本 0 2 0 但肯定有
  • iOS 上运行的问题

    我已经在 3 台不同的计算机上进行了尝试 但仍然存在相同的问题 导致我无法在 Mac 上运行该项目 当我使用 Windows 并连接到 Mac 来运行时 所有 3 台计算机上都显示相同的错误 显示的错误消息 无法解析参考 Library F
  • Visual Studio 2013 对项目中所有引用的黄色警告

    我有一个 C 项目 目标框架设置为 NET 4 5 由于某些奇怪的原因 所有引用都标有黄色警告三角形 如下所示 我尝试过卸载并重新加载该项目 我什至尝试手动重新添加系统引用之一 但无济于事 我收到的警告是 警告 13 无法找到引用的组件 A
  • Java 中的目录扫描器

    连续扫描一组目录以查找一组文件名过滤器 对于到达的每个文件名过滤器 处理该文件并对所有文件重复这些步骤 jdk 1 5 中推荐的设计是什么 可能使用 java concurrent Executor 和 Future 我已经用网络爬虫完成了
  • 在同一模块中使用unittest.mock的补丁,通过“__main__.imported_obj”修补时得到“没有该属性”

    我的任务本来应该很简单 但它却困扰了我一段时间 我在尝试着patch导入到当前模块中的对象 根据答案Python 中的模拟修补 from import 语句 https stackoverflow com questions 1135138