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

Python 2.7和3.6之间的@patch行为不同(使用mock),python,python-3.x,python-2.7,mocking,patch,Python,Python 3.x,Python 2.7,Mocking,Patch,@patch在2.7和3.6下似乎不会产生相同的行为 以下是我的项目结构: project/ foo.py bar.py lol.py tests/ test_project.py foo.py: class Foo: pass bar.py(导入Foo): lol.py(导入条): 由于bar.py使用project.Foo import Foo中的导入Foo,我正在修补bar.Foo(根据文档): 测试_bar.py: from project i

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

以下是我的项目结构:

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

class Foo:
    pass
bar.py(导入Foo):

lol.py(导入条):

由于
bar.py
使用project.Foo import Foo中的
导入Foo,我正在修补
bar.Foo
(根据文档):

测试_bar.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()
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()
此设置在Python3.6中正确运行,但在2.7中失败(Foo没有得到修补)

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

测试_bar.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()
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\u test.bar.Foo')
获得一致的结果,并且它在2.7和3.6中都能工作。

在将
\uu init\uuuuuuuuuuupy
文件添加到
项目
目录时,我无法使用2.7和3.6复制差异,以及在
lol.py
中更改
条的导入:

from project.bar import Bar
在这两种情况下,您都不需要在测试中导入
bar
——mock负责通过解析传递给
mock
装饰器的字符串来查找
bar

我怀疑您看到的错误是由于Python3使用绝对导入()