@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 (импорт Bar):
from bar import Bar
class Lol:
def __init__(self):
b = Bar()
Поскольку bar.py
импортирует Foo, используя from project.foo import Foo
, яисправления bar.Foo
(в соответствии с , где можно исправить документы):
test_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()
Эта установка работает правильно в Python 3.6, но не работает в 2.7 (Foo не исправляется).
Однако, если я переключу мои настройки на:
test_bar.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.