gpt4 book ai didi

python - Python 2.7 和 3.6 之间的不同 @patch 行为(使用 mock)

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

@patch 在 2.7 和 3.6 下似乎不会产生相同的行为。

这是我的项目结构:

project/
foo.py
bar.py
lol.py
tests/
test_project.py

foo.py:

class Foo:
pass

bar.py(导入 Foo):

from project.foo import Foo

class Bar:
def __init__(self):
f = Foo()

lol.py(进口吧):

from bar import Bar

class Lol:
def __init__(self):
b = Bar()

由于 bar.py 使用 from project.foo import Foo 导入 Foo,我正在修补 bar.Foo(根据 where to patch文档):

测试栏.py:

from project import lol
from project import bar

@patch('bar.Foo') # Works in 3.6, fails with 2.7
def test_lol(mock_Foo):
l = lol.Lol()
mock_Foo.assert_called()

此设置在 Python 3.6 中运行正常,但在 2.7 中失败(Foo 未修补)。

但是,如果我将设置切换为:

测试栏.py:

from project import lol
# from project import bar # No need to import bar anymore

@patch('project.bar.Foo') # Works in 2.7, fails with 3.6
def test_lol(mock_Foo):
l = lol.Lol()
mock_Foo.assert_called()

它在 2.7 中有效,但在 3.6 中失败。

使用 @patch 以使其在 python 版本之间产生一致的结果的推荐方法是什么?

注意:这个问题只有在我测试lol.py时才会出现。如果我从单元测试中调用 bar.py,我会使用第二个设置 @patch('cookie_test.bar.Foo') 得到一致的结果,它在 2.7 和3.6.

最佳答案

在将 __init__.py 文件添加到您的 project 目录并更改 Bar 的导入后,我无法使用 2.7 与 3.6 复制差异在 lol.py 中:

from project.bar import Bar

无论哪种情况,您都不需要在测试中导入 bar - mock 负责通过解析传递给 mock 的字符串来查找 bar 装饰器。

我怀疑您看到的错误是由于 Python 3 使用绝对导入 (https://www.python.org/dev/peps/pep-0328/)

关于python - Python 2.7 和 3.6 之间的不同 @patch 行为(使用 mock),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53404113/

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