Различное поведение @patch между Python 2.7 и 3.6 (используя макет) - PullRequest
0 голосов
/ 21 ноября 2018

@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.

1 Ответ

0 голосов
/ 21 ноября 2018

Я не могу воспроизвести разницу, используя 2,7 против 3,6 после добавления файлов __init__.py в каталог project и изменения импорта Bar в lol.py:

from project.bar import Bar

В любом случае, вам не нужно импортировать bar в вашем тесте - mock позаботится о поиске bar путем анализа строки, переданной декоратору mock.

Я подозреваю, что ошибка, которую вы видите, связана с тем, что Python 3 использует абсолютный импорт (https://www.python.org/dev/peps/pep-0328/)

...