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-m http.server 443--使用SSL? 2022-01-01
- padding='same' 转换为 PyTorch padding=# 2022-01-01
- 如何在 Python 的元组列表中对每个元组中的第一个值求和? 2022-01-01
- python check_output 失败,退出状态为 1,但 Popen 适用于相同的命令 2022-01-01
- 如何在 python3 中将 OrderedDict 转换为常规字典 2022-01-01
- 分析异常:路径不存在:dbfs:/databricks/python/lib/python3.7/site-packages/sampleFolder/data; 2022-01-01
- 沿轴计算直方图 2022-01-01
- pytorch 中的自适应池是如何工作的? 2022-07-12
- 如何将一个类的函数分成多个文件? 2022-01-01
- 使用Heroku上托管的Selenium登录Instagram时,找不到元素';用户名'; 2022-01-01