Monkeypatch Pytest не работает на flask функция просмотра - PullRequest
0 голосов
/ 09 февраля 2020

Предположим, у нас есть следующая Flask функция просмотра для тестирования. В частности, мы хотим смоделировать create_foo() при записи в файловую систему.

# proj_root/some_project/views.py
from some_project import APP
from some_project.libraries.foo import create_foo

@APP.route('/run', methods=['POST']
def run():
    bar = create_foo()
    return 'Running'

Теперь мы хотим написать модульный тест для run() с вызовом create_foo(), чтобы избежать создания ненужных файлов. .

# proj_root/tests/test_views.py
from some_project import some_project

@pytest.fixture
def client():
    some_project.APP.config['TESTING'] = True
    with some_project.APP.test_client() as client:
        yield client

def test_run(client, monkeypatch):
    monkeypatch.setattr('some_project.libraries.foo.create_foo', lambda: None)
    response = client.post('/run')
    assert b'Running' in response.data

Кажется, что этот подход должен работать даже с именованным create_foo import. Все тесты пройдены, однако исходный код create_foo явно выполняется, поскольку новый файл в файловой системе создается при каждом запуске набора тестов. Что мне не хватает? Я подозреваю, что это как-то связано с именованным импортом, основанным на некоторых связанных вопросах, но я не уверен.

1 Ответ

1 голос
/ 09 февраля 2020

Хорошо, я действительно нашел ответ на этот вопрос вскоре после публикации. Правильный monkeypatch:

monkeypatch.setattr('some_project.views.create_foo', lambda: None)

Причина этого довольно хорошо объяснена здесь .

...