gpt4 book ai didi

python - pytest - monkeypatch 关键字参数默认

转载 作者:太空宇宙 更新时间:2023-11-03 11:38:58 24 4
gpt4 key购买 nike

我想测试一个函数的默认行为。我有以下内容:

# app/foo.py
DEFAULT_VALUE = 'hello'

def bar(text=DEFAULT_VALUE):
print(text)
# test/test_app.py
import app

def test_app(monkeypatch):
monkeypatch.setattr('app.foo.DEFAULT_VALUE', 'patched')
app.foo.bar()
assert 0

输出是hello;不是我想要的。

一种解决方案是显式传递默认值:app.foo.bar(text=app.foo.DEFAULT_VALUE)

但我发现有趣的是,当默认为全局范围时,这似乎不是问题:

# app/foo.py
DEFAULT_VALUE = 'hello'

def bar():
print(DEFAULT_VALUE)

输出被修补

为什么会这样?还有比显式传递默认值更好的解决方案吗?

最佳答案

函数默认值在函数定义时绑定(bind)。

当您在测试代码中时,定义该函数的模块已经被导入,通过在模块级常量上进行猴子修补来换掉默认值已经太晚了。该名称已被解析。

解决方法是像这样定义函数:

def bar(text=None):
if text is None:
text = DEFAULT_VALUE
print(text)

现在在函数调用时查找默认值,这意味着模块级别默认的猴子补丁仍然有效。

如果你不喜欢修改函数定义,那么你可以对函数对象本身进行monkeypatch:

monkeypatch.setattr("app.foo.bar.__defaults__", ("test_hello",))

关于python - pytest - monkeypatch 关键字参数默认,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53822102/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com