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,确定字符串是否应转换为 Int 或 Float 2022-01-01
- 对多索引数据帧的列进行排序 2022-01-01
- Python 中是否有任何支持将长字符串转储为块文字或折叠块的 yaml 库? 2022-01-01
- 在 Python 中将货币解析为数字 2022-01-01
- 比较两个文本文件以找出差异并将它们输出到新的文本文件 2022-01-01
- Kivy 使用 opencv.调整图像大小 2022-01-01
- kivy 应用程序中的一个简单网页作为小部件 2022-01-01
- 在 Django Admin 中使用内联 OneToOneField 2022-01-01
- matplotlib 设置 yaxis 标签大小 2022-01-01
- 究竟什么是“容器"?在蟒蛇?(以及所有的 python 容器类型是什么?) 2022-01-01