Pytest Monkeypatch 不适用于导入的函数

2024-01-06

假设一个项目中有两个包:some_package and another_package.

# some_package/foo.py:
def bar():
    print('hello')
# another_package/function.py
from some_package.foo import bar

def call_bar():
    # ... code ...
    bar()
    # ... code ...

我想测试another_package.function.call_bar嘲笑some_package.foo.bar因为它有一些我想避免的网络 I/O。

这是一个测试:

# tests/test_bar.py
from another_package.function import call_bar

def test_bar(monkeypatch):
    monkeypatch.setattr('some_package.foo.bar', lambda: print('patched'))
    call_bar()
    assert True

令我惊讶的是它输出hello代替patched。我尝试调试这个东西,在测试中放置一个 IPDB 断点。当我手动导入时some_package.foo.bar断点后并调用bar() I get patched.

在我的真实项目中,情况更加有趣。如果我在项目根目录中调用 pytest 我的函数不会被修补,但是当我指定tests/test_bar.py作为一个论点-它有效。

据我了解,这与from some_package.foo import bar陈述。如果它在猴子补丁发生之前执行,那么补丁会失败。但在上面示例的压缩测试设置中,修补在这两种情况下都不起作用。

为什么在 IPDB REPL 中遇到断点后它还能工作?


While 罗尼的回答 https://stackoverflow.com/a/31746577/1953800它会迫使您更改应用程序代码。一般来说,您不应该为了测试而这样做。

相反,您可以显式修补第二个包中的对象。这在单元测试模块的文档 https://docs.python.org/dev/library/unittest.mock.html#where-to-patch.

monkeypatch.setattr('another_package.bar', lambda: print('patched'))
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Pytest Monkeypatch 不适用于导入的函数 的相关文章

随机推荐

  • 在休眠应用程序中设置字节码提供程序的问题

    我正在尝试添加 cglib 作为默认字节代码提供程序 我在用hibernate cfg xml文件来配置会话工厂
  • 应用程序在 Activity 中抛出 java.lang.StackOverflowError 异常

    我正在开发一款 Android 应用程序 在我的一项活动中 我使用 PullToRefreshListView 有时我得到java lang StackOverflowError 错误我的活动例外 我尝试修复它 我也在谷歌上搜索 但没有得到
  • 我如何发现我的delphi应用程序当前是否有模式窗口?

    我在 Delphi MDI 应用程序中运行了一个计时器 如果后台发生变化 我想用它弹出一条消息 但我不希望当应用程序在前台有模式对话框时弹出该消息 因为用户对此无能为力 那么我想知道如何检查我的应用程序中是否存在模式对话框 您可以尝试使用以
  • 如何克隆文件名中带有冒号的文件

    当我使用 msysgit 克隆存储库时 所有文件名中带有空格的文件都不会被删除 然后在状态中显示为已删除 文件名看起来像这样 styles ie 1 12 11 6 02 PM css所以它实际上可能是冒号或括号 如何获取这些文件以使我的本
  • Reactjs 淡入淡出 div 与内联样式

    我怎样才能添加一个fade in动画到 div fading in text div 仅使用内联样式 class Practise extends Component state show false componentDidMount s
  • 在张量流中解包(unstack)具有一个 None 维度的输入(占位符)

    我正在尝试将 LSTM 与具有不同时间步长 不同帧数 的输入一起使用 rnn static rnn 的输入应该是 tf 序列 不是 tf 所以 我应该将我的输入转换为序列 我尝试使用 tf unstack 和 tf split 但它们都需要
  • cocoapods activesupport冲突ios开发

    我尝试在 cocoapods 项目上报告此问题 但被指示在此处发布 我最近承担了一个工作项目 但我无法让以前的顾问设置在我的本地工作站上运行 然而 当我运行时 我能够成功安装 cocoapods gempod install它爆炸了 spe
  • Django modelform:是否可以内联添加相关模型?

    我真的希望这不是重复的 我找不到任何东西 但这可能意味着我不擅长搜索 我有一个 Django 应用程序 并且工作人员已经在使用管理应用程序来 嗯 管理目的 我还为特定模型创建了一个快速数据输入页面 基本上是通过在基本模板中放置模型表单来创建
  • 为什么“git describe”在我的干净 git 存储库副本上显示较旧的标签版本?

    一些背景 我目前有两个本地 git 存储库 它们指向相同的源 主项目 我有两个 git 存储库的原因是 我有一个干净的主副本 我可以在需要时使用 还有一个副本 我可以在沙箱中应用更改 提交等 这可能有点矫枉过正 但有一些优点对我个人来说 有
  • 模型更改时角度视图(DOM 元素)不会更新

    在最新稳定的 Chrome 中运行最新稳定版本的 Angular 我对位于 ng 控制器 A 的视图内的 DOM 元素进行了 ng click 但 DOM 元素本身的 ng controller 设置为another控制器 B ng cli
  • F# 记录的字段声明为私有时出现奇怪的可访问范围

    我刚刚注意到 当 F 记录的字段部分被声明为私有时 出现了相当违反直觉的行为 这与是否可以将记录的字段设为私有 或者将记录成员设置为私有 https stackoverflow com questions 12389308 is it po
  • iPhone 在 API 调用后重新启动

    我面临一个非常奇怪的问题 我的 iPhone 正在重新启动 此问题仅在特定场景下发生 第 1 步 我有一个同步过程 其中加载整个应用程序的数据 所以我基本上通过上传 4 5 个相机捕获的图像并同步应用程序数据来进行大量的 API 调用 第
  • Netbeans 7.4 for PHP 上的“不要直接访问超级全局 $_SERVER 数组”

    是的 类似的问题已发布并正确回答 Netbeans 7 4 for PHP 上警告 不要直接访问超全局 POST 数组 https stackoverflow com questions 19767894 warning do not ac
  • div外框

    我有一个关于 div 和框架的问题 当框架内有下拉列表时 按下下拉列表时 下拉列表将显示在框架外部 我有一个替代下拉列表 它几乎具有相同的属性 但我必须将元素彼此相邻显示 因此元素显示在 div 中 我的问题 有没有办法 当您按下替代下拉菜
  • 对颜色进行排序 (Objective-C)

    我正在做这样的事情 NSArray colors float divisor 3333 NSMutableArray retVal NSMutableArray array for float one 0 one lt 1 0f one d
  • 通过 Loader.loadBytes(byteArray) 加载图像

    我想问一件事 如果我创建 Loader 并通过 URL 请求加载外部图像 将会得到结果 loader content is Bitmap loader content bitmapData is BitmapData 但如果我使用 Load
  • 裸存储库中的 git ls-files

    我想访问一个裸git存储库 并且我想列出存储库中的所有文件 在普通的 git 存储库上 我可以通过运行轻松地做到这一点git ls files 输出示例 git ls files README md file1 js file2 js fi
  • 从本地计算机访问 GCP Memorystore

    在开发过程中从本地计算机访问 Memorystore 的最佳方式是什么 是否有类似 Cloud SQL Proxy 之类的东西可以用来设置隧道 您可以启动 Compute Engine 实例并使用端口转发连接到您的 Redis 计算机 例如
  • 泛型和约束多态性与子类型

    In this PDF 演示文稿 http research microsoft com en us um people simonpj papers haskell retrospective ECOOP July09 pdf关于 Has
  • Pytest Monkeypatch 不适用于导入的函数

    假设一个项目中有两个包 some package and another package some package foo py def bar print hello another package function py from so