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使用绝对导入()