Pytest monkeypatch isn#39;t working on imported function(Pytest monkeypatch不适用于导入的函数)
本文介绍了Pytest monkeypatch不适用于导入的函数的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
假设项目中有两个包:some_package
和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()
时,我得到patched
。
在我的实际项目中,情况更加有趣。如果我在项目根目录中调用pytest,我的函数不会打补丁,但是当我指定tests/test_bar.py
作为参数时-它可以工作。
据我了解,它与from some_package.foo import bar
语句有关。如果它是在monkeypatching发生之前执行的,则修补失败。但是,在上面示例中的精简测试设置上,打补丁不能在两种情况下都起作用。
为什么它在命中断点后在IPDB REPL中工作?
推荐答案
命名导入为对象创建新名称。如果然后替换对象的旧名称,则新名称不受影响。
导入模块并改用module.bar
。它将始终使用当前对象。
编辑:
import module
def func_under_test():
module.foo()
def test_func():
monkeypatch.setattr(...)
func_under_test
这篇关于Pytest monkeypatch不适用于导入的函数的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
沃梦达教程
本文标题为:Pytest monkeypatch不适用于导入的函数
基础教程推荐
猜你喜欢
- Python 的 List 是如何实现的? 2022-01-01
- 使用 Google App Engine (Python) 将文件上传到 Google Cloud Storage 2022-01-01
- 如何在Python中绘制多元函数? 2022-01-01
- 合并具有多索引的两个数据帧 2022-01-01
- 症状类型错误:无法确定关系的真值 2022-01-01
- 将 YAML 文件转换为 python dict 2022-01-01
- 使 Python 脚本在 Windows 上运行而不指定“.py";延期 2022-01-01
- 使用Python匹配Stata加权xtil命令的确定方法? 2022-01-01
- 如何在 Python 中检测文件是否为二进制(非文本)文 2022-01-01
- 哪些 Python 包提供独立的事件系统? 2022-01-01