Импортирующая функция импортирована вверху файла - PullRequest
1 голос
/ 16 мая 2019

Я пытаюсь выполнить тест в проекте, и у меня странная ошибка.

Я воспроизвел очень похожую ситуацию с примером игрушки ниже:

Это структура файла:

.
├── some_package
│   ├── __init__.py
│   └── some_file.py
└── test_mock_patch.py
"""some_package/some_file.py"""

# when I import here, the test fails
from math import floor


def some_func(a, b):
    # if I import here, the test passes
    # from math import floor
    return floor(a + b)
"""test_mock_patch.py"""

import pytest
from unittest import mock
from some_package.some_file import some_func


@pytest.fixture
def mock_floor():
    with mock.patch('math.floor', autospec=True) as m:
        yield m


def test_some_func(mock_floor):
    some_func(1.1, 1)
    assert mock_floor.call_count == 1

Используемая команда: pytest -v -s test_mock_patch.py

Ошибка:

enter image description here

Почему, когда я импортирую внутри функции, test_some_func проходит, а когда я импортирую сверху, тест не пройден?

Заранее спасибо за любую помощь, чтобы объяснить это поведение mock.patch

Версия:

  • Python 3.7.3
  • pytest 4.4.1

1 Ответ

1 голос
/ 17 мая 2019

Вот минимальный пример того, как достичь желаемого результата, изменив файл test_mock_patch.py.

import pytest
from some_package.some_file import some_func


def test_some_func(monkeypatch):
    with monkeypatch.context() as mc:
        mc.setattr('some_package.some_file.floor', lambda x: 'foo')
        res = some_func(1.1, 1)
        assert res == 'foo'

Как я уже упоминал в комментариях, вам нужно исправить функцию, в которую она импортируется.

...